packages feed

ivor (empty) → 0.1.5

raw patch · 108 files changed

+45845/−0 lines, 108 filesdep +basedep +directorydep +mtlsetup-changed

Dependencies added: base, directory, mtl, parsec, plugins

Files

+ BUGS view
@@ -0,0 +1,27 @@+* Pattern matching RHS doesn't deal with bindings properly (if there+  are names bound on the RHS, anything could happen...)+* Higher order recursive datatypes do not have induction hypothesis+  generated for the higher order arguments.+* Non-termination if trying to parse an expression with no closing bracket.+* Tactics should know what level they operate at; currently we need to+  allow escapes at the top level in the typechecker as a hack, and+  trust people to get it right.+* intro should check that the name it is introducing is not the name of+  another goal, or we get confused.+* Resuming an incomplete proof (e.g. created by suspend or axiomatise)+  resumes it in the current global context, not the context at the+  point when it was suspended. So if you're sneaky, you can make a+  non-terminating definition this way.+  Workaround: Please don't do that.+* Refine tactic adds as many claims as possible, rather than adding+  claims for one argument at a time then attempting to unify.+  Workaround: Use intros before refining. You might then need to solve+  some of the arguments explicitly.+* No check for strict positivity.+  Workaround: Don't use non positive types :).++Recently fixed:++* If a datatype has a placeholder in its indices, the value should+  be inferred (i.e. it should be checked) otherwise we can't make a pattern+  properly (and we'll certainly need this for optimisation).
+ INSTALL view
@@ -0,0 +1,14 @@+Requirements:+   GHC version >= 6.4, +   happy++To build and install:++1. Edit the DB and PREFIX variables in the Makefile; DB should be+   --user to install for a single user, or --global to install for all+   users. PREFIX should point to the installation directory.+2. Enter the following:+   make+   make install+3. [optional] To build and install the driver/shell, enter the following:+   make jones_install
+ IOvor/IOPrims.lhs view
@@ -0,0 +1,69 @@+> module IOPrims where++> import System.IO+> import System.IO.Unsafe+> import Data.Typeable+> import Debug.Trace++> import Ivor.Primitives+> import Ivor.TT++IO primitives; adds 'RealWorld' and 'Handle'++RealWorld is a dummy type representing the world state, Handle (from +System.IO) gives file handles.++> data RealWorld = RW ()+>    deriving Eq++> instance Show RealWorld where+>     show _ = "<<World>>"++> rwName = name "RealWorld"++> instance Typeable RealWorld where+>     typeOf (RW ()) = mkTyConApp (mkTyCon "RW") []++> instance ViewConst RealWorld where+>     typeof x = rwName++> instance ViewConst Handle where+>     typeof x = (name "Handle")++> addIOPrimTypes :: Monad m => Context -> m Context+> addIOPrimTypes c = do c <- addPrimitives c+>                       c <- addPrimitive c rwName+>                       c <- addPrimitive c (name "Handle")+>                       c <- addExternalFn c (name "initWorld") 1 initWorld+>                              "True -> RealWorld"+>                       return c++> addIOPrimFns :: Monad m => Context -> m Context+> addIOPrimFns c = do c <- addBinFn c (name "putStr") doPutStr+>                             "String -> (IO True)"+>                     c <- addPrimFn c (name "getLine") doGetLine+>                             "(IO String)"+>                     return c++Make an instance of IOResult from the result of an IO action and a +value++> mkIO :: () -> ViewTerm -> ViewTerm+> mkIO t v = case (t,v) of -- make sure they get evaluated+>               (tr,val) -> apply (Name DataCon (name "ioResult"))+>                             [Placeholder, Constant (RW tr), val]++> trueVal = Name DataCon (name "II")++> {-# NOINLINE doPutStr #-}+> doPutStr :: String -> RealWorld -> ViewTerm+> doPutStr str w = mkIO () trueVal -- (unsafePerformIO (putStr str)) trueVal++> {-# NOINLINE doGetLine #-}+> doGetLine :: RealWorld -> ViewTerm+> doGetLine w = mkIO () (Constant "foo") -- (unsafePerformIO getLine))++Needs a dummy argument so that evaluator doesn't loop++> initWorld :: [ViewTerm] -> ViewTerm+> initWorld [_] = Constant (RW ())
+ IOvor/Main.lhs view
@@ -0,0 +1,25 @@+> module Main where++Jones the Steam, with IO primitives.+Simple program for starting up an interactive shell with Ivor library.++> import Ivor.TT+> import Ivor.Shell+> import Ivor.Primitives++> import IOPrims++> main :: IO ()+> main = do let shell = addModulePath (newShell emptyContext) +>                          (prefix ++ "/lib/ivor")+>           shell <- importFile "basics.tt" shell+>           primCtxt <- addIOPrimTypes (getContext shell)+>           let shell' = addModulePath (newShell primCtxt) +>                          (prefix ++ "/lib/ivor")+>           shell' <- importFile "iobasics.tt" shell'+>           primFnCtxt <- addIOPrimFns (getContext shell')+>           -- It is horrible to have to do this every time. Fix the API!+>           let shell'' = addModulePath (newShell primFnCtxt) +>                          (prefix ++ "/lib/ivor")+>           ctxt <- runShell "> " (extendParser shell'' parsePrimitives)+>           putStrLn "Finished"
+ IOvor/iobasics.tt view
@@ -0,0 +1,6 @@+Data IOResult (A:*) :*  where+   ioResult : (world:RealWorld)(a:A)(IOResult A);++IO = [A:*](RealWorld -> (IOResult A));++world = initWorld II;
+ Ivor/Bytecode.lhs view
@@ -0,0 +1,166 @@+> module Ivor.Bytecode where++Compilation of supercombinators to bytecode++> import Ivor.SC+> import Ivor.TTCore++> type Arity = Int+> type Tag = Int+> type TmpVar = Int++> type Bytecode = [ByteOp]++> data ByteOp+>     = STARTFN SCName Arity -- Needed?+>     | DECLARE Int+>     | TMP Int+>     | RETURN TmpVar+>     | CALL TmpVar SCName [TmpVar]+>     | CON TmpVar Tag [TmpVar]+>     | CLOSURE TmpVar SCName [TmpVar]+>     | VAR TmpVar Int+>     | GETARG TmpVar Int TmpVar+>     | CLOSUREADD TmpVar TmpVar [TmpVar]+>     | EVAL Int+>     | EVALTMP TmpVar+>     | TYPE TmpVar+>     | TAILCALL SCName [TmpVar]+>     | ALET Int TmpVar+>     | CASE Int [Bytecode]+>  deriving Show++> data FunInfo+>     = FI {+>         bytecode :: Bytecode,+>         cname :: String,+>         ctag :: String,+>         farity :: Int,+>         ctagid :: Int+>       }+>   deriving Show++> type ByteDef = [(SCName,FunInfo)]++I wonder how generally useful this is...++> mapInc :: (Int->a->b) -> [a] -> Int -> [b]+> mapInc f [] i = []+> mapInc f (x:xs) i = (f i x):(mapInc f xs (i+1))++> compileAll :: SCs -> SCs -> ByteDef+> compileAll ctxt group = mapInc scomp group ((length ctxt)-(length group))+>    where scomp i (n,(a,sc)) = (n,FI (adddecls a (scompile n ctxt sc))+>		                      (mkcname n)+>		                      (mkctag n)+>			              a+>			              i)+>          mkcname (N n) = "_EVM_"++show n+>          mkcname (SN n i) = "_EVMSC_"++show i++"_"++show n+>          mkctag  (N n) = "FTAG_EVM_"++show n+>          mkctag  (SN n i) = "FTAG_EVMSC_"++show i++"_"++show n++> scompile :: SCName -> SCs -> SC -> Bytecode+> scompile name scs (SLam args body) =+>    (STARTFN name (length args)):(bcomp (length args) 0 body)+>   where+>      getarity n = case lookup n scs of+>		       (Just (a,d)) -> a+>	               Nothing -> error $ "Can't happen (scompile, name "++show n++", " ++ show (map fst scs)++ ")"+>      bcomp v t (SCase scr alts) = +>         (EVAL scr):+>         [CASE scr (map (acomp v t) alts)]+>      bcomp v t (SApp (SP n) as) +>             | getarity n == length as = +>	          concat (mapInc (ecomp v) as (t+1))+>		     ++ [TAILCALL n (mktargs (length as) (t+1))]+>      bcomp v t x = (ecomp v t x)++[RETURN t]++>      mktargs 0 s = []+>      mktargs n s = s:(mktargs (n-1) (s+1))++>      acomp v t x = bcomp v t x -- Hmm. Well, maybe alts will get more complex++>      ecomp :: Int -> TmpVar -> SCBody -> Bytecode+>      ecomp v t (SP n) | getarity n == 0 = [CALL t n []]+>		        | otherwise = [CLOSURE t n []]+>   --   ecomp v (SElim n) | getarity n == 0 = CALL n []+>   --		         | otherwise = CLOSURE n []+>      ecomp v t (SV i) = [VAR t i]+>      ecomp v t (SCon tag n as) +>	          = concat (mapInc (ecomp v) as (t+1))+>		     ++ [CON t tag (mktargs (length as) (t+1))]++>      ecomp v t (SApp f as) = fcomp v t f as+>      ecomp v t (SLet val ty b) = +>                (ecomp v (t+1) val) +++>	         (ALET v (t+1)):+>	         (ecomp (v+1) (t+2) b)+>      ecomp v t (SProj i b) = (ecomp v (t+1) b) +++>		       [GETARG  t i (t+1)]+>      ecomp v t (SPi e ty) = [TYPE t]+>      ecomp v t SStar = [TYPE t]+>      ecomp v t (SConst c) = error "Can't compile constants yet"+>      ecomp v t _ = [TYPE t]++>      fcomp v t (SP n) as +>          | getarity n == length as+>               = concat (mapInc (ecomp v) as (t+1))+>                   ++ [CALL t n (mktargs (length as) (t+1))]+>          | otherwise +>               = concat (mapInc (ecomp v) as (t+1))+>                   ++ [CLOSURE t n (mktargs (length as) (t+1))]++>      fcomp v t f as +>	          = (ecomp v (t+1) f) +++>	             concat (mapInc (ecomp v) as (t+2))+>		     ++ [CLOSUREADD t (t+1) (mktargs (length as) (t+2))]++>      -- ccomp Star t = [TYPE t]++Add type declarations to the top of bytecode, for the benefit of C/C--.++> adddecls :: Int -> Bytecode -> Bytecode+> adddecls arity bc = let (tmps,vars) = fd (-1,-1) bc in+>                         ad (tmps+1) (vars+1) ++ bc+>   where ad 0 n | n<=arity = []+>         ad 0 n = (DECLARE (n-1)):(ad 0 (n-1))+>         ad m n = (TMP (m-1)):(ad (m-1) n)++>         fd (t,v) [] = (t,v)+>         fd (t,v) (c:cs) = let (t',v') = fd' (t,v) c in+>				fd (t',v') cs++>         fd' (t,v) (RETURN rt) | rt>t = (rt,v)+>			        | otherwise = (t,v)+>         fd' (t,v) (CALL tv _ _)+>               | tv > t = (tv,v)+>		| otherwise = (t,v)	    +>         fd' (t,v) (CON tv _ _)+>               | tv > t = (tv,v)+>		| otherwise = (t,v)	    +>         fd' (t,v) (CLOSURE tv _ _)+>               | tv > t = (tv,v)+>		| otherwise = (t,v)	    +>         fd' (t,v) (CLOSUREADD tv _ _)+>               | tv > t = (tv,v)+>		| otherwise = (t,v)	    +>         fd' (t,v) (VAR tv _)+>               | tv > t = (tv,v)+>		| otherwise = (t,v)	    +>         fd' (t,v) (GETARG tv _ _)+>               | tv > t = (tv,v)+>		| otherwise = (t,v)	    +>         fd' (t,v) (TYPE tv)+>               | tv > t = (tv,v)+>		| otherwise = (t,v)	    +>         fd' (t,v) (ALET vv _)+>               | vv > v = (t,vv)+>	        | otherwise = (t,v)+>	  fd' (t,v) (CASE _ bs) = fdcs (t,v) bs+>         fd' ts _ = ts++>         fdcs (t,v) [] = (t,v)+>	  fdcs (t,v) (c:cs) = let (t',v') = fd (t,v) c in+>				  fdcs (t',v') cs+
+ Ivor/CodegenC.lhs view
@@ -0,0 +1,161 @@+> module Ivor.CodegenC where++Spit out C. I think this is write-only code...++> import Ivor.Bytecode+> import Ivor.SC++Some useful gadgets++> getTag :: ByteDef -> SCName -> String+> getTag scs n = case lookup n scs of+>		    Just (FI _ _ tag _ _) -> tag+>	            Nothing -> error "Can't happen (getTag)"++> getCName :: ByteDef -> SCName -> String+> getCName scs n = case lookup n scs of+>		      Just (FI _ cname _ _ _) -> cname+>	              Nothing -> error "Can't happen (getTag)"++Make the module's eval function, which checks the function tag on the+closure it is passed, and runs the appropriate function.++> mkEval :: ByteDef -> String+> mkEval scs = evalHead ++ "\n" ++ concat (map (mke'.snd) scs) ++ evalTail+>   where+>     evalHead = "VAL eval(VAL x) {" +++>                "\n    if (x->ty != FUN) return x;" +++>                "\n    else {" +++>	         "\n        function* f = (function*)(x -> info);" +++>	         "\n        switch(f->ftag) {"+>     evalTail = "        }" +++>	         "\n    }" +++>		 "\n    return x;" +++>		 "\n}\n"++>     mke' (FI _ name tag arity _) = "            EVALCASE("++tag++","+++>			             show arity ++ "," ++ name ++ "("+>				     ++ showargs arity ++ "));\n"+>     showargs 0 = ""+>     showargs 1 = "FARG(0)"+>     showargs n = showargs (n-1) ++ "," ++ "FARG("++show (n-1)++")"++Make the header, including definitions of all the function tags and+function prototypes.++> mkHeaders :: ByteDef -> String+> mkHeaders scs = fileHeader ++ concat (map (mkh'.snd) scs)+>   where fileHeader = "#include \"closure.h\"\n"+++>	               "#include <stdio.h>\n\n"++>         mkh' (FI _ name tag arity tagid) =+>            "#define "++ tag ++ " " ++ show tagid ++"\n" +++>	     "VAL "++ name ++ "(" ++ showargs arity ++");\n"+>	  showargs 0 = ""+>         showargs 1 = "VAL v0"+>         showargs n = showargs (n-1) ++ "," ++ "VAL v"++show (n-1)++Output C code for each supercombinator.++> mkCode :: ByteDef -> String+> mkCode scs = concat (map (mhc'.snd) scs)+>   where mhc' (FI bc name _ arity _) = +>            let code = writeCode scs bc in+>	     "VAL "++ name ++ "(" ++ showargs arity ++") {\n"+>	      ++ "\n" ++ code ++ "}\n\n"++>         declaretmps 0 = "VAL tmp0;"+>         declaretmps n = declaretmps (n-1) ++ "\nVAL tmp" ++ show n ++";"+>	  showargs 0 = ""+>         showargs 1 = "VAL v0"+>         showargs n = showargs (n-1) ++ "," ++ "VAL v"++show (n-1)+++> writeCode :: ByteDef -> Bytecode -> String+> writeCode scs [] = ""+> writeCode scs (c:cs) = "    " ++ wc c ++ "\n" ++ writeCode scs cs+>   where wc (STARTFN _ _) = "VAL* args;"+>         wc (DECLARE i) = "VAL v"++show i++";"+>         wc (TMP i) = "VAL tmp"++show i++";"+>         wc (RETURN i) = "return tmp"++show i++";"+>	  wc (CALL t n vs) = "tmp"++show t++ " = "++ getCName scs n +++>		             "(" ++ showargs vs ++ ");"+>         wc (CON t tag as) +>             | length as == 0 =+>		 "tmp"++show t++ " = MKCON0("++show tag++");"+>             | length as < 2 =+>		 "tmp"++show t++ " = MKCON"++show (length as)+++>		      "("++show tag++"," ++ showargs as++");"+>	      | otherwise = "args = MKARGS(" ++ show (length as) ++ +>		    ");\n    " ++ mkargs as 0 ++ "tmp"++show t++ +>		    " = MKCONN("++show tag ++",args,"++show (length as)++");"+>         wc (CLOSURE t n as) +>             | length as == 0 = +>	              "tmp"++show t++ " = CLOSURE0("+++>		      getTag scs n++","++show (length as)++");"+>             | length as < 6 = +>	              "tmp"++show t++ " = CLOSURE"++show (length as)+++>		      "("++getTag scs n++","++show (length as)++","++showargs as++");"+>	      | otherwise = "args = MKARGS(" ++ show (length as) ++ +>		      ");\n    " ++ mkargs as 0 ++ "tmp"++show t+++>		    " = CLOSUREN("++getTag scs n ++","++show (length as)++",args,"++ +>		    show (length as)++");"+>	  wc (VAR t i) = "tmp"++show t++" = v" ++ show i ++ ";"+>         wc (GETARG t i v) = "tmp"++show t++" = GETCONARG(tmp"++show v++","+>		              ++show i++");"+>         wc (CLOSUREADD t tf as) +>             | length as < 6 = "tmp"++show t++ " = CLOSUREADD"+++>			          show (length as)++"(tmp"++show tf++","+++>			          showargs as++");"+>	      | otherwise = "args = MKARGS(" ++ show (length as) ++ +>		      ");\n    " ++ mkargs as 0 ++ "tmp"++show t+++>		    " = CLOSUREADDN(tmp"++ show tf ++",args,"++ +>		    show (length as)++");"+>         wc (EVAL i) = "eval(v" ++ show i ++");"+>         wc (EVALTMP i) = "eval(tmp" ++ show i ++");"+>         wc (TYPE t) = "tmp"++show t++" = MKTYPE;"+>         wc (TAILCALL n vs) = "return "++getCName scs n ++ "(" ++ showargs vs ++ ");"+>	  wc (ALET i t) = "v"++show i++" = tmp"++show t++";"+>         wc (CASE v cs) = "switch(TAG(v"++show v++")) {\n" +++>		   cc cs 0 ++ "    }"++>         cc [] i = "    default:\n    return NULL;\n"+>         cc (c:cs) i = "    case "++show i++":\n" +++>		writeCode scs c ++ "\n" ++ cc cs (i+1)++>         mkargs [] _ = ""+>	  mkargs (a:as) i = "args["++show i++"] = tmp"++show a ++ ";"+>		            ++ "\n    " ++ mkargs as (i+1)++>         showargs [] = ""+>         showargs [x] = "tmp"++show x+>         showargs (x:xs) = "tmp"++show x++","++showargs xs++ writeCode bc t [] = ("",t)+ writeCode bc tmp (c:cs) = let (code,tmp') = opc tmp c+			        (code',tmp'') = writeCode bc tmp' cs in+			("\t" ++ code ++ "\n" ++ code', tmp'')+    where opc t (STARTFN _ _) = ("VAL* args;",t)+          opc t (DECLARE x) = ("VAL v"++show x++";",t)+          opc t (RETURN e) = let (code,tmp') = ecomp (t+1) e in+			       (code ++ "return t"++show t,tmp')+	   opc t (TAILCALL n es) +                 = let (code,tmp',ts) = argcode (t+1) es [] "" in+              (code ++ "return "++ getCName bc n ++ "(" ++ arglist ts ++ ")",tmp')+          opc t (ALET x e) = error "Not done Let yet"+          opc t (CASE e es) = ("CASE foo;",t)+          ecomp t e = ("expression",t)+              | length es < 2 = "MKCON"++show (length es)++"("++show t++","+++			         argcode es++")"+              | otherwise = mkArgList (length es) ++ "MKCONN("++show t+++		             ",args,"++length es++");"+		             ++          argcode t [] l code = (code,t,l)+	   argcode t (e:es) as c+               = let (ecode,t') = ecomp (t+1) e+		      code = "tmp"++show t++ " = " ++ ecode ++ ";" in+		    argcode t' es (t:as) (c++code)+          arglist [] = ""+          arglist [e] = "tmp"++show e+          arglist (e:es) = arglist es ++ "," ++ "tmp"++show e
+ Ivor/Compiler.lhs view
@@ -0,0 +1,191 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.Compiler(compile) where++> import Ivor.RunTT+> import Ivor.State+> import Ivor.Nobby+> import Ivor.Datatype+> import Ivor.TTCore+> import Ivor.ICompile++> import System.IO+> import Control.Monad++> compile :: IState -> String -> IO ()+> compile st froot = fail "Deprecated"+++>  {-   do h <- openFile (froot++".hs") WriteMode+>        hPutStr h (header froot)+>        compileData (defs st) (datadefs st) st h+>        compileGamma (defs st) st h+>        hFlush h+>        hClose h++FIXME! Only does elim, not case.++> compileData :: Gamma Name -> [(Name,Datatype Name)] -> IState ->+>                Handle -> IO ()+> compileData gam [] st h = return ()+> compileData gam ((n,dt):xs) st h =+>     do let caseexp = compileSchemes (e_ischemes dt)+>        let arity = getArity (e_ischemes dt)+>        rn <- rulename+>        if (length (datacons dt)>0) then+>           hPutStrLn h $ "data TT_" ++ exportName n ++ " = " ++ compileCons (datacons dt)+>           else hPutStrLn h $ "data TT_" ++ exportName n ++ " = TT_" ++ exportName n+>        let inst = projInstance (datacons dt)+>        when ((length (words inst))>0)+>           $ hPutStrLn h $ "\ninstance Project TT_"++ exportName n +++>                 " where\n" ++ inst+>        let rtt = mkRTElim n arity caseexp+>        let fn = mkGHC st rn arity rtt+>        hPutStrLn h fn+>        --putStrLn $ elimInterface n (snd (erule dt))+>        --putStrLn $ elimBody n rn (snd (erule dt))+>        --hPutStrLn h $ show rtt+>        compileData gam xs st h+>  where rulename = case lookupval n gam of+>                      (Just (TCon _ (Elims x _ _))) -> return x+>                      Nothing -> fail "No such type"++This creation of elim rule interfaces only works for completely simple types!++> elimInterface :: Name -> Indexed Name -> String+> elimInterface n (Ind ty) = "elim_" ++ exportName n ++ " :: " ++ mkET ty+>    where mkET (Bind _ (B Pi ty) (Sc sc)) = mkArg ty ++ mkET sc+>          mkET _ = "a"+>          mkArg ty | Star <- getReturnType ty = "" -- Skip Phi+>                   | TyCon x _ <- getFun ty+>                        = "TT_" ++ exportName x ++ " -> "+>                   | otherwise = "(" ++ mkET ty ++ ") -> "++> elimBody :: Name -> Name -> Indexed Name -> String+> elimBody n rn (Ind ty) = "elim_" ++ exportName n ++ " = " ++ mkLams ty 0 +++>                          "(coerce (fn_" ++ exportName rn ++ " " ++ mkET ty 0+>                          ++ "))::a"+>    where+>          mkET (Bind _ (B Pi ty) (Sc sc)) n | Star <- getReturnType ty+>                                                = mkArg ty n ++ mkET sc n+>          mkET (Bind _ (B Pi ty) (Sc sc)) n = mkArg ty n ++ mkET sc (n+1)+>          mkET _ _ = ""+>          mkLams (Bind _ (B Pi ty) (Sc sc)) n | Star <- getReturnType ty+>                                                = mkLams sc n+>          mkLams (Bind _ (B Pi ty) (Sc sc)) n = "\\x"++show n ++ " -> "+>                                                ++ mkLams sc (n+1)+>          mkLams _ _ = ""++>          mkArg ty n | Star <- getReturnType ty = "((coerce Type)::val)"+>                     | otherwise = "((coerce x"++show n++")::val)"++> compileCons :: [(Name,Gval Name)] -> String+> compileCons [] = ""+> compileCons [x] = compileCon x+> compileCons (x:xs) = compileCon x ++ "| " ++ compileCons xs++> compileCon (n,G (DCon _ _) (Ind t) _) =+>     foralls numargs ++ "TT_" ++ show n ++ " " ++ showargs numargs+>   where numargs = length (getExpected t)+>         foralls n | n == 0 = ""+>                   | otherwise = "forall arg. "+>         showargs 0 = ""+>         showargs n = "arg " ++ showargs (n-1)++> projInstance :: [(Name,Gval Name)] -> String+> projInstance [] = ""+> projInstance (x:xs) =+>     let xp = projAll x in+>        if (length (words xp)>0) then xp ++ "\n" ++ projInstance xs+>           else projInstance xs++> projAll (n,G (DCon _ _) (Ind t) _) =+>     project numargs+>   where numargs = length (getExpected t)+>         project 0 = "\n"+>         project k = "    project "++show (k-1)++" (TT_" ++ exportName n +++>                     " " ++ showargs numargs++") = ((coerce a" ++ show (k-1)+>                         ++ ")::val)\n" ++ project (k-1)+>         showargs 0 = ""+>         showargs n = showargs (n-1) ++ " a" ++ show (n-1)++> compileGamma :: Gamma Name -> IState -> Handle -> IO ()+> compileGamma gam@(Gam g) st h = cg g where+>   cg [] = return ()+>   cg ((n,G (Fun _ ind) indty _):xs) =+>       do -- putStrLn $ "Compiling " ++ show n+>          let nind = normalise (Gam []) ind+>          let rtt = mkRTFun gam (levelise nind)+>          let (Ind ty) = normalise gam indty+>          let arity = length (getExpected ty)+>          let fn = mkGHC st n arity rtt+>          hPutStrLn h fn+>          cg xs+>   cg (x:xs) = do -- putStrLn $ "Skipping " ++ show x+>                  cg xs++> mkGHC :: IState -> Name -> Int -> RunTT -> String+> mkGHC st n arity tm = "fn_" ++ exportName n ++ " :: " ++ mkSig arity ++ "\n" +++>                       "fn_" ++ exportName n ++ " = " ++ mkBody 0 tm ++ "\n"+>    where mkSig 0 = "val"+>          mkSig n = "val -> " ++ mkSig (n-1)+>          mkBody l (RTVar i) = "v"++show i+>          mkBody l (RTFun n) = "fn_" ++ exportName n+>          mkBody l (RTCon _ n args) = "(coerce (TT_" ++ exportName n ++ " " ++ showargs l args ++ ")::val)"+>          mkBody l (RTElim n t m ms) = "(fn_" ++ exportName n ++ " " ++ showarg l t +++>                                     " ((coerce Type)::val) " ++ showargs l ms+>          mkBody l (RTApp f xs) = "(" ++ showfun l f (length xs) ++ " " ++ showargs l xs ++ ")"+>          mkBody l (RTBind (RTLam,_) (sc,_)) = "(\\v"++show l ++" -> " ++ mkBody (l+1) sc ++ ")"+>          mkBody l (RTBind (RTLet (v,_),_) (sc,_)) = "(let v"++show l ++" = " ++ "(" ++ mkBody l v ++ ") in (" ++ mkBody (l+1) sc ++ "))"+>          mkBody l (RTBind (RTPi,_) (sc,_)) = "((coerce Type)::val)"+>          mkBody l RTypeVal = "((coerce Type)::val)"+>          mkBody l RTCantHappen = "error \"Impossible\""+>          mkBody l (RTProj ty i (v,_)) = "(project " ++ show i +++>                                      "((coerce " ++ mkBody l v ++")::TT_"++show ty++"))"+>          mkBody l (RTCase ty (v,_) xs) = "(case ((coerce "++mkBody l v++")::TT_"++show ty++") of { " ++ doCaseBody l (getCons (datadefs st) ty) xs ++ "})"+>          mkBody l (RTConst c) = error "Sorry, can't compile constants yet"+>          -- mkBody l x = "[[Not done "++show x++"]]"++>          doCaseBody l [] [] = ""+>          doCaseBody l ((n,ar):ns) (i:is) = doCase l n ar i ++ " ; " ++ doCaseBody l ns is+>          doCase l n ar (i,_) = "TT_"++exportName n++" "++caseargs ar++" -> " ++ mkBody l i+>          caseargs 0 = ""+>          caseargs n = "_ "++caseargs (n-1)++>          showargs l [] = ""+>          showargs l (x:xs) = showarg l x ++ " " ++ showargs l xs+>          showarg l (x,_) = "((coerce "++mkBody l x++")::val)"+>          showfun l (f,_) n = "((coerce "++mkBody l f++")::"++mkty n++")"++>          mkty 0 = "val"+>          mkty n = "val->"++mkty (n-1)++Given a type name, get all the constructors and their arities++> getCons :: [(Name,Datatype Name)] -> Name -> [(Name,Int)]+> getCons ds n = case lookup n ds of+>                  Nothing -> []+>                  Just dt -> map (\ (x,y) -> (x, arity y)) (datacons dt)+>     where arity (G _ (Ind ty) _) = length (getExpected ty)++> header mod = "{-# OPTIONS_GHC -fglasgow-exts #-} \n\+>               \\n\+>               \module " ++ mod ++ " where\n\+>               \\n\+>               \import GHC.Base\n\+>               \\n\+>               \coerce :: a -> b\n\+>               \coerce = unsafeCoerce#\n\+>               \\n\+>               \data Type = forall a. Type a\n\+>               \data Val = Val\n\+>               \\n\+>               \class Project x where\n\+>               \    project :: forall val. Int -> x -> val\n\n"++> exportName :: Name -> String+> exportName (UN n) = show $ UN (okch n)+>    where okch [] = []+>          okch ('\'':xs) = "_AP_"++okch xs+>          okch (x:xs) = x:(okch xs)+> -}
+ Ivor/Constant.lhs view
@@ -0,0 +1,7 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.Constant where++> import Data.Typeable++
+ Ivor/Construction.lhs view
@@ -0,0 +1,100 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> -- | +> -- Module      : Ivor.Construction+> -- Copyright   : Edwin Brady+> -- Licence     : BSD-style (see LICENSE in the distribution)+> --+> -- Maintainer  : eb@dcs.st-and.ac.uk+> -- Stability   : experimental+> -- Portability : non-portable+> -- +> -- Some generic tactics for solving goals by applying constructors++> module Ivor.Construction(auto,split,left,right,useCon,exists,+>                          isItJust) where++> import Ivor.TT+> import Debug.Trace++> -- | Tries to solve a simple goal automatically by trying each of these +> --   in turn:+> --  * Looking for an assumption ('trivial')+> --  * 'intros' everything then solve by 'auto'+> --  * Splitting the goal, then solving each subgoal by 'auto'+> --  * If the goal is of a type with more than one constructor, try 'auto'+> --    on each constructor in turn.+> -- FIXME: not that this actually works yet.++> auto :: Int -- ^ Search depth+>         -> Tactic+> auto 0 = \g ctxt -> fail "auto got bored, try a bigger search depth"+> auto n = \g ctxt -> if (allSolved ctxt) then return ctxt else+>            trace ("Auto "++ show n) $+>            ((trivial >+> (auto n)) >|>+>            (intros1 >+> (auto n)) >|>+>            (split >+> (auto n)) >|>+>            (left >+> (auto (n-1))) >|>+>            (right >+> (auto (n-1)))) g ctxt++> -- | Split a goal into subgoals. Type of goal must be a one constructor+> -- family, with constructor @c@, then proceeds by 'refine' @c@.+> split :: Tactic+> split  = useCon 1 0++> -- | Split a goal into subgoals. Type of goal must be a two constructor+> -- family, with constructors @l@ and @r@, then proceeds by 'refine' @l@.+> left :: Tactic+> left = useCon 2 0++> -- | Split a goal into subgoals. Type of goal must be a two constructor+> -- family, with constructors @l@ and @r@, then proceeds by 'refine' @r@.+> right :: Tactic+> right = useCon 2 1++Get the goal, look at the type. Refine by the constructor of that type -+check that there is the right number (num).++> -- | Solve the goal by applying a numbered constructor+> useCon :: Int -- ^ Ensure at least this number of constructors (0 for no constraint)+>           -> Int -- ^ Use this constructor (0 based, order of definition)+>           -> Tactic+> useCon num use g ctxt = do+>     goal <- goalData ctxt False g+>     let ty = getApp (view (goalType goal))+>     case ty of+>       (Name _ n) -> do cons <- getConstructors ctxt n+>                        splitnCon cons g ctxt+>       _ -> fail "Not a type constructor"+>    where splitnCon cs | length cs >= num || num == 0+>              = refine (Name DataCon (cs!!use))+>          splitnCon _ = \g ctxt -> fail $ "Not a " ++ show num ++ " constructor family"++> -- | Solve an existential by providing a witness.+> -- More generally; apply the first constructor of the +> -- goal's type and provide the witness as its first non-inferrable argument.+> exists :: IsTerm a => a -- ^Witness +>                       -> Tactic+> exists t = useCon 1 0 >+> fill t+++> -- | Try to solve a goal @A@ by evaluating a term of type @Maybe A@. If the+> -- answer is @just a@, fill in the goal with the proof term @a@.+> isItJust :: IsTerm a => a -> Tactic+> isItJust tm g ctxt = do +>     gd <- goalData ctxt False g +>     let gty = view $ goalType gd+>     vtm <- evalCtxt ctxt g tm+>     let (prf, ty) = (view vtm, viewType vtm)+>     -- make sure type is 'Maybe'+>     case ty of+>        (App (Name _ m) a) | m == (name "Maybe") +>           -> do case prf of+>                  (App (Name _ n) _) | n == (name "nothing")+>                      -> fail "No solution found"+>                  (App (App (Name _ j) _) p) | j == (name "just")+>                      -> fill p g ctxt+>                  tm -> fail $ "Evaluated to " ++ show tm+>        _ -> fail $ "Type of decision procedure must be ++ " ++ +>                       show (App (Name Unknown (name "Maybe")) gty)+
+ Ivor/Datatype.lhs view
@@ -0,0 +1,177 @@+> module Ivor.Datatype where++> import Ivor.TTCore+> import Ivor.Gadgets+> import Ivor.Typecheck+> import Ivor.Nobby+> import Ivor.PatternDefs++> import Debug.Trace++> data Datadecl = Datadecl {+>                           datatycon :: Name,+>                           params :: [(Name,Raw)],+>                           tycontype :: Raw,+>                           constructors :: [(Name,Raw)]+>                          }++Elaborated version with elimination rule and iota schemes.++> data RawDatatype = +>	   RData { rtycon :: (Name,Raw),+>	           rdatacons :: [(Name,Raw)],+>                  rnum_params :: Int,+>	           rerule :: (Name,Raw),+>                  rcrule :: (Name,Raw),+>	           re_ischemes :: [RawScheme],+>	           rc_ischemes :: [RawScheme]+>	   }+>   deriving Show++> data Datatype n =+>	   Data { tycon :: (n, Gval n),+>	          datacons :: [(n, Gval n)],+>                 num_params :: Int,+>	          erule :: (n, Indexed n),+>                 crule :: (n, Indexed n),+>	          e_ischemes :: PMFun Name,+>	          c_ischemes :: PMFun Name,+>	          e_rawschemes :: [RawScheme],+>	          c_rawschemes :: [RawScheme]+>	        }+>       deriving Show++> getPat (Sch p i) = p+> getRed (Sch p i) = i++> getArity [] = 2 -- empty data type should have elim rule of arity 2!+>                 -- (actually not if they're dependent. Fix this.)+> getArity ss = length (getPat (ss!!0))++checkType checks a raw data type, with its elimination rule and iota+schemes, and returns a DataType, ready for compilation to entries in+the context and an executable elimination rule.++> checkType :: Monad m => Gamma Name -> RawDatatype -> m (Datatype Name)+> checkType gamma (RData (ty,kind) cons numps (er,erty) (cr,crty) eschemes cschemes) = +>     do (kv, _) <- typecheck gamma kind+>        let erdata = Elims er cr (map fst cons)+>	 let gamma' = extend gamma (ty,G (TCon (arity gamma kv) erdata) kv defplicit)+>	 (consv,gamma'') <- checkCons gamma' 0 cons+>	 (ev, _) <- typecheck gamma'' erty+>	 (cv, _) <- typecheck gamma'' crty+>	 -- let gamma''' = extend gamma'' (er,G (ElimRule dummyRule) ev defplicit)+>        (esch, _) <- checkDef gamma'' er erty eschemes False False+>        (csch, _) <- checkDef gamma'' cr crty cschemes False False+>	 return (Data (ty,G (TCon (arity gamma kv) erdata) kv defplicit) consv numps+>                    (er,ev) (cr,cv) esch csch eschemes cschemes)++>    where checkCons gamma t [] = return ([], gamma)+>          checkCons gamma t ((cn,cty):cs) = +>              do (cv,_) <- typecheck gamma cty+>		  let ccon = G (DCon t (arity gamma cv)) cv defplicit+>		  let gamma' = extend gamma (cn,ccon)+>		  (rest,gamma'') <- checkCons gamma' (t+1) cs+>	          return (((cn,ccon):rest), gamma'')++checkScheme takes a raw iota scheme and returns a scheme with a well-typed+RHS (or fails if there is a type error).++For a scheme of the form++foo p0 p1 ... pn = t++we get V 0 = pn ... V n = p0+then pattern variables are retrieved by projection with Proj in typechecked t.++> checkScheme :: Monad m =>+>	          Gamma Name -> Name -> RawScheme -> m (Scheme Name)+> checkScheme gamma n (RSch pats ret) = +>     do let ps = map (mkPat gamma) pats+>	 let rhsvars = getPatVars gamma ps+>        let rhs = substVars gamma n rhsvars ret+>	 return (Sch (reverse ps) (Ind rhs))++Make a pattern from a raw term. Anything weird, just make it a "PTerm".++> mkPat :: Gamma Name -> Raw -> Pattern Name+> mkPat gam (Var n) = mkPatV n (lookupval n gam)+>        where mkPatV n (Just (DCon t x)) = PCon t n tyname []+>              mkPatV n (Just (TCon x _)) = PCon 0 n (UN "Type") []+>              mkPatV n _ = PVar n+>              tyname = case (getTyName gam n) of+>                         Just x -> x+> mkPat gam (RApp f a) = pat' (unwind f a)+>   where unwind (RApp f s) a = let (f',as) = unwind f s in+>				    (f',(mkPat gam a):as)+>	  unwind t a = (t, [mkPat gam a])+>         pat' (Var n, as) = mkPatV n (lookupval n gam) (reverse as)+>         pat' _ = PTerm++>         mkPatV n (Just (DCon t x)) as = PCon t n tyname as+>         mkPatV n (Just (TCon x _)) as = PCon 0 n (UN "Type") as+>         mkPatV _ _ _ = PTerm+>         tyname = case (getTyName gam (getname (getappfun f))) of+>                    Just x -> x+>         getname (Var n) = n+> mkPat gam _ {-(RBind _ _ _)-} = PTerm+> {-+> TODO: If a datatype has a placeholder in its indices, the value should+> be inferred (i.e. it should be checked) otherwise we can't make a pattern+> properly (and we'll certainly need this for optimisation)+> mkPat gam x = error $ "Can't make a pattern from " ++ show x+> -}++Get the pattern variables from the patterns, and work out what the projection +function for each name is.++> getPatVars :: Gamma Name ->[Pattern Name] -> [(Name, TT Name)]+> getPatVars gam xs = pv' 0 (reverse xs)+>   where pv' i [] = []+>         pv' i (x:xs) = (project gam i x) ++ (pv' (i+1) xs)++	  indexify (n,t) = (n,Ind t)++Projection.++> project :: Gamma Name -> Int -> Pattern Name -> [(Name, TT Name)]+> project gam n x = project' n (\i -> V i) x+>   where project' n f (PVar x) = [(x,f n)]+>         project' n f (PCon _ fn ty es) = projargs n f 0 es ty+>         project' n f (PMarkCon fn es) = projargs n f 0 es (UN "FOO")+>         project' n f _ = [] -- Can't project from terms or marked vars.+>         projargs n f i [] _ = []+>         projargs n f i (PMark _:xs) ty = projargs n f i xs ty+>         projargs n f i (x:xs) ty+>             = (project' n ((\a -> (Proj ty i a)).f) x)+>               ++ projargs n f (i+1) xs ty++-- >         argtypes ty = case lookuptype ty gam of+-- >                          (Just (Ind ty)) -> map (getFnName.snd)+-- >                                               $ getExpected ty+-- >         getFnName (TyCon x _) = x+-- >         getFnName (App f x) = getFnName f+-- >         getFnName (Bind _ _ (Sc x)) = getFnName x+-- >         getFnName x = MN ("Dunno: "++show x, 0)++Make a RHS of an iota scheme, substituting names with projection operations.+ASSUMPTION: No bindings on the RHS. This should be true of all iota schemes.+Takes the name of the elimination rule and assumes any reference to an+elimination rule is a reference to this++> substVars :: Gamma Name -> Name -> [(Name,TT Name)] -> Raw -> TT Name+> substVars gam er ns r = sv' r+>    where sv' (Var x) = case (lookup x ns) of+>			    Nothing -> mkGood x+>			    (Just i) -> i+>	   sv' (RApp f a) = App (sv' f) (sv' a)+>          sv' (RConst c) = Const c++>          mkGood x = case (lookupval x gam) of+>	       (Just (DCon t i)) -> Con t x i+>              (Just (TCon i _)) -> TyCon x i+>              (Just (ElimRule _)) -> Elim er+>	       _ -> P x++> dummyRule :: ElimRule+> dummyRule _ = Nothing
+ Ivor/Display.lhs view
@@ -0,0 +1,26 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}  {- -*-literate-haskell-*- -}++Functions for displaying proof state "helpfully".++> module Ivor.Display where++> import Ivor.Tactics+> import Ivor.TTCore+> import Ivor.Typecheck+> import Ivor.Nobby++> displayHoleContext :: Gamma Name -> [Name] -> Name -> Indexed Name -> String+> displayHoleContext gam hidden h tm = +>     case (findhole gam (Just h) tm (displayHole hidden)) of+>             Just x -> x+>             Nothing -> ""++> displayHole :: [Name] -> Gamma Name -> Env Name -> Indexed Name -> String+> displayHole hidden gam hs tm = dh hs ++ +>                         "\n=======================================\n" +++>                         show (normaliseEnv hs (Gam []) tm) ++ "\n"+>    where dh [] = ""+>          dh ((n,B _ ty):xs) +>              | n `elem` hidden = dh xs+>              | otherwise = dh xs ++ (show n)++" : "++show ty++"\n"+
+ Ivor/Equality.lhs view
@@ -0,0 +1,22 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> -- | +> -- Module      : Ivor.Equality+> -- Copyright   : Edwin Brady+> -- Licence     : BSD-style (see LICENSE in the distribution)+> --+> -- Maintainer  : eb@dcs.st-and.ac.uk+> -- Stability   : experimental+> -- Portability : non-portable+> -- +> -- Tactics for Heterogeneous Equality (injectivity, disjointness, etc)++> module Ivor.Equality where++> import Ivor.TTCore as TTCore+> import Ivor.TT+> import Ivor.TermParser+> import Ivor.State+> import Ivor.Gadgets+> import Ivor.Nobby+
+ Ivor/Evaluator.lhs view
@@ -0,0 +1,127 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.Evaluator(eval_whnf) where++> import Ivor.TTCore+> import Ivor.Gadgets+> import Ivor.Constant+> import Ivor.Nobby++> import Debug.Trace+> import Data.Typeable++ data Machine = Machine { term :: (TT Name),+                          mstack :: [TT Name],+                          menv :: [(Name, Binder (TT Name))] }++> eval_whnf :: Gamma Name -> Indexed Name -> Indexed Name+> eval_whnf gam (Ind tm) = let res = makePs (evaluate False gam tm)+>                              in finalise (Ind res)++> type Stack = [TT Name]+> type SEnv = [(Name, TT Name, TT Name)]++> getEnv i env = (\ (_,_,val) -> val) (env!!i)++Code			Stack	Env	Result++[[x{global}]]		xs	es	(lookup x), xs, es+[[x{local}]]		xs	es	(es!!x), xs, es+[[f a]]			xs	es	[[f]], a:xs, es+[[\x . e]]		(x:xs)	es	[[e]], xs, (x:es)+[[\x . e]]		[]	es	\x . [[e]], xs, (Lam x: es)+(or leave alone for whnf)+[[let x = t in e]]	xs	es	[[e]], xs, (Let x t: es)++> evaluate :: Bool -> -- under binders? 'False' gives WHNF+>             Gamma Name -> TT Name -> TT Name+> evaluate open gam tm = eval tm [] [] []+>   where+>     eval :: TT Name -> Stack -> SEnv -> [(Name, TT Name)] -> TT Name+>     eval (P x) xs env pats +>         = case lookup x pats of+>              Nothing -> evalP x (lookupval x gam) xs env pats+>              Just val -> eval val xs env pats+>     eval (V i) xs env pats = if (length env>i) +>                                then eval (getEnv i env) xs env pats+>                                else unload (V i) xs pats env -- blocked, so unload+>     eval (App f a) xs env pats = eval f ((eval a [] env pats):xs) env pats+>     eval (Bind n (B Lambda ty) (Sc sc)) xs env pats =+>         let ty' = eval ty [] env pats in+>             evalScope n ty' sc xs env pats+>     eval (Bind n (B Pi ty) (Sc sc)) xs env pats =+>         let ty' = eval ty [] env pats in+>            unload (Bind n (B Pi ty') (Sc sc)) [] pats env+>     eval (Bind n (B (Let val) ty) (Sc sc)) xs env pats =+>         eval sc xs ((n,ty,eval val [] env pats):env) pats+>     eval (Bind n (B bt ty) (Sc sc)) xs env pats =+>         let ty' = eval ty [] env pats in+>            unload (Bind n (B bt ty') (Sc sc)) [] pats env+>     eval x stk env pats = unload x stk pats env++>     evalP n (Just v) xs env pats +>        = case v of+>             Fun opts (Ind v) -> eval v xs env pats+>             PatternDef p -> pmatch n p xs env pats+>             PrimOp _ f -> case f xs of+>                             Nothing -> unload (P n) xs pats env+>                             Just v -> eval v [] env pats+>             _ -> unload (P n) xs pats env+>     evalP n Nothing xs env pats = unload (P n) xs pats env -- blocked, so unload stack++>     evalScope n ty sc (x:xs) env pats = eval sc xs ((n,ty,x):env) pats+>     evalScope n ty sc [] env pats+>               | open = error "Normalising not implemented"+>               | otherwise +>                   = buildenv env $ unload (Bind n (B Lambda ty) (Sc sc)) [] pats env -- in Whnf+>     unload x [] pats env +>                = foldl (\tm (n,val) -> substName n val (Sc tm)) x pats+>     unload x (a:as) pats env = unload (App x a) as pats env++>     buildenv [] t = t+>     buildenv ((n,ty,tm):xs) t +>                 = buildenv xs (subst tm (Sc t))+>     --            = buildenv xs (Bind n (B (Let tm) ty) (Sc t))++>     pmatch n (PMFun i clauses) xs env pats = +>         case matches clauses xs env pats of+>           Nothing -> unload (P n) xs pats env+>           Just (rhs, pbinds, stk) -> eval rhs stk env pbinds++>     matches [] xs env pats = Nothing+>     matches (c:cs) xs env pats +>        = case (match c xs env pats) of+>            Just v -> Just v+>            Nothing -> matches cs xs env pats++>     match :: Scheme Name -> [TT Name] -> SEnv -> [(Name, TT Name)] ->+>              Maybe (TT Name, [(Name, TT Name)], Stack)+>     match (Sch pats rhs) xs env patvars +>               = matchargs pats xs rhs env patvars+>     matchargs [] xs (Ind rhs) env patvars = Just (rhs, patvars, xs)+>     matchargs (p:ps) (x:xs) rhs env patvars+>               = case matchPat p (eval x [] env patvars) patvars of+>                   Just patvars' -> matchargs ps xs rhs env patvars'+>                   Nothing -> Nothing+>     matchargs _ _ _ _ _ = Nothing++>     matchPat PTerm x patvars = Just patvars+>     matchPat (PVar n) x patvars = Just ((n,x):patvars)+>     matchPat (PConst t) (Const t') patvars+>                  = do tc <- cast t+>                       if (tc == t') then Just patvars+>                                else Nothing+>     matchPat pc@(PCon t _ _ args) app patvars+>              | Just (tag, cargs) <- getConArgs app [] =+>                     if (tag == t) then matchPats args cargs patvars+>                        else Nothing+>         where matchPats [] [] patvars = Just patvars+>               matchPats (a:as) (b:bs) patvars+>                   = do vs' <- matchPat a b patvars+>                        matchPats as bs vs'+>               matchPats _ _ _ = Nothing+>     matchPat _ _ _ = Nothing++>     getConArgs (Con t _ _) args = Just (t, args)+>     getConArgs (App f a) args = getConArgs f (a:args)+>     getConArgs _ _ = Nothing
+ Ivor/Gadgets.lhs view
@@ -0,0 +1,83 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.Gadgets where++> class Forget a b | a->b where+>     forget :: a -> b++> traceIndex :: [a] -> Int -> String -> a+> traceIndex xs i str | length xs <= i = error $ " !! index too large: " ++ str+>                     | otherwise = xs!!i++> safeIndex :: [a] -> Int -> a -> a+> safeIndex xs i def | length xs <= i = def+>                    | otherwise = xs!!i++=================== Result Monad ========================++> data Result r +>     = Success r+>     | Failure String+>  deriving (Show, Eq)++> instance Monad Result where+>     (Success r)   >>= k = k r+>     (Failure err) >>= k = Failure err+>     return              = Success+>     fail s              = Failure s++> instance Functor Result where+>     fmap f (Failure str) = Failure str+>     fmap f (Success s) = Success (f s)++====================== Snoc Lists ===========================++> data Spine x = Empty | Snoc (Spine x) x++> infix 5 ??+> (??) :: Spine x -> Int -> x+> (Snoc _ x) ?? 0 = x+> (Snoc xs _) ?? n | n>0 = xs ?? (n-1)+> (Snoc _ _) ?? _ = error "?? - negative index"++> end (Snoc sp x) = x+> start (Snoc sp x) = sp++> size :: Spine x -> Int+> size Empty = 0+> size (Snoc xs x) = 1+(size xs)++> lose :: Int -> Spine x -> Spine x+> lose 0 (Snoc xs x) = xs+> lose n (Snoc xs x) = (Snoc (lose (n-1) xs) x)++> listify :: Spine x -> [x]+> listify xs = list' [] xs+>   where list' acc Empty = acc+>         list' acc (Snoc xs x) = list' (x:acc) xs++> revlistify :: Spine x -> [x]+> revlistify Empty = []+> revlistify (Snoc xs x) = x:(revlistify xs)++> instance Functor Spine where+>     fmap f Empty = Empty+>     fmap f (Snoc sp x) = Snoc (fmap f sp) (f x)++========= Functions I want in the standard library... =========++> lookupM :: (Monad m, Eq a) => a -> [(a,b)] -> m b+> lookupM y [] = fail "Not found"+> lookupM y ((x,v):xs) | x == y = return v+>                      | otherwise = lookupM y xs++Look for a file in the current directory, then each directory listed+in turn. If present, return the contents, otherwise fail++> findFile :: [FilePath] -> FilePath -> IO String+> findFile fp fn = ff' (".":fp) fn+>   where ff' [] fn = fail "File not found in search path"+>         ff' (d:ds) fn = do+>                         catch (do content <- readFile $ d ++ "/" ++ fn+>                                   return content)+>                               (\e -> ff' ds fn)
+ Ivor/Grouper.lhs view
@@ -0,0 +1,59 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.Grouper where++> import Ivor.TTCore+> import Ivor.Nobby+> import Ivor.Constant++TT expressions with lambdas/function arguments grouped, for better lambda+lifting.++> data GroupTT n+>    = GP n+>    | GV Int+>    | GCon Int n [GroupTT n] -- Saturated now+>    | GTyCon n Int+>    | GElim n+>    | GApp (GroupTT n) [GroupTT n]+>    | GLam [GroupTT n] Int (GroupTT n) -- Variables and level+>    | GLet (GroupTT n) (GroupTT n) (GroupTT n)+>    | GPi (GroupTT n) (GroupTT n)+>    | GProj Int (GroupTT n)+>    | forall c. Constant c => GConst c+>    | GStar+>    | GCant+>  -- deriving Show++> group :: Show n => Levelled n -> GroupTT n+> group (Lev term) = gr 0 term where+>    gr l (P n) = GP n+>    gr l (V i) = GV i+>    gr l c@(Con t n a) = mkApp l c []+>    gr l (TyCon n a) = GTyCon n a+>    gr l (Elim n) = GElim n+>    gr l c@(App f a) = mkApp l c []+>    gr l (Bind n (B Lambda t) (Sc sc)) = mkLam (l+1) [gr l t] sc+>    gr l (Bind n (B Pi t) (Sc sc)) = GPi (gr l t) (gr (l+1) sc)+>    gr l (Bind n (B (Let v) t) (Sc sc)) +>		      = GLet (gr l v) (gr l t) (gr (l+1) sc)+>    gr l (Proj _ i t) = GProj i (gr l t)+>    gr l (Const c) = GConst c+>    gr l (Label t _) = gr l t+>    gr l (Call _ t) = gr l t+>    gr l (Return t) = gr l t+>    gr l Star = GStar+>    gr _ _ = GCant++>    mkApp l (App f a) sp = mkApp l f ((gr l a):sp)+>    mkApp l (Con t n a) sp | length sp == a = GCon t n sp+>		            | otherwise = saturate l t n a sp+>    mkApp l x sp = GApp (gr l x) sp++>    mkLam l xs (Bind n (B Lambda t) (Sc sc)) +>            = mkLam (l+1) (xs++[gr l t]) sc+>    mkLam l xs sc = GLam xs (l-length xs) (gr l sc)++>    saturate lev tag name arity sp +>            = error $ "Constructor saturation unimplemented " ++ show term+
+ Ivor/ICompile.lhs view
@@ -0,0 +1,90 @@+> module Ivor.ICompile where++> import Ivor.TTCore+> import Ivor.Datatype+> import Ivor.Nobby+> import Ivor.Gadgets++> import Data.List+> import Debug.Trace++Structure of simple case expressions, from which we can build actual code for+elimination rules in whatever form we like, eg for NBE or compiled code.++> data SimpleCase = Case Name Int [SimpleCase] -- case x::ty of xs, x is a local var+>                 | IReduce (Indexed Name) -- Found a reduction!+>	          | Impossible -- No well-typed term can get here+>   deriving Show++Compile a set of iota schemes to simple case structure.++TMP ASSUMPTION: There is always one argument where all cases are disjoint.+We can make sure this is always the case even for detaggable/collapsible+families, although we should do better later.++> compileSchemes :: [Scheme Name] -> SimpleCase+> compileSchemes [] = Impossible+> compileSchemes ss = icomp ss [0..(length (getPat (ss!!0)))-1]+>    where icomp ss es = let pats = transpose (map getPat ss) in+>			 let (pats',es') = unzip $ orderPatts (zip pats es) in+>			 let ss' = mangleArgOrder ss (reverse es') in+>			 let top = map schhead ss'+>			     rest = map schtail ss' in+>			 icomp' top rest es'+>          schhead (Sch x red) = (head x, red)+>          schtail (Sch x red) = Sch (tail x) red+>          icomp' x xs (e:es) | allDisjoint (map fst x) = doCase1 e x+>		              | otherwise = error "Can't find a scrutinee"+>          orderPatts = sortBy cmpPat+>          cmpPat (p,v) (p',v') = compare (numDisjoint p') (numDisjoint p)++I wish I'd written a comment here when I wrote this...++> mangleArgOrder :: [Scheme Name] -> [Int] -> [Scheme Name]+> mangleArgOrder [] _ = []+> mangleArgOrder (x:xs) es = (ma' x es):(mangleArgOrder xs es)+>    where ma' (Sch ps ired) es = Sch (reorder ps es) ired+>          reorder ps xs = foldl (\ih x -> (ps!!x):ih) [] xs++> allDisjoint ps = numDisjoint ps == length ps++> numDisjoint :: [Pattern n] -> Int+> numDisjoint [] = 0+> numDisjoint (x:xs) | x `djWith` xs = 1+(numDisjoint xs)+>	             | otherwise = numDisjoint xs+>   where djWith (PCon _ _ _ _) [] = True+>         djWith _ [] = False+>         djWith x (y:ys) | dj x y = djWith x ys+>		          | otherwise = False+>         dj (PCon x _ _ _) (PCon y _ _ _) = x /= y+>         dj _ _ = False++Case 1: All patterns are disjoint.++> doCase1 :: Int -> [(Pattern Name, Indexed Name)] -> SimpleCase+> doCase1 x ps = Case (ty ps) x (order ps)+>    where order ps = insertDefaults+>	                  (sortBy (\ (x,y) (x',y') -> compare x x') ps)+>	   insertDefaults ps = id' 0 ps+>          id' n [] = []+>	   id' n allps@((PCon i _ _ _,t):ps)+>             | n == i = (IReduce t):(id' (n+1) ps)+>             | otherwise = Impossible:(id' (n+1) allps)+>          ty ((PCon _ _ tyname _, _):xs) = tyname+++Make an elimination rule implementation from a simple case expression.++> mkElim :: Name -> (Indexed Name) -> Int -> SimpleCase -> ElimRule+> mkElim ename ty arity cs sp | size sp /= arity = Nothing+>		              | otherwise = doElim sp cs+>   where doElim sp Impossible = Nothing+>         doElim sp (Case _ x cs) = let xval = (sp??x) in+>                    case xval of+>		      (MR (RCon tag _ _)) -> doElim sp (cs!!tag)+>		      _ -> Nothing+>         doElim sp (IReduce (Ind t))+>                = let recrule = mkElim ename ty arity cs+>		       gam = Gam ((ename,G (ElimRule recrule) ty defplicit):[])+>		       red = (nf gam (VG (revlistify sp)) [] False t)+>			 in (Just red)
+ Ivor/MakeData.lhs view
@@ -0,0 +1,128 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.MakeData where++> import Ivor.TTCore+> import Ivor.Datatype++> import Debug.Trace++Transform a raw data declaration (just parameters and constructors)+into a full data definition with iota schemes.++FIXME: Throughout all this, need to ensure that the elimination operator name,+the target, methods and the motives are unique.++> type Params = [(Name,Raw)]+> type Constructors = [(Name,Raw)]++> mkRawData :: Monad m =>+>              Name -> Params -> Raw -> Constructors -> m RawDatatype+> mkRawData name params contype cons = +>     let ecasetype = mkCaseType True name params contype cons +>                                motiveName methNames+>         ccasetype = mkCaseType False name params contype cons +>                                motiveName methNames+>         datacons = mkDatacons params cons+>         eischemes = mkSchemes True name (ruleName name "Elim") +>                               params datacons motiveName methNames+>         cischemes = mkSchemes False name (ruleName name "Case") +>                               params datacons motiveName methNames+>         tycontype = mkCon params contype in+>         return $ --(trace (show ischemes)) $  +>          RData (name,tycontype) datacons (length params)+>                    (ruleName name "Elim", ecasetype) -- elim rule+>                    (ruleName name "Case", ccasetype) -- case rule+>                    eischemes -- elim rule iota schemes+>                    cischemes -- case rule iota schemes++>    where ruleName (UN n) suff = (UN (n++suff)) -- TMP HACK!+>          motiveName = (UN "Phi")+>          methName (UN n) = (UN ("meth_"++n))+>          methNames = map (methName.fst) cons+ +> mkSchemes :: Bool -> Name -> Name -> Params -> Constructors -> Name -> +>              [Name] -> [RawScheme]+> mkSchemes rec n ername ps cs motive mns = mks cs mns mns +>    where mks [] [] mns = [] +>          mks ((c,cty):cs) (m:ms) mns +>              = (mkScheme rec n ername ps c cty motive mns m):(mks cs ms mns)++> mkScheme rec n ername ps c cty motive mns meth +>     = RSch (mkIArgs ps c cty motive mns) +>            (mkIRet rec n ername meth motive mns ps cty)++> mkIArgs ps c cty motive mns = getappargs (getrettype cty) +++>                               [mkapp (Var c) (map Var (getargnames cty))] +++>                               (map Var (motive:mns))++> mkIRet rec tyname ername meth motive mns ps cty = +>     mkapp (Var meth) (drop (length ps) (mkArgs cty))+>   where mkArgs (RBind n (B Pi ty) sc) +>            | isrec ty tyname && rec +>                = (Var n):(mkRecApp ername ty n motive mns):(mkArgs sc)+>            | otherwise = (Var n):(mkArgs sc)+>         mkArgs _ = []+>         mkRecApp en ty n motive mns = +>             mkapp (Var en) $ (getappargs ty)++(map Var (n:motive:mns))+++> mkCon :: Params -> Raw -> Raw+> mkCon [] ty = ty+> mkCon ((x,xty):xs) ty = RBind x (B Pi xty) (mkCon xs ty)++> mkDatacons :: Params -> Constructors -> Constructors+> mkDatacons _ [] = []+> mkDatacons ps ((x,xty):xs) = (x,(mkCon ps xty)):(mkDatacons ps xs)++> mkCaseType :: Bool -> Name -> Params -> Raw -> Constructors -> Name -> +>               [Name] -> Raw+> mkCaseType rec n ps ty cs motiveName mns +>     = bindParams ps $+>       bindIndices ty $+>       bindTarget targetName n ps ty $+>       bindMotive motiveName targetName n ps ty $+>       bindMethods rec n motiveName ps cs mns $+>       applyMethod motiveName targetName ty+>    where targetName = UN "target" -- TMP HACK!++> bindParams [] rest = rest+> bindParams ((n,ty):xs) rest = RBind n (B Pi ty) (bindParams xs rest)++> bindIndices (RBind n (B Pi ty) sc) rest +>     = (RBind n (B Pi ty) (bindIndices sc rest))+> bindIndices sc rest = rest++> bindTarget x n ps ty rest +>     = RBind x +>       (B Pi (mkapp (Var n) (map Var ((map fst ps)++(getargnames ty)))))+>       rest++> bindMotive p x n ps ty rest+>     = RBind p+>       (B Pi (bindIndices ty $+>              bindTarget x n ps ty $+>              RStar)) rest++> bindMethods rec tyname p ps [] [] rest = rest+> bindMethods rec tyname p ps ((n,ty):cs) (mn:mns) rest +>     = RBind mn (B Pi (methtype ty)) (bindMethods rec tyname p ps cs mns rest)+>  where methtype (RBind a (B Pi argtype) sc) +>            | isrec argtype tyname && rec+>                = (RBind a (B Pi argtype) (mkrec a argtype sc))+>            | otherwise = (RBind a (B Pi argtype) (methtype sc))+>        methtype sc = mkapp (Var p) $ (getindices sc)+++>              [mkapp (Var n) (map Var ((map fst ps)++(getargnames ty)))]+>        mkrec a argtype sc = (RBind (ih a) (B Pi (rectype a argtype p)) +>                                        (methtype sc))+>        getindices x = drop (length ps) (getappargs x)+>        ih (UN a) = UN (a++"_IH")+>        rectype a aty p = mkapp (Var p) ((drop (length ps) (getappargs aty)++[Var a]))++> applyMethod p x ty = mkapp (Var p) ((map Var (getargnames ty)) ++ [Var x])+++> isrec t tyname = (Var tyname) == getappfun t++> placeholder = Var (UN "Waitforit")+
+ Ivor/Nobby.lhs view
@@ -0,0 +1,686 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.Nobby where++> import Ivor.TTCore+> import Ivor.Gadgets+> import Ivor.Constant++> import Data.List+> import Control.Monad+> import Data.Typeable++> import Debug.Trace++To begin, we need to define the context in which normalisation takes place.+The context maps names to user defined functions, constructors and+elimination rules.++Global represents all possible global names --- if it's a user defined+name, hold its definition, otherwise hold what it is so we know what+to do with it, when the time comes.++> data Global n+>     = Fun [FunOptions] (Indexed n)    -- User defined function+>     | Partial (Indexed n) [n] -- Unfinished definition+>     | PatternDef (PMFun n) -- Pattern matching definition+>     | ElimRule ElimRule  -- Elimination Rule+>     | PrimOp PrimOp EvPrim     -- Primitive function+>     | DCon Int Int       -- Data Constructor, tag and arity+>     | TCon Int (Elims n) -- Type Constructor and arity, elim rule name+>     | Unreducible        -- Unreducible name+>     | Undefined          -- Declared but undefined name++> data Elims n = Elims { elimRuleName :: n,+>                        caseRuleName :: n,+>                        constructors :: [n] }+>              | NoConstructorsYet++> data FunOptions = Frozen | Recursive+>   deriving Eq++> instance Show n => Show (Global n) where+>     show (Fun opts t) = "Fun " ++ show t+>     show (ElimRule _) = "<<elim rule>>"+>     show (PrimOp _ _) = "<<primitive operator>>"+>     show (DCon x t) = "DCon " ++ show x ++ "," ++show t+>     show (TCon x (Elims e c cons)) = "TCon " ++ show x+>     show Unreducible = "Unreducible"+>     show Undefined = "Undefined"++> type Plicity = Int++> defplicit = 0++> data Gval n = G (Global n) (Indexed n) Plicity+>    deriving Show++> getglob (G v t p) = v+> gettype (G v t p) = t+> getplicity (G v t p) = p++> newtype Gamma n = Gam [(n,Gval n)]+>     deriving Show++> extend (Gam x) (n,v) = Gam ((n,v):x)++> emptyGam = Gam []++> lookupval :: Eq n => n -> Gamma n -> Maybe (Global n)+> lookupval n (Gam xs) = fmap getglob (lookup n xs)++> lookuptype :: Eq n => n -> Gamma n -> Maybe (Indexed n)+> lookuptype n (Gam xs) = fmap gettype (lookup n xs)++> glookup ::  Eq n => n -> Gamma n -> Maybe (Global n,Indexed n)+> glookup n (Gam xs) = fmap (\x -> (getglob x,gettype x)) (lookup n xs)++Get a type name from the context++> getTyName :: Monad m => Gamma Name -> Name -> m Name+> getTyName  gam n = case lookuptype n gam of+>                            Just (Ind ty) -> return $ getFnName ty+>                            Nothing -> fail $ "No such name " ++ show n+>   where getFnName (TyCon x _) = x+>         getFnName (App f x) = getFnName f+>         getFnName (Bind _ _ (Sc x)) = getFnName x+>         getFnName x = MN ("Dunno: "++show x, 0)++Return whether a name is a recursive constructor (i.e, its family name+occurs anywhere in its arguments).++> recCon :: Name -> Gamma Name -> Bool+> recCon n gam = case glookup n gam of+>                  (Just (DCon _ t, Ind ty)) ->+>                      checkRec (conFamily ty) (map snd (getExpected ty))+>                  _ -> False+>    where conFamily t = fname (getFun (getReturnType t))+>          fname (TyCon n _) = n+>          fname _ = MN ("ERROR!",0)+>          checkRec n [] = False+>          checkRec n (x:xs) = nameOccurs n (forget x) || checkRec n xs++> insertGam :: n -> Gval n -> Gamma n -> Gamma n+> insertGam nm val (Gam gam) = Gam $ (nm,val):gam++> concatGam :: Gamma n -> Gamma n -> Gamma n+> concatGam (Gam x) (Gam y) = Gam (x++y)++> setFrozen :: Eq n => n -> Bool -> Gamma n -> Gamma n+> setFrozen n freeze (Gam xs) = Gam $ sf xs where+>    sf [] = []+>    sf ((p,G (Fun opts v) ty plicit):xs)+>        | n == p = (p,G (Fun (doFreeze freeze opts) v) ty plicit):xs+>    sf (x:xs) = x:(sf xs)+>    doFreeze True opts = nub (Frozen:opts)+>    doFreeze False opts = opts \\ [Frozen]++> setRec :: Eq n => n -> Bool -> Gamma n -> Gamma n+> setRec n frec (Gam xs) = Gam $ sf xs where+>    sf [] = []+>    sf ((p,G (Fun opts v) ty plicit):xs)+>        | n == p = (p,G (Fun (doFrec frec opts) v) ty plicit):xs+>    sf (x:xs) = x:(sf xs)+>    doFrec True opts = nub (Recursive:opts)+>    doFrec False opts = opts \\ [Recursive]+++> freeze :: Eq n => n -> Gamma n -> Gamma n+> freeze n gam = setFrozen n True gam++> thaw :: Eq n => n -> Gamma n -> Gamma n+> thaw n gam = setFrozen n False gam++Remove a name from the middle of the context - should only be valid+if it's a partial definition or an axiom which is about to be replaced.++> remove :: Eq n => n -> Gamma n -> Gamma n+> remove n (Gam xs) = Gam $ rm n xs where+>    rm n [] = []+>    rm n (d@(p,_):xs) | n==p = xs+>                      | otherwise = d:(rm n xs)++Insert a name into the context. If the name is already there, this+is an error *unless* the old definition was 'Undefined', in which case+the name is replaced.++> gInsert :: (Monad m, Eq n, Show n) => n -> Gval n -> Gamma n -> m (Gamma n)+> gInsert nm val (Gam xs) = do xs' <- ins nm val xs []+>                              return $ Gam xs'+>   where ins n val [] acc = return $ (n,val):(reverse acc)+>         -- FIXME: Check ty against val+>         ins n val (d@(p,G Undefined ty _):xs) acc+>             | n == p = return $ (n,val):(reverse acc) ++ xs+>         ins n val (d@(p,G (TCon _ NoConstructorsYet) ty _):xs) acc+>             | n == p = return $ (n,val):(reverse acc) ++ xs+>         ins n val (d@(p,_):xs) acc+>             | n == p = fail $ "Name " ++ show p ++ " is already defined"+>             | otherwise = ins n val xs (d:acc)++An ElimRule is a Haskell implementation of the iota reductions of+a family.++> type ElimRule = Spine Value -> Maybe Value++A PrimOp is an external operation++> type PrimOp = Spine Value -> Maybe Value+> type EvPrim = [TT Name] -> Maybe (TT Name) -- same, but with tt terms rather than values++Model represents normal forms, including Ready (reducible) and Blocked+(non-reducible) forms.++> data Model s = MR (Ready s)+>              | MB (Blocked s, Model s) (Spine (Model s))++> data Ready s+>     = RdBind Name (Binder (Model s)) (s (Model s))+>     | RCon Int Name (Spine (Model s))+>     | RTyCon Name (Spine (Model s))+>     | forall c. Constant c => RdConst c+>     | RdStar+>     | RdLabel (Model s) (MComp s)+>     | RdCall (MComp s) (Model s)+>     | RdReturn (Model s)+>     | RdCode (Model s)+>     | RdQuote (Model s) -- (TT Name)+>     | RdInfer++> data Blocked s+>     = BCon Int Name Int+>     | BTyCon Name Int+>     | BElim ElimRule Name+>     | BPatDef (PMFun Name) Name+>     | BPrimOp PrimOp Name+>     | BRec Name Value+>     | BP Name+>     | BV Int+>     | BEval (Model s) (Model s)+>     | BEscape (Model s) (Model s)++> data MComp s = MComp Name [Model s]++> newtype Weakening = Wk Int++Second weakening is cached to prevent function composition in the weaken+class.++> newtype Kripke x = Kr (Weakening -> x -> x, Weakening)++> type Value = Model Kripke+> type Normal = Model Scope++> newtype Ctxt = VG [Value]++> type PatVals = [(Name, Value)]++The normalisation function itself.++We take a flag saying whether this is for conversion checking or not. This is+necessary because staged evaluation will not reduce things inside a quote+to normal form, but we need a normal form to compare.++> nf :: Gamma Name -> Ctxt+>    -> PatVals+>    -> Bool -- ^ For conversion+>    -> TT Name -> Value+> nf g c patvals conv t = eval 0 g c t where++Get the type of a given name in the context++>  pty n = case lookuptype n g of+>             (Just (Ind ty)) -> nf g c [] conv ty+>             Nothing -> error "Can't happen, no such name, Nobby.lhs"++Do the actual evaluation++>  eval stage gamma (VG g) (V n)+>      | (length g) <= n = MB (BV n, MR RdInfer) Empty -- error $ "Reference out of context! " ++ show n ++ ", " ++ show (length g) --+>      | otherwise = g!!n+>  eval stage gamma g (P n)+>      = case lookup n patvals of+>           Just val -> val+>           Nothing -> evalP (lookupval n gamma)+>    where evalP (Just Unreducible) = (MB (BP n,pty n) Empty)+>          evalP (Just Undefined) = (MB (BP n, pty n) Empty)+>          evalP (Just (PatternDef p@(PMFun 0 pats))) =+>              case patmatch gamma g pats [] of+>                 Nothing ->  (MB (BPatDef p n, pty n) Empty)+>                 Just v -> v+>          evalP (Just (PatternDef p)) = (MB (BPatDef p n, pty n) Empty)+>          evalP (Just (Partial (Ind v) _)) = (MB (BP n, pty n) Empty)+>          evalP (Just (PrimOp f _)) = (MB (BPrimOp f n, pty n) Empty)+>          evalP (Just (Fun opts (Ind v)))+> --               | Frozen `elem` opts && not conv = MB (BP n) Empty+>                -- recursive functions don't reduce in conversion check, to+>                -- maintain decidability of typechecking+>                  | Recursive `elem` opts  && conv+>                    = MB (BP n, pty n) Empty+>                  | otherwise+>                    = eval stage gamma g v+>          evalP _ = (MB (BP n, pty n) Empty)+>              --error $ show n +++>	         --      " is not a function. Something went wrong."+>                    -- above error is unsound; if names are rebound.+>  eval stage gamma g (Con tag n 0) = (MR (RCon tag n Empty))+>  eval stage gamma g (Con tag n i) = (MB (BCon tag n i, pty n) Empty)+>  eval stage gamma g (TyCon n 0) = (MR (RTyCon n Empty))+>  eval stage gamma g (TyCon n i) = (MB (BTyCon n i, pty n) Empty)+>  eval stage gamma g (Const x) = (MR (RdConst x))+>  eval stage gamma g Star = MR RdStar+>  eval stage gamma (VG g) (Bind n (B Lambda ty) (Sc sc)) =+>      (MR (RdBind n (B Lambda (eval stage gamma (VG g) ty))+>         (Kr (\w x -> eval stage gamma (VG (x:(weaken w g))) sc,Wk 0))))+>  eval stage gamma (VG g) (Bind n (B (Let val) ty) (Sc sc)) =+>      eval stage gamma (VG ((eval stage gamma (VG g) val):g)) sc+>  eval stage gamma (VG g) (Bind n (B Pi ty) (Sc sc)) =+>      (MR (RdBind n (B Pi (eval stage gamma (VG g) ty))+>         (Kr (\w x -> eval stage gamma (VG (x:(weaken w g))) sc,Wk 0))))+>  eval stage gamma (VG g) (Bind n (B Hole ty) (Sc sc)) =+>      (MR (RdBind n (B Hole (eval stage gamma (VG g) ty))+>         (Kr (\w x -> eval stage gamma (VG (x:(weaken w g))) sc,Wk 0))))+>  eval stage gamma (VG g) (Bind n (B (Guess v) ty) (Sc sc)) =+>      (MR (RdBind n (B (Guess (eval stage gamma (VG g) v)) (eval stage gamma (VG g) ty))+>         (Kr (\w x -> eval stage gamma (VG (x:(weaken w g))) sc,Wk 0))))+>  eval stage gamma g (Proj _ x t) = case (eval stage gamma g t) of+>			 MR (RCon _ _ sp) -> traceIndex (listify sp) x "Nobby.lhs, Proj"+>			 _ -> error "Foo" -- MB (BProj x (eval stage gamma g t))+>  eval stage gamma g (App f a) = apply gamma g (eval stage gamma g f) (eval stage gamma g a)+>  eval stage gamma g (Call c t) = docall g (evalcomp stage gamma g c) (eval stage gamma g t)+>  eval stage gamma g (Label t c) = MR (RdLabel (eval stage gamma g t) (evalcomp stage gamma g c))+>  eval stage gamma g (Return t) = MR (RdReturn (eval stage gamma g t))+>  eval stage gamma g (Elim n) = MB (BElim (getelim (lookupval n gamma)) n, pty n) Empty+>    where getelim Nothing = \sp -> Nothing+>          getelim (Just (ElimRule x)) = x+>          getelim y = error $ show n +++>            " is not an elimination rule. Something went wrong." ++ show y+>  eval stage gamma g (Stage s) = evalStage stage gamma g s++>  evalcomp stage gamma g (Comp n ts) = MComp n (map (eval stage gamma g) ts)++>  evalStage stage gamma g (Code t) = MR (RdCode (eval stage gamma g t))+>  evalStage stage gamma g (Quote t) = if conv+>     then -- let cd = (forget ((quote (eval stage gamma g t)::Normal))) in+>          --             MR (RdQuote cd)+>          MR (RdQuote (eval (stage+1) gamma g t))+>     -- This is again a bit of a hack, just evaluating without any definitions+>     -- but it is a nice cheap way of seeing what we'd have to generate code+>     -- for at run-time.+>     else MR (RdQuote (eval (stage+1) (Gam []) g t))+>     -- else let cd = (forget ((quote (eval (Gam []) g t)::Normal))) in+>        --               MR (RdQuote cd)+>        -- MR (RdQuote (substV g t)) --(splice t)) -- broken+>  evalStage stage gamma g (Eval t ty) = case (eval (stage+1) gamma g t) of+>                            (MR (RdQuote t')) -> eval stage gamma g+>                                                   (forget ((quote t')::Normal))+>                            x -> MB (BEval x bty, bty) Empty+>     where bty = eval stage gamma g ty+>  evalStage stage gamma g (Escape t ty) = case (eval (stage+1) gamma g t) of+>                            (MR (RdQuote t')) ->+>                                if (stage>0)+>                                   then t'+>                                   else eval stage gamma g (forget ((quote t')::Normal))+>                            x -> MB (BEscape x bty, bty) Empty -- needed for conversion check+>     where bty = eval stage gamma g ty++>                            --_ -> error $ "Can't escape something non quoted " ++ show t++> docall :: Ctxt -> MComp Kripke -> Value -> Value+> docall g _ (MR (RdReturn v)) = v+> docall g c v = MR (RdCall c v)++> apply :: Gamma Name -> Ctxt -> Value -> Value -> Value+> apply gam = app where+>  app g (MR (RdBind _ (B Lambda ty) k)) v = krApply k v+>  app g (MB (BElim e n, ty) sp) v = error "Elimination rules are eliminated"+>  {-    case e (Snoc sp v) of+>         Nothing -> (MB (BElim e n, ty) (Snoc sp v))+>         (Just v) -> v -}+>  app g (MB pat@(BPatDef (PMFun ar pats) n, ty) sp) v+>      | size (Snoc sp v) == ar =+>         case patmatch gam g pats (listify (Snoc sp v)) of+>           Nothing -> (MB pat (Snoc sp v))+>           Just v -> v+>      | otherwise = MB pat (Snoc sp v)+>  app g (MB (BPrimOp e n, ty) sp) v+>    = case e (Snoc sp v) of+>        Nothing -> (MB (BPrimOp e n, ty) (Snoc sp v))+>        (Just v) -> v+>  app g (MB (BCon tag n i, ty) sp) v+>      | size (Snoc sp v) == i = (MR (RCon tag n (Snoc sp v)))+>      | otherwise = (MB (BCon tag n i, ty) (Snoc sp v))+>  app g (MB (BTyCon n i, ty) sp) v+>      | size (Snoc sp v) == i = (MR (RTyCon n (Snoc sp v)))+>      | otherwise = (MB (BTyCon n i, ty) (Snoc sp v))+>  app g (MB bl sp) v = MB bl (Snoc sp v)+>  app g v a = error $ "Can't apply a non function " ++ show (forget ((quote v)::Normal)) ++ " to argument " ++ show (forget ((quote a)::Normal))++  constructorsIn Empty = False+  constructorsIn (Snoc xs (MR (RCon _ _ _))) = True+  constructorsIn (Snoc xs _) = constructorsIn xs++> krApply :: Kripke Value -> Value -> Value+> krApply (Kr (f,w)) x = f w x++> patmatch :: Gamma Name -> Ctxt -> [PMDef Name] -> [Value] -> Maybe Value+> patmatch gam g [] _ = Nothing+> patmatch gam g ((Sch pats ret):ps) vs = case pm gam g pats vs ret [] of+>                         Nothing -> patmatch gam g ps vs+>                         Just v -> Just v++> pm :: Gamma Name -> Ctxt -> [Pattern Name] -> [Value] -> Indexed Name ->+>       [(Name, Value)] -> -- matches so far+>       Maybe Value+> pm gam g [] [] (Ind ret) vals = Just $ nf gam g vals False ret+> pm gam g (pat:ps) (val:vs) ret vals+>    = do newvals <- pmatch pat val vals+>         newvals <- checkdups newvals+>         pm gam g ps vs ret newvals++> checkdups v = Just v++> pmatch :: Pattern Name -> Value -> [(Name,Value)] -> Maybe [(Name, Value)]+> pmatch PTerm x vs = Just vs+> pmatch (PVar n) v vs = Just ((n,v):vs)+> pmatch (PConst t) (MR (RdConst t')) vs = do tc <- cast t+>                                             if tc == t' then Just vs+>                                                    else Nothing+> pmatch (PCon t _ _ args) (MR (RCon t' _ sp)) vs | t == t' =+>    pmatches args (listify sp) vs+>   where pmatches [] [] vs = return vs+>         pmatches (a:as) (b:bs) vs = do vs' <- pmatch a b vs+>                                        pmatches as bs vs'+>         pmatches _ _ _ = Nothing+> pmatch _ _ _ = Nothing+++ RCon Int Name (Spine (Model s))++ applySpine :: Ctxt -> Value -> Spine Value -> Value -> Value+ applySpine g fn Empty v = apply g fn v+ applySpine g fn (Snoc sp x) v = apply g (applySpine g fn sp x) v++Splice the escapes inside a term++> splice :: TT Name -> TT Name+> splice = mapSubTerm (splice.st) where+>   st (Stage (Escape (Stage (Quote t)) _)) = (splice t)+>   st x = x++> class Weak x where+>     weaken :: Weakening -> x -> x+>     weaken (Wk 0) x = x+>     weaken (Wk n) x = weakenp n x+>     weakenp :: Int -> x -> x++> instance Weak Int where+>     weakenp i j = i + j++> instance (Weak a, Weak b) => Weak (a,b) where+>     weakenp i (x,y) = (weakenp i x, weakenp i y)++> instance Weak Weakening where+>     weakenp i (Wk j) = Wk (i + j)++> instance Weak (Model Kripke) where+>     weakenp i (MR r) = MR (weakenp i r)+>     weakenp i (MB b sp) = MB (weakenp i b) (fmap (weakenp i) sp)++> instance Weak (Ready Kripke) where+>     weakenp i (RdBind n bind sc) = RdBind n (weakenp i bind) (weakenp i sc)+>     weakenp i (RdConst x) = RdConst x+>     weakenp i RdStar = RdStar+>     weakenp i (RCon t n sp) = RCon t n (fmap (weakenp i) sp)+>     weakenp i (RTyCon n sp) = RTyCon n (fmap (weakenp i) sp)+>     weakenp i (RdLabel t c) = RdLabel (weakenp i t) (weakenp i c)+>     weakenp i (RdCall c t) = RdCall (weakenp i c) (weakenp i t)+>     weakenp i (RdReturn t) = RdReturn (weakenp i t)+>     weakenp i (RdCode t) = RdCode (weakenp i t)+>     weakenp i (RdQuote t) = RdQuote (weakenp i t)++> instance Weak (TT Name) where+>     weakenp i t = vapp (\ (ctx,v) -> V (weakenp i v)) t++> instance Weak (MComp Kripke) where+>     weakenp i (MComp n ts) = MComp n (fmap (weakenp i) ts)++> instance Weak n => Weak (Binder n) where+>     weakenp i (B (Let v) ty) = B (Let (weakenp i v)) (weakenp i ty)+>     weakenp i (B (Guess v) ty) = B (Guess (weakenp i v)) (weakenp i ty)+>     weakenp i (B b ty) = B b (weakenp i ty)++> instance Weak (Blocked Kripke) where+>     weakenp i (BCon t n j) = BCon t n j+>     weakenp i (BTyCon n j) = BTyCon n j+>     weakenp i (BElim e n) = BElim e n+>     weakenp i (BPatDef p n) = BPatDef p n+>     weakenp i (BRec n v) = BRec n v+>     weakenp i (BPrimOp e n) = BPrimOp e n+>     weakenp i (BP n) = BP n+>     weakenp i (BV j) = BV (weakenp i j)+>     weakenp i (BEval t ty) = BEval (weakenp i t) (weakenp i ty)+>     weakenp i (BEscape t ty) = BEscape (weakenp i t) (weakenp i ty)++> instance Weak (Kripke x) where+>     weakenp i (Kr (f,w)) = Kr (f,weakenp i w)++> instance Weak Ctxt where+>     weakenp i (VG g) = VG (weakenp i g)++> instance Weak x => Weak [x] where+>     weakenp i xs = fmap (weakenp i) xs++> class Quote x y where+>     quote :: x -> y+>     quote' :: [Name] -> x -> y+>     quote = quote' []++> instance Quote Value Normal where+>     quote' ns (MR r) = MR (quote' ns r)+>     quote' ns (MB (b, ty) sp) = MB (quote' ns b, quote' ns ty)+>                                    (fmap (quote' ns) sp)++> instance Quote (Ready Kripke) (Ready Scope) where+>     quote' ns (RdConst x) = RdConst x+>     quote' ns RdStar = RdStar+>     quote' ns (RdBind n b@(B _ ty) sc)+>             = let n' = mkUnique n ns in+>                        RdBind n' (quote' ns b)+>                                   (Sc (quote' (n':ns) (krquote ty sc)))+>        where mkUnique n ns | n `elem` ns =+>                                case n of+>                                   (UN nm) -> (mkUnique (MN (nm, 0)) ns)+>                                   (MN (nm,i)) -> (mkUnique (MN (nm, i+1)) ns)+>                            | otherwise = n++>     quote' ns (RCon t c sp) = RCon t c (fmap (quote' ns) sp)+>     quote' ns (RTyCon c sp) = RTyCon c (fmap (quote' ns) sp)+>     quote' ns (RdLabel t c) = RdLabel (quote' ns t) (quote' ns c)+>     quote' ns (RdCall c t) = RdCall (quote' ns c) (quote' ns t)+>     quote' ns (RdReturn t) = RdReturn (quote' ns t)+>     quote' ns (RdCode t) = RdCode (quote' ns t)+>     quote' ns (RdQuote t) = RdQuote (quote' ns t)++> instance Quote (Blocked Kripke) (Blocked Scope) where+>     quote' ns (BCon t n j) = BCon t n j+>     quote' ns (BTyCon n j) = BTyCon n j+>     quote' ns (BElim e n) = BElim e n+>     quote' ns (BPatDef p n) = BPatDef p n+>     quote' ns (BRec n v) = BRec n v+>     quote' ns (BPrimOp e n) = BPrimOp e n+>     quote' ns (BP n) = BP n+>     quote' ns (BV j) = BV j+>     quote' ns (BEval t ty) = BEval (quote' ns t) (quote' ns ty)+>     quote' ns (BEscape t ty) = BEscape (quote' ns t) (quote' ns ty)++> instance Quote (MComp Kripke) (MComp Scope) where+>     quote' ns (MComp n ts) = MComp n (fmap (quote' ns) ts)++> krquote :: Value -> Kripke Value -> Value+> krquote t (Kr (f,w)) = f (weaken w (Wk 1)) (MB (BV 0, t) Empty)++> instance Quote n m => Quote (Binder n) (Binder m) where+>     quote' ns (B b ty) = B (quote' ns b) (quote' ns ty)++> instance Quote n m => Quote (Bind n) (Bind m) where+>     quote' ns (Let v) = Let (quote' ns v)+>     quote' ns (Guess v) = Guess (quote' ns v)+>     quote' ns Lambda = Lambda+>     quote' ns Pi = Pi+>     quote' ns Hole = Hole++Quotation to eta long normal form. DOESN'T WORK YET!++-- > instance Quote (Value, Value) Normal where+-- >     quote (v@(MR (RdBind n (B Lambda _) _)),+-- >                 (MR (RdBind _ (B Pi ty) (Kr (f,w)))))+-- >         = (MR (RdBind n (B Lambda (quote ty))+-- >                (Sc (quote ((apply (VG []) (v) v0),+-- >                      (f w v0))))))+-- >       where v0 = MB (BV 0, ty) Empty+-- >     quote (v, (MR (RdBind n (B Pi ty) (Kr (f,w)))))+-- >         = (MR (RdBind n (B Lambda (quote ty))+-- >                (Sc (quote ((apply (VG []) (weaken (Wk 1) v) v0),+-- >                      (f w v0))))))+-- >       where v0 = MB (BV 0, ty) Empty+-- >     quote ((MB (bl,ty) sp), _)+-- >         = MB (quote bl, quote ty) (fst (qspine sp))+-- >        where qspine Empty = (Empty, ty)+-- >              qspine (Snoc sp v)+-- >                  | (sp', MR (RdBind _ (B Pi t) (Kr (f,w)))) <- qspine sp+-- >                      = (Snoc sp' (quote (v,weaken (Wk 1) t)),+-- >                           f w v)+-- >                  | (sp', t) <- qspine sp+-- >                      = (Snoc sp' (quote v), t)+-- > --error $ show (forget ((quote t)::Normal))+-- >              v0 t = MB (BV 0, t) Empty+-- >     quote (v, t) = quote v++> instance Forget Normal (TT Name) where+>     forget (MB (b, _) sp) = makeApp (forget b) (fmap forget sp)+>     forget (MR r) = forget r++> instance Forget (Blocked Scope) (TT Name) where+>     forget (BCon t n j) = Con t n j+>     forget (BTyCon n j) = TyCon n j+>     forget (BElim e n) = Elim n+>     forget (BPatDef p n) = P n+>     forget (BRec n v) = P n+>     forget (BPrimOp f n) = P n+>     forget (BP n) = P n+>     forget (BV i) = V i+>     forget (BEval t ty) = Stage (Eval (forget t) (forget ty))+>     forget (BEscape t ty) = Stage (Escape (forget t) (forget ty))++> instance Forget (Ready Scope) (TT Name) where+>     forget (RdBind n b (Sc sc)) = Bind n (forget b) (Sc (forget sc))+>     forget (RdConst x) = (Const x)+>     forget RdStar = Star+>     forget (RCon t c sp) = makeApp (Con t c (size sp)) (fmap forget sp)+>     forget (RTyCon c sp) = makeApp (TyCon c (size sp)) (fmap forget sp)+>     forget (RdLabel t c) = Label (forget t) (forget c)+>     forget (RdCall c t) = Call (forget c) (forget t)+>     forget (RdReturn t) = Return (forget t)+>     forget (RdCode t) = Stage (Code (forget t))+>     forget (RdQuote t) = Stage (Quote (forget t))++> instance Forget (MComp Scope) (Computation Name) where+>     forget (MComp n ts) = Comp n (fmap forget ts)++> instance Forget (Binder (Model Scope)) (Binder (TT Name)) where+>     forget (B b ty) = B (forget b) (forget ty)++> instance Forget (Bind (Model Scope)) (Bind (TT Name)) where+>     forget (Let v) = Let (forget v)+>     forget (Guess v) = Guess (forget v)+>     forget Lambda = Lambda+>     forget Pi = Pi+>     forget Hole = Hole++> makeApp :: TT Name -> Spine (TT Name) -> TT Name+> makeApp f Empty = f+> makeApp f (Snoc xs x) = (App (makeApp f xs)) x++> normalise :: Gamma Name -> (Indexed Name) -> (Indexed Name)+> normalise g (Ind t) = Ind (forget (quote (nf g (VG []) [] False t)::Normal))++WARNING: quotation to eta long normal form doesn't work yet.++> etaNormalise :: Gamma Name -> (Indexed Name, Indexed Name) -> (Indexed Name)+> etaNormalise g (Ind tm, Ind ty) = undefined++-- >     let vtm = (nf g (VG []) [] False tm)+-- >         vty = (nf g (VG []) [] False ty) in+-- >       Ind (forget (quote (vtm, vty)::Normal))++> convNormalise :: Gamma Name -> (Indexed Name) -> (Indexed Name)+> convNormalise g (Ind t)+>     = Ind (forget (quote (nf g (VG []) [] True t)::Normal))++> normaliseEnv :: Env Name -> Gamma Name -> Indexed Name -> Indexed Name+> normaliseEnv env g t+>     = normalise (addenv env g) t+>   where addenv [] g = g+>         addenv ((n,B (Let v) ty):xs) (Gam g)+>             = addenv xs (Gam ((n,G (Fun [] (Ind v)) (Ind ty) defplicit):g))+>         addenv (_:xs) g = addenv xs g++> convNormaliseEnv :: Env Name -> Gamma Name -> Indexed Name -> Indexed Name+> convNormaliseEnv env g t+>     = convNormalise (addenv env g) t+>   where addenv [] g = g+>         addenv ((n,B (Let v) ty):xs) (Gam g)+>             = addenv xs (Gam ((n,G (Fun [] (Ind v)) (Ind ty) defplicit):g))+>         addenv (_:xs) g = addenv xs g++     = Ind (forget (quote (nf g (VG (valenv env [])) t)::Normal))+    where valenv [] env = trace (show (map forget ((map quote env)::[Normal]))) $ env+          valenv ((n,B (Let v) ty):xs) env = valenv xs ((eval env v):env)+          valenv ((n,B _ ty):xs) env = valenv xs ((MB (BP n) Empty):env)+          eval env v = nf g (VG env) v++-- > natElim :: ElimRule+-- > natElim (Snoc args@(Snoc (Snoc (Snoc Empty phi) phiZ) phiS)+-- >            (MR (RCon 0 (UN "O") sp)))+-- >      = return phiZ+-- > natElim (Snoc args@(Snoc (Snoc (Snoc Empty phi) phiZ) phiS)+-- >            (MR (RCon 1 (UN "S") (Snoc Empty n))))+-- >      = return (apply (VG []) (apply (VG []) phiS n)+-- >                  (apply (VG []) rec n))+-- >    where rec = (MB (BElim natElim (UN "nateElim")) args)+-- > natElim _ = Nothing++-- > genElim :: Int -> Int -> [(Name,Ctxt -> Value)] -> ElimRule+-- > genElim arity con red sp+-- >   | size sp < arity = Nothing+-- >   | otherwise = case (sp??con) of+-- >        (MR (RCon t n args)) ->+-- >              do v <- lookup n red+-- >                 let ctx = VG $ (makectx args)++(makectx (lose con sp))+-- >                 return $ v ctx+-- >        _ -> Nothing+-- >   where makectx (Snoc xs x) = x:(makectx xs)+-- >         makectx Empty = []+++====================== Functors for contexts ===============================++> instance Functor Gamma where+>     fmap f (Gam xs) = Gam (fmap (\ (x,y) -> (f x,fmap f y)) xs)++> instance Functor Gval where+>     fmap f (G g i p) = G (fmap f g) (fmap f i) p++> instance Functor Global where+>     fmap f (Fun opts n) = Fun opts $ fmap f n+>     fmap f (ElimRule e) = ElimRule e+>     fmap f (DCon t i) = DCon t i+>     fmap f (TCon i (Elims en cn cons))+>              = TCon i (Elims (f en) (f cn) (fmap f cons))+++> arity :: Gamma Name -> Indexed Name -> Int+> arity g t = ca (normalise g t)+>    where ca (Ind t) = ca' t+>          ca' (Bind _ (B Pi _) (Sc r)) = 1+(ca' r)+>          ca' _ = 0
+ Ivor/PatternDefs.lhs view
@@ -0,0 +1,368 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.PatternDefs where++> import Ivor.Gadgets+> import Ivor.TTCore+> import Ivor.Nobby+> import Ivor.Typecheck+> import Ivor.Unify++> import Debug.Trace+> import Data.List+> import Control.Monad++Use the iota schemes from Datatype to represent pattern matching definitions.++> checkDef :: Monad m => Gamma Name -> Name -> Raw -> [PMRaw] ->+>             Bool -> -- Check for coverage+>             Bool -> -- Check for well-foundedness+>             m (PMFun Name, Indexed Name)+> checkDef gam fn tyin pats cover wellfounded = do+>   --x <- expandCon gam (mkapp (Var (UN "S")) [mkapp (Var (UN "S")) [Var (UN "x")]])+>   --x <- expandCon gam (mkapp (Var (UN "vcons")) [RInfer,RInfer,RInfer,mkapp (Var (UN "vnil")) [Var (UN "foo")]])+>   clausesIn <- mapM (expandClause gam) pats+>   let clauses = nub (concat clausesIn)+>   let clauses' = filter (mostSpecClause clauses) clauses+>   (ty@(Ind ty'),_) <- typecheck gam tyin+>   let arity = length (getExpected ty')+>   checkNotExists fn gam+>   gam' <- gInsert fn (G Undefined ty defplicit) gam+>   clauses' <- validClauses gam' fn ty clauses'+>   pmdef <- matchClauses gam' fn pats tyin cover clauses'+>   when wellfounded $ checkWellFounded gam fn [0..arity-1] pmdef+>   return (PMFun arity pmdef, ty)+>     where checkNotExists n gam = case lookupval n gam of+>                                 Just Undefined -> return ()+>                                 Just _ -> fail $ show n ++ " already defined"+>                                 Nothing -> return ()+++1) A definition is well founded if, for every clause, there is an argument+position i such that all recursive calls have an argument in position i+which is structurally smaller than the pattern in position i.++An argument position is considered 'well-founded' if+in any recursive call, it has a structurally smaller argument.++A clause is well-founded if there are no recursive calls, or it has a+well-founded argument in common with all other recursive calls. We keep a list+of which arguments are well-founded++[REMOVED: Nested recursive calls are not allowed]+[They are allowed as long as they are also well-founded]++2) Alternatively, a definition is well founded if in every recursive call+there are no increasing arguments and at least one decreasing argument.++> checkWellFounded :: Monad m =>+>                     Gamma Name ->+>                     Name -> -- recursive function name+>                     [Int] -> -- set of well founded args+>                     [PMDef Name] -> m ()+> checkWellFounded gam fn args cs = case cwf1 fn args cs of+>                                     Failure err -> cwf2 fn cs err+>                                     Success v -> return ()+>   where cwf1 fn args [] = return ()+>         cwf1 fn args (c:cs) = do args <- wfClause args c+>                                  cwf1 fn args cs+>+>         cwf2 fn [] _ = return ()+>         cwf2 fn (c:cs) err = do allDec c err+>                                 cwf2 fn cs err++Check for definition 1 above: one argument position is well founded++>         wfClause args (Sch pats (Ind t)) = do+>            let recs = findRec [] t+>            case recs of+>               [] -> return args+>               _ ->  wfRec args pats recs Nothing++Check for definition 2 above: all recursive calls have a decreasing argument+and no increasing arguments++>         allDec (Sch pats (Ind t)) err = do+>            let recs = findRec [] t+>            case allRecDec pats recs of+>              Success v -> return v+>              _ -> fail err++Check each recursive call has at least one decreasing argument and no+increasing arguments (iterature through calls)++>         allRecDec _ [] = return ()+>         allRecDec pats (r:rs) = do oneDec pats r 0 False+>                                    allRecDec pats rs++Check each recursive call has at least one decreasing argument and no+increasing arguments (iterature through arguments in a call)++>         oneDec [] [] i True = return ()+>         oneDec [] [] i False = fail "No decreasing arguments"+>         oneDec (p:ps) (c:cs) i smaller+>                | structurallySmaller c p = oneDec ps cs (i+1) True+>                | ss True c p = oneDec ps cs (i+1) smaller+>                | otherwise = fail $ show c ++ " bigger than " ++ show p++>         findRec args (App f a) = findRec (a:args) f+>         findRec args (P n) | n == fn = [args] +++>                                        -- find nested calls too+>                                        (concat $ map (findRec []) args)+>         findRec args (Label t _) = findRec [] t+>                                    ++ (concat (map (findRec []) args))+>         findRec args (Bind _ (B (Let v) _) (Sc sc)) = findRec [] v +++>                                                     findRec [] sc+>                                    ++ (concat (map (findRec []) args))+>         findRec args (Bind _ _ (Sc sc)) = findRec [] sc+>                                    ++ (concat (map (findRec []) args))+>         findRec args _ = concat $ map (findRec []) args++>         wfRec [] _ _ (Just last) = fail $ "Not a well-founded call: "+>                                             ++ show last+>         wfRec args pats [] _ = return args+>         wfRec args pats (a:as) _ =+>             {- case concat (map (findRec []) a) of+>                (_:_) -> fail $ "Nested recursive calls not allowed "+>                                ++ show (mkRec a)+>                _ -> -}+>               do args <- wfRec1 args 0 pats a+>                  wfRec args pats as (Just (mkRec a))++>         mkRec as = appArgs (P fn) as++>         wfRec1 args i [] [] = return args+>         wfRec1 args i (p:ps) (a:as)+>             | structurallySmaller a p = wfRec1 args (i+1) ps as+>             | otherwise = wfRec1 (args \\ [i]) (i+1) ps as+>         wfRec1 args i _ _ = return args -- variadic function, just stop looking++A non-recursive constructor application is structurally smaller than+anything.++>         structurallySmaller n p = ss False n p+>         ss True n p | pattEq n p = True -- inside, check for equality+>         ss _ n (PCon _ _ _ ps) = any (ss True n) ps -- look under cons+>         ss _ n p | isNonrec (getFun n) = True+>         ss _ _ _ = False++>         pattEq (P n) (PVar n') = n == n'+>         pattEq (Con t _ _) (PCon t' _ _ []) = t == t'+>         pattEq (App f a) (PCon t' _ _ xs) = eqApp t' (App f a) (reverse xs)+>             where eqApp t (App f a) (x:xs) = pattEq a x && eqApp t f xs+>                   eqApp t (Con t' _ _) [] = t == t'+>                   eqApp _ _ _ = False+>         pattEq _ _ = False++>         isNonrec (Con _ n _) = not (recCon n gam)+>         isNonrec _ = False++For each Raw clause, try to match it against a generated and checked clause.+Match up the inferred arguments to the names (so getting the types of the+names bound in patterns) then type check the right hand side.++> matchClauses :: Monad m => Gamma Name -> Name -> [PMRaw] -> Raw ->+>                 Bool -> -- Check coverage+>                 [(Indexed Name, Indexed Name)] -> m [PMDef Name]+> matchClauses gam fn pats tyin cover gen = do+>    let raws = zip (map mkRaw pats) (map getRet pats)+>    checkpats <- mapM (mytypecheck gam) raws+>    when cover $ checkCoverage (map fst checkpats) (map fst gen)+>    return $ map (mkScheme gam) checkpats++    where mkRaw (RSch pats r) = mkPBind pats tyin r+          mkPBind [] _ r = r+          mkPBind (p:ps) (RBind n (B _ t) tsc) r+              = RBind n (B (Pattern p) t) (mkPBind ps tsc r)++>   where mkRaw (RSch pats r) = mkapp (Var fn) pats+>         getRet (RSch pats r) = r+>         mytypecheck gam (clause, ret) =+>             do (tm@(Ind tmtt), pty,+>                 rtm@(Ind rtmtt), rty, env) <-+>                   checkAndBindPair gam clause ret+>                unified <- unifyenv gam env pty rty+>                let rtmtt' = substNames unified rtmtt+>                -- checkConvEnv env gam pty rty $ "Pattern error: " ++ show pty ++ " and " ++ show rty ++ " are not convertible " ++ show unify+>                let namesret = filter notGlobal $ getNames (Sc rtmtt')+>                let namesbound = getNames (Sc tmtt)+>                checkAllBound namesret namesbound (Ind rtmtt') tmtt+>                return (tm, Ind rtmtt')+>         notGlobal n = case lookupval n gam of+>                         Nothing -> True+>                         _ -> False+>         checkAllBound r b rhs clause = do+>              let unbound = filter (\y -> not (elem y b)) r+>              if (length unbound == 0)+>                 then return ()+>                 else fail $ "Unbound names in clause for " ++ show clause ++ ":\n" ++ show rhs ++ "\n"+>                             ++ show unbound ++ "\n"++> mkScheme :: Gamma Name -> (Indexed Name, Indexed Name) -> PMDef Name+> mkScheme gam (Ind pat, ret) = Sch (map mkpat (getPatArgs pat)) ret+>   where mkpat (P n) = PVar n+>         mkpat (App f a) = addPatArg (mkpat f) (mkpat a)+>         mkpat (Con i nm ar) = mkPatV nm (lookupval nm gam)+>         mkpat (Const c) = PConst c+>         mkpat _ = PTerm++>         mkPatV n (Just (DCon t x)) = PCon t n (tyname n) []+>         mkPatV n _ = PVar n+>         tyname n = case (getTyName gam n) of+>                         Just x -> x++>         addPatArg (PCon i t ty args) arg = PCon i t ty (args++[arg])+>         addPatArg _ _ = PTerm++>         getPatArgs (App (P f) a) = [a]+>         getPatArgs (App f a) = getPatArgs f ++ [a]+>         getPatArgs _ = []++Return whether the patterns in the first argument cover the necessary+cases in the second argument. Each of the necessary cases in 'covering'+must match one of 'pats'.+fails, reporting which case isn't matched, if patterns don't cover.++> checkCoverage :: Monad m => [Indexed Name] -> [Indexed Name] -> m ()+> checkCoverage pats [] = return ()+> checkCoverage pats (c:cs)+>     | length (filter (matches c) pats) > 0 = checkCoverage pats cs+>     | otherwise = fail $ "Missing clause: " ++ show c++> matches (Ind p) (Ind t) = matches' p t+> matches' (App f a) (App f' a') = matches' f f' && matches' a a'+> matches' (Con _ x _) (Con _ y _) | x == y = True+> matches' (TyCon x _) (TyCon y _) | x == y = True+> matches' (P x) (P y) | x == y = True+> matches' (P (MN ("INFER",_))) _ = True+> matches' _ (P _) = True+> matches' x y = x == y+++> expandClause :: Monad m => Gamma Name -> RawScheme -> m [RawScheme]+> expandClause gam (RSch ps ret) = do+>   expanded <- mapM (expandCon gam) ps+>   return $ map (\p -> RSch p ret) (combine expanded)++Remove the clauses which can't possibly be type correct.++> validClauses :: Monad m => Gamma Name -> Name -> Indexed Name ->+>                 [RawScheme] -> m [(Indexed Name, Indexed Name)]+> validClauses gam fn ty cs = do+>     -- add fn:ty to the context as an axiom+>     checkValid gam [] cs+>  where checkValid gam acc [] = return acc+>        checkValid gam acc ((RSch c r):cs)+>           = do let app = mkapp (Var fn) c+>                case typecheck gam app of+>                  Nothing -> checkValid gam acc cs+>                  Just (v,t) -> checkValid gam ((v,t):acc) cs+++Return true if the given pattern clause is the most specific in a list++> mostSpecClause :: [RawScheme] -> RawScheme -> Bool+> mostSpecClause cs c = msc c (filter (/= c) cs)+>    where msc c [] = True+>          msc c (x:xs) | moreSpecClause x c = False+>                       | otherwise = msc c xs++> moreSpecClause (RSch pa _) (RSch pb _)+>    = moreSpecClause' pa pb++> moreSpecClause' :: [Raw] -> [Raw] -> Bool+> moreSpecClause' [] [] = True+> moreSpecClause' (x:xs) (y:ys)+>       | moreSpec x y = moreSpecClause' xs ys+>       | x == y = moreSpecClause' xs ys+>       | otherwise = False+> -- Differing numbers of arguments; ignore it, it'll be caught as a type+> -- error elsewhere+> moreSpecClause' _ _ = False+++> showClauses [] = ""+> showClauses ((x,r):xs) = show x ++ " -> " ++ show r ++ "\n" ++ showClauses xs+++Given a raw term, recursively expand all of its arguments which are in+constructor form++> expandCon :: Monad m => Gamma Name -> Raw -> m [Raw]+> expandCon gam r = do+>     let f = getappfun r+>     let as = getappargs r+>     expandas <- mapM (expandCon gam) as+>     -- expandas contains all the possibilites for each argument+>     -- [[arg1poss1,arg1poss2,...], [arg2poss1,arg2pss2,...], ...]+>     case isConPatt gam f of+>         Nothing -> return.mostSpec $ expandf RInfer expandas+>         Just ns -> return.mostSpec $ (expandf f expandas) ++ (mkConPatts ns)+>   where expandf :: Raw -> [[Raw]] -> [Raw]+>         expandf f args = map (mkapp f) (combine args)+>         mkConPatts [] = []+>         mkConPatts ((n,ar):xs)+>            = (mkapp (Var n) (take ar (repeat RInfer))):(mkConPatts xs)++Turn a list of possibilities for each argument into a list of all+possible applications++> combine :: [[a]] -> [[a]]+> combine [] = [[]]+> combine [arg] = map (\x -> [x]) arg+> combine (arg:rest) = addEach arg (combine rest)+>     where addEach [] rest = []+>           addEach (x:xs) rest = (map (x:) rest) ++ (addEach xs rest)++Filter out more general entries; e.g. if (c _ _) and (c_ (d _)) keep the latter+only++> mostSpec :: [Raw] -> [Raw]+> mostSpec xs = ms' xs []+>   where ms' [] acc = acc+>         ms' (x:xs) acc | x `lessSpec` xs || x `lessSpec` acc = ms' xs acc+>                        | otherwise = ms' xs (x:acc)+>         lessSpec x [] = False+>         lessSpec x (y:ys) = (moreSpec y x) || x==y || (lessSpec x ys)++> moreSpec :: Raw -> Raw -> Bool+> moreSpec (Var _) (Var _) = False+> moreSpec RInfer RInfer = False+> moreSpec _ RInfer = True+> moreSpec (RApp x y) (RApp x2 y2) = moreSpec x x2 || (x==x2 && moreSpec y y2)+> moreSpec _ _ = False++Given a raw term, return whether it is a constructor pattern. If so,+return all of the constructor names and arities++> isConPatt :: Gamma Name -> Raw -> Maybe [(Name, Int)]+> isConPatt gam r | (Var name) <- getappfun r = do+>     conty <- lookuptype name gam+>     case getappfun (getrettype (forget conty)) of+>          (Var tyname) -> do+>              TCon i (Elims _ _ cons) <- lookupval tyname gam+>              return $ map (\n -> (n, arity n)) cons+>          _ -> Nothing+>                 | otherwise = Nothing+>   where arity nm = case lookuptype nm gam of+>                      Just (Ind ty) -> length (getExpected ty)+>                      -- Nothing can't happen++ checkClause gam n (RSch pats ret) =++ generateAll :: Monad m => Gamma Name -> Name -> Raw -> [PMRaw] -> m [PMRaw]+ generateAll gam n tyin pats = do+   (Ind ty, tyty) <- typecheck gam tyin+   checkConv gam tyty (Ind Star) "Type of function must be of type *"+   let args = getPatPos (length (getArgs ty)) pats+   trace (show args) $ fail "unfinished"++Get the argument positions which have patterns in them (rather than match+anything or just variables)++ getPatPos :: Int -> [PMRaw] -> [Int]+ getPatPos numargs [] = [0..numargs-1]+ getPatPos numargs ((RSch pats ret):xs) =+     union (gpp 0 pats) (getPatPos numargs xs)+   where gpp pos [] = []+         gpp pos ((PCon _ _ _ _):xs) = pos:(gpp (pos+1) xs)
+ Ivor/Plugin.lhs view
@@ -0,0 +1,82 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> -- | +> -- Module      : Ivor.Plugin+> -- Copyright   : Edwin Brady+> -- Licence     : BSD-style (see LICENSE in the distribution)+> --+> -- Maintainer  : eb@dcs.st-and.ac.uk+> -- Stability   : experimental+> -- Portability : portable+> -- +> -- Plugin loader++> module Ivor.Plugin(Ivor.Plugin.load) where++> import Ivor.TT+> import Ivor.ShellState++> import System.Plugins as Plugins+> import Text.ParserCombinators.Parsec++> -- | Load the given plugin file (which should be a full path to a .o or+> -- .hs file) and update the Context. If it is a .hs file, it will be+> -- compiled if necessary.+> -- Plugins must contain the symbol+> -- @plugin_context :: Monad m => Context -> m Context@+> -- which updates the context. It may optionally contain symbols+> -- @plugin_parser :: Parser ViewTerm@+> -- which adds new parsing rules,+> -- @plugin_shell :: ShellState -> IO ShellState@+> -- which updates the shell+> -- @plugin_commands :: IO [(String, String -> COntext -> IO (String, Context))]@+> -- which adds new user defined commands (which may need to do some setting up themselves, hence the IO)+> -- Returns the new context and the extra parsing rules and commands, if any.++> load :: FilePath -> Context -> IO (Context, +>               Maybe (Parser ViewTerm),+>               Maybe (ShellState -> IO ShellState),+>               Maybe (IO [(String, String -> Context -> IO (String, Context))]))+> load fn ctxt = do +>          objIn <- compilePlugin fn+>          obj <- case objIn of+>                    Left errs -> fail errs+>                    Right ok -> return ok+>          contextMod <- Plugins.load_ obj [] "plugin_context"+>          -- mv <- Plugins.load fn [] ["/Users/edwin/.ghc/i386-darwin-6.6.1/package.conf"] "initialise"+>          (mod, contextFn) <- case contextMod of+>                  LoadFailure msg -> fail $ "Plugin loading failed: " +++>                                              show msg+>                  LoadSuccess mod v -> return (mod, v)+>          parserMod <- Plugins.reload mod "plugin_parser"+>          parserules <- case parserMod of+>                  LoadFailure msg -> return Nothing+>                  LoadSuccess _ v -> return $ Just v+>          cmdMod <- Plugins.reload mod "plugin_commands"+>          cmds <- case cmdMod of+>                  LoadFailure msg -> return Nothing+>                  LoadSuccess _ v -> return $ Just v+>          shellMod <- Plugins.reload mod "plugin_shell"+>          shellfn <- case shellMod of+>                  LoadFailure msg -> return Nothing+>                  LoadSuccess _ v -> return $ Just v+>          ctxt' <- case contextFn ctxt of+>                      Just x -> return x+>                      Nothing -> fail "Error in running plugin_context"+>          return $ (ctxt', parserules, shellfn, cmds)++Make a .o from a .hs, so that we can load Haskell source as well as object+files++> compilePlugin :: FilePath -> IO (Either String FilePath)+> compilePlugin hs +>     | isExt ".hs" hs || isExt ".lhs" hs =+>         do status <- makeAll hs []+>            case status of+>               MakeSuccess c out -> return $ Right out+>               MakeFailure errs -> return $ Left (concat (map (++"\n") errs))+>     | isExt ".o" hs = return $ Right hs+>     | elem '.' hs = return (Left $ "unrecognised file type " ++ hs)+>     | otherwise = compilePlugin (hs++".o")+>   where isExt ext fn = case span (/='.') fn of+>                           (file, e) -> ext == e
+ Ivor/Prefix.hs view
@@ -0,0 +1,1 @@+module Ivor.Prefix where prefix = "/usr/local"
+ Ivor/Primitives.lhs view
@@ -0,0 +1,137 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> -- | +> -- Module      : Ivor.Primitives+> -- Copyright   : Edwin Brady+> -- Licence     : BSD-style (see LICENSE in the distribution)+> --+> -- Maintainer  : eb@dcs.st-and.ac.uk+> -- Stability   : experimental+> -- Portability : non-portable+> -- +> -- Some basic primitive types. Importing this module adds instances+> -- of 'ViewConst' for Int, Float and String (Float is represented by+> -- Haskell Double). 'addPrimitives' should be+> -- used to add these type constructors to the context.++> module Ivor.Primitives(addPrimitives, parsePrimitives, +>                          parsePrimTerm) +>     where++> import Ivor.TT hiding (try)+> import Ivor.TermParser+> import Ivor.ViewTerm++> import Text.ParserCombinators.Parsec+> import Text.ParserCombinators.Parsec.Language+> import qualified Text.ParserCombinators.Parsec.Token as PTok+> import Data.Typeable++> type TokenParser a = PTok.TokenParser a++> lexer :: TokenParser ()+> lexer  = PTok.makeTokenParser haskellDef++> whiteSpace= PTok.whiteSpace lexer+> lexeme    = PTok.lexeme lexer+> symbol    = PTok.symbol lexer+> natural   = PTok.natural lexer+> parens    = PTok.parens lexer+> semi      = PTok.semi lexer+> identifier= PTok.identifier lexer+> reserved  = PTok.reserved lexer+> operator  = PTok.operator lexer+> reservedOp= PTok.reservedOp lexer+> stringlit = PTok.stringLiteral lexer+> float     = PTok.float lexer+> lchar = lexeme.char++> instance ViewConst Int where+>     typeof x = (name "Int")++> instance ViewConst Double where+>     typeof x = (name "Float")++> instance ViewConst String where+>     typeof x = (name "String")++> -- | Add primitive types for Int, Float and String, and some+> -- primitive operations [add,sub,mult,div][int,float] and concat.++> addPrimitives :: Monad m => Context -> m Context+> addPrimitives c = do c <- addPrimitive c (name "Int")+>                      c <- addPrimitive c (name "Float")+>                      c <- addPrimitive c (name "String")+>                      c <- addBinOp c (name "addInt") ((+)::Int->Int->Int) +>                               "(x:Int)(y:Int)Int"+>                      c <- addBinOp c (name "subInt") ((-)::Int->Int->Int) +>                               "(x:Int)(y:Int)Int"+>                      c <- addBinOp c (name "multInt") ((*)::Int->Int->Int) +>                               "(x:Int)(y:Int)Int"+>                      c <- addBinOp c (name "divInt") +>                               ((div)::Int->Int->Int) +>                               "(x:Int)(y:Int)Int"+>                      c <- addBinOp c (name "addFloat") +>                               ((+)::Double->Double->Double) +>                               "(x:Float)(y:Float)Float"+>                      c <- addBinOp c (name "subFloat") +>                               ((-)::Double->Double->Double) +>                               "(x:Float)(y:Float)Float"+>                      c <- addBinOp c (name "multFloat") +>                                ((*)::Double->Double->Double) +>                               "(x:Float)(y:Float)Float"+>                      c <- addBinOp c (name "divFloat") +>                                ((/)::Double->Double->Double) +>                               "(x:Float)(y:Float)Float"+>                      c <- addBinOp c (name "concat") +>                               ((++)::String->String->String) +>                               "(x:String)(y:String)String"+>                      c <- addPrimFn c (name "intToNat") intToNat+>                               "(x:Int)Nat"+>                      c <- addPrimFn c (name "intToString") +>                               intToString+>                               "(x:Int)String"+>                      c <- addExternalFn c (name "stringEq") 2+>                               stringEq+>                               "(x,y:String)Bool"+>                      return c++> intToNat :: Int -> ViewTerm+> intToNat 0 = Name DataCon (name "O")+> intToNat n = App (Name DataCon (name "S")) (intToNat (n-1))++> intToString :: Int -> ViewTerm+> intToString n = Constant (show n)++> stringEq :: [ViewTerm] -> Maybe ViewTerm+> stringEq [Constant x, Constant y] +>     = case cast x of+>          Just x' -> if (x' == y) +>                       then Just $ Name DataCon (name "true")+>                       else Just $ Name DataCon (name "false")+>          _ -> Just $ Name DataCon (name "false")+> stringEq [_, _] = Nothing+++> -- | Parse a primitive constant++> parsePrimitives :: Parser ViewTerm+> parsePrimitives = try (do x <- float+>                           return $ Constant x)+>               <|> do x <- stringlit+>                      return $ Constant x+>               <|> do x <- parseInt+>                      return $ Constant x++> parseInt :: Parser Int+> parseInt = lexeme $ fmap read (many1 digit)++> -- | Parse a term including primitives+> parsePrimTerm :: Monad m => String -> m ViewTerm+> parsePrimTerm str+>     = case parse (do t <- pTerm (Just parsePrimitives) ; eof ; return t) +>                  "(input)" str of+>           Left err -> fail (show err)+>           Right tm -> return tm+
+ Ivor/RunTT.lhs view
@@ -0,0 +1,104 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.RunTT where++Representation of the run-time language.+Used for spitting out GHC core.++> import Ivor.TTCore+> import Ivor.Gadgets+> import Ivor.ICompile+> import Ivor.Nobby++When we compile, we need to know the term as well as bits of info about+its type, ie its arity and emptiness.++> type RunValue = (RunTT, TypeInfo)++> data RunTT =+>        RTVar Int -- de Bruijn level+>      | RTFun Name+>      | RTCon Int Name [RunValue] -- Fully applied, Name is for display only+>      | RTElim Name RunValue RunValue [RunValue] -- Fully applied, with+>                               -- target, motive, methods+>      | RTApp RunValue [RunValue]+>      | RTBind (RTBinder,TypeInfo) RunValue +>      | RTCase Name RunValue [RunValue] -- name is type case is on+>      | RTProj Name Int RunValue -- name is type we're projecting from+>      | forall c. Constant c => RTConst c+>      | RTypeVal -- Useless, uninspectable type value+>      | RTCantHappen -- Flag on unexecutable code+>   -- deriving Show++> data RTBinder = RTLam+>	        | RTPi+>	        | RTLet RunValue+> --  deriving Show++> data TypeInfo = TI Int Bool -- Arity, emptiness (whether its the empty type)+>   deriving Show++> newtype RunTTs = RGam [(Name,RunTT)]++Make a term in RunTT from a de Bruijn levelled representation++> mkRTFun :: Gamma Name -> Levelled Name -> RunTT+> mkRTFun gam (Lev term) = mkrt 0 term where+>    mkrt l (P n) = RTFun n+>    mkrt l (V x) = RTVar x+>    mkrt l (Con t n 0) = RTCon t n []+>    mkrt l c@(Con t n a) = mkApp l c []+>    mkrt l (TyCon n x) = RTypeVal+>    mkrt l (Elim n) = RTFun n+>    mkrt l c@(App f a) = mkApp l c []+>    mkrt l (Bind n b (Sc sc)) = RTBind (mkBinder l b) +>			            ((mkrt (l+1) sc), TI 0 False)+>    mkrt l (Proj n i t) = RTProj n i (mkrt l t, TI 0 False)+>    mkrt l (Label t _) = mkrt l t+>    mkrt l (Call _ t) = mkrt l t+>    mkrt l (Return t) = mkrt l t+>    mkrt l (Const c) = RTConst c -- error "Sorry, I don't know how to compile constants yet"+>    mkrt l (Stage _) = error "Sorry, I can't compile multi-stage programs."+>    mkrt l Star = RTypeVal++>    mkBinder l (B Lambda t) = (RTLam, TI 0 False)+>    mkBinder l (B (Let v) t) = (RTLet (mkrt l v, TI 0 False), TI 0 False)+>    mkBinder l (B Pi t) = (RTPi, TI 0 False)++>    mkApp l (App f a) sp = mkApp l f ((mkrt l a, TI 0 False):sp)+>    mkApp l (Con t n a) sp | length sp == a = RTCon t n sp+>		            | otherwise = saturate l a (length sp) +>                                            (RTCon t n sp) (RTCon t n sp)+>    mkApp l x sp = RTApp (mkrt l x, TI (length sp) False) sp++>    saturate lev arity splen acc (RTCon t n sp) -- cached inner constructor+>        | splen == arity = acc+>        | otherwise = let newcon = RTCon t n (sp++[(RTVar lev, TI 0 False)]) in+>            saturate (lev+1) arity (splen+1)+>               (RTBind (RTLam, TI 0 False) (newcon, TI 0 False)) +>                  newcon+>    ++let c = mkRawApp (Con tag naem arity) sp in+                  error $ "Saturate " ++ show c++    mkRawApp = forget mr+      where mr f [] = f+            mr f (x:xs) = mr (App f x) xs+++error "Constructor saturation unimplemented"++Make an elimination rule in RunTT from a simple case expression++> mkRTElim :: Name -> Int -> SimpleCase -> RunTT+> mkRTElim ename arity es = fst $ abstract arity (mkrt es)+>    where mkrt Impossible = RTCantHappen+>          mkrt (IReduce t) = mkRTFun (Gam []) (mkvarnum t)+>          mkrt (Case ty x cs) = RTCase ty (RTVar (arity-x-1), TI 0 False)+>		                  (map mkcase cs)+>	   mkcase c = (mkrt c, TI 0 False)+>          mkvarnum (Ind t) = Lev $ vapp (\ (ctx,i) -> V (arity-i-1)) t++>          abstract 0 t = (t, TI 0 False)+>          abstract n t = (RTBind (RTLam, TI 0 False) (abstract (n-1) t), TI 0 False)
+ Ivor/SC.lhs view
@@ -0,0 +1,174 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.SC where++Lambda lifter. Two bits:++lift: Takes a TT function definition and returns a set of supercombinators.+elimSC: Takes a simple case expression and returns a supercombinator.++> import Ivor.Grouper+> import Ivor.TTCore+> import Ivor.Nobby+> import Ivor.ICompile+> import Ivor.Constant++> import Debug.Trace++> data SCName = N Name+>             | SN Name Int+>   deriving Eq++> instance Show SCName where+>     show (N n) = show n+>     show (SN n i) = "$"++show n ++show i++> type SCs = [(SCName, (Int, SC))]++> data SC = SLam [SCBody] SCBody++> data SCBody+>     = SP SCName+>     | SV Int+>     | SCon Int SCName [SCBody]+>     | STyCon SCName Int+> {-     | SElim SCName -}+>     | SApp SCBody [SCBody]+>     | SLet SCBody SCBody SCBody+>     | SPi SCBody SCBody+>     | SProj Int SCBody+>     | forall c. Constant c => SConst c+>     | SStar+>     | SCase Int [SCBody]+>     | SCantHappen+>     | SSomeType+>  -- deriving Show++Turn a well typed term with de Bruijn levels into a set of supercombinators.+The main supercombinator will have the given name++> lift :: Name -> Levelled Name -> SCs+> lift basename t = collect basename (group (fmap N t))++> collect :: Name -> GroupTT SCName -> [(SCName,(Int,SC))]+> collect basename g = snd $ sc (N basename) [] 0 [] g where+>    sc name args next scs (GLam args' lev body)+>        = let (next',scs',scargs) = sclist args next scs args'+>              (next'',scs'',scb) = scbody (args++scargs) next' scs' body +>              newsc = SLam (args++scargs) scb in+>              (next'',((name, (length (args++scargs),newsc)):scs''))+>    sc name args next scs body+>        = let (next',scs',scb) = scbody [] next scs body+>              newsc = SLam [] scb in+>	       (next',((name,(0,newsc)):scs'))++Do the tricky case first.  +This is the quick hack version; it ought to+check that previously bound variables are actually used.++>    scbody args next scs b@(GLam args' l body) +>        = let (next',scs') = sc (SN basename next) args (next+1) scs+>		                 (GLam args' 0 body) in+>          (next',scs',mkapp (SP (SN basename next)) (argvals args))+>      where mkapp x [] = x+>            mkapp x as = SApp x as+>            argvals xs = map SV [0..(length xs)-1]++Everything else is pretty much structural...++>    scbody args next scs (GP n) = (next, scs, SP n)+>    scbody args next scs (GV i) = (next, scs, SV i)+>    scbody args next scs (GCon i n as) =+>             let (next',scs',scas) = sclist args next scs as in+>	      (next',scs',SCon i n scas)+>    scbody args next scs (GTyCon n i) = (next,scs,STyCon n i)+>    scbody args next scs (GElim n) = (next, scs, SP n)+>    scbody args next scs (GApp f as) =+>             let (next',scs',scf) = scbody args next scs f +>                 (next'',scs'',scas) = sclist args next' scs' as in+>	      (next'',scs'',SApp scf scas)+>    scbody args next scs (GLet t v sc) =+>             let (next',scs',sct) = scbody args next scs t+>                 (next'',scs'',scv) = scbody args next' scs' v+>                 (next''',scs''',scsc) = scbody (args++[sct]) next'' scs'' sc in+>	      (next''',scs''',SLet sct scv scsc)+>    scbody args next scs (GPi t sc) =+>             let (next',scs',sct) = scbody args next scs t+>                 (next'',scs'',scsc) = scbody args next' scs' sc in+>	      (next'',scs'',SPi sct scsc)+>    scbody args next scs (GProj i t) =+>             let (next',scs',sct) = scbody args next scs t in+>	      (next',scs',SProj i sct)+>    scbody args next scs (GConst c) = (next,scs,SConst c)+>    scbody args next scs GStar = (next,scs,SStar)+>    scbody _ next scs GCant = (next,scs,SCantHappen)++>    sclist args next scs [] = (next,scs,[])+>    sclist args next scs (x:xs) +>          = let (next',scs',xsc) = scbody args next scs x+>                (next'',scs'',xscs) = sclist args next' scs' xs in+>                (next'',scs'',xsc:xscs)+++Turn a simple case tree into a supercombinator++> elimSC :: Name -> Levelled Name -> SimpleCase -> SC+> elimSC ename (Lev rtype) es = SLam (mkargs rtype) (mksc es)+>    where mksc Impossible = SCantHappen+>          mksc (IReduce t) = mkreduce (mkvarnum t)+>          mksc (Case _ x cs) = SCase (arity-x-1)+>		                  (map mksc cs)+>          mkvarnum (Ind t) = vapp (\ (ctx,i) -> V (arity-i-1)) t+>          args = mkargs rtype+>          arity = length args++    Reductions will have no lambdas, so an easy, boring, structural job.+   +>          mkreduce (P n) = SP (N n)+>          mkreduce (Elim n) = SP (N n)+>          mkreduce (V x) = SV x+>	   mkreduce ap@(App f a) = mkapp ap []+>          mkreduce (Proj _ i t) = SProj i (mkreduce t)+>          mkreduce (TyCon n i) = STyCon (N n) i+>          mkreduce (Con i t a) = SSomeType+>          mkreduce x = SSomeType++>          mkapp (App f a) sp = mkapp f ((mkreduce a):sp)+>          mkapp x sp = SApp (mkreduce x) sp++>          mkargs (Bind n (B Pi t) (Sc sc)) = (mkreduce t):(mkargs sc)+>          mkargs t = []++Ugly printer++> instance Show SC where+>     show = showSC+++> showSCs :: SCs -> String+> showSCs [] = ""+> showSCs ((n,(a,sc)):xs) = show n ++ "("++show a++") = " ++ showSC sc ++ "\n" ++ showSCs xs++> showSC (SLam args body) = "\\" ++ showargs 0 args ++ " -> " ++ showBody body+>   where showargs i [] = ""+>         showargs i (x:xs) = "v" ++ show i ++ ":" ++ showBody x ++ " " ++ showargs (i+1) xs++> showBody (SP n) = show n+> showBody (SV i) = "v"++show i+> showBody (SCon i n bs) = show n ++ "<" ++ showBs bs ++ ">"+> showBody (STyCon n i) = show n+> --showBody (SElim n) = show n+> showBody (SApp f as) = showBody f ++ "(" ++ showBs as ++ ")"+> showBody (SLet t v b) = "let " ++ showBody v ++ ":" ++ showBody t ++ " in "+>					   ++ showBody b+> showBody (SPi t sc) = "{"++showBody t++"}"++showBody sc+> showBody (SProj i sc) = "("++showBody sc++")!"++show i+> showBody (SConst c) = show c+> showBody (SCantHappen) = "Impossible"+> showBody (SSomeType) = "Unknown"+> showBody (SCase e cs) = "case v" ++ show e ++ " {" ++ showBs cs ++ "}"+> showBody (SStar) = "*"++> showBs [] = ""+> showBs [x] = showBody x+> showBs (x:xs) = showBody x ++ "," ++ showBs xs
+ Ivor/Shell.lhs view
@@ -0,0 +1,433 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> -- |+> -- Module      : Ivor.Shell+> -- Copyright   : Edwin Brady+> -- Licence     : BSD-style (see LICENSE in the distribution)+> --+> -- Maintainer  : eb@dcs.st-and.ac.uk+> -- Stability   : experimental+> -- Portability : non-portable+> --+> -- Shell interface to theorem prover++> module Ivor.Shell(ShellState,+>                     runShell, importFile, addModulePath, addStdlibPath,+>                     prefix, getContext, newShell, updateShell,+>                     sendCommand, sendCommandIO, addTactic, addCommand,+>                     extendParser, configureEq,+>                     shellParseTerm, showProofState, response) where++> import Ivor.ShellState+> import Ivor.ShellParser+> import Ivor.TermParser+> import Ivor.TT as TT+> import Ivor.Construction+> import Ivor.Equality+> import Ivor.Gadgets+> import Ivor.Primitives+> import qualified Ivor.Prefix+> import Ivor.Plugin++> import System.Exit+> import System.Environment+> import System.Directory+> import System.IO+> import Data.Char+> import Debug.Trace++> import Text.ParserCombinators.Parsec++> respond, respondLn :: ShellState -> String -> ShellState+> respond st str = st { response = (response st) ++ str }+> respondLn st str = st { response = (response st) ++ str ++ "\n" }++> clearResponse st = st { response = "" }++> -- | Create a new shell state.+> newShell :: Context -- ^ Initial system state+>          -> ShellState+> newShell ctxt = Shell Nothing "> " False ctxt "" [] [] [] Nothing []++> -- | Update the context in a shell+> updateShell :: Monad m =>+>                (Context -> m Context) -- ^ Function to update context+>                -> ShellState -> m ShellState+> updateShell fctxt (Shell r p f c resp tacs coms imp ext path)+>     = do ctxt <- fctxt c+>          return (Shell r p f ctxt resp tacs coms imp ext path)++> -- | Add a user defined tactic to the shell.+> addTactic :: String -- ^ Tactic name.+>           -> (String -> Tactic) -- ^ Tactic function. The argument is whatever was input on the shell; the function is responsible for parsing this.+>           -> ShellState -- ^ Shell to which to add the tactic.+>           -> ShellState+> addTactic nm tac st = st { usertactics = (nm,tac):(usertactics st) }++> -- | Add a user defined command to the shell.+> addCommand :: String -- ^ Command name.+>            -> (String -> Context -> IO (String, Context)) -- ^ Command function. The argument is whatever was input on the shell; the function is responsible for parsing this. The command returns a string (the response) and a possibly updated context.+>            -> ShellState -- ^ Shell to which to add the command.+>            -> ShellState+> addCommand nm com st = st { usercommands = (nm, com):(usercommands st) }++> -- | Add another parsing rule for parsing terms.+> extendParser :: ShellState -> Parser ViewTerm -> ShellState+> extendParser st ext = case (extensions st) of+>                          Nothing -> st { extensions = Just ext }+>                          Just p -> st { extensions = Just (p <|> ext) }++> -- | Parse a term using the shell's current parser extensions+> shellParseTerm :: ShellState -> Parser ViewTerm+> shellParseTerm st = pTerm (extensions st)++> -- | Get the system state from a finished shell+> getContext :: ShellState -> Context+> getContext = context++> readToSemi :: IO String+> readToSemi =+>   do c <- getChar+>      if (c==';')+>         then return ";"+>         else do s <- readToSemi+>                 return (c:s)++ output st = hPutStr (outputstream st)+ outputLn st x = output st (x++"\n")++> runCommand :: (Monad m) => Command -> ShellState -> m ShellState+> runCommand (Def nm tm) st = do let (_, tm') = addImplicit (context st) tm+>                                ctxt <- addDef (context st) (name nm) tm'+>                                return st { context = ctxt }+> runCommand (TypedDef nm tm ty) st = do+>     ctxt <- addTypedDef (context st) (name nm) tm ty+>     return st { context = ctxt }+> runCommand (PatternDef nm ty pats opts) st = do+>     ctxt <- addPatternDef (context st) (name nm) ty pats opts+>     return st { context = ctxt }+> runCommand (Data dat) st = do ctxt <- addData (context st) dat+>                               return st { context = ctxt }+> runCommand (Axiom nm tm) st = do ctxt <- addAxiom (context st) (name nm) tm+>                                  return st { context = ctxt }+> runCommand (Declare nm tm) st = do ctxt <- declare (context st) (name nm) tm+>                                    return st { context = ctxt }+> runCommand (DeclareData nm tm) st+>                = do ctxt <- declareData (context st) (name nm) tm+>                     return st { context = ctxt }+> runCommand (Theorem nm ty) st = do ctxt <- theorem (save (context st))+>                                                    (name nm) ty+>                                    let st' = respond st $+>                                          showProofState st { context = ctxt }+>                                    return st' { context = ctxt }+> runCommand (Interactive nm ty) st = do+>     ctxt <- interactive (save (context st))+>                 (name nm) ty+>     let st' = respond st $+>           showProofState st { context = ctxt }+>     return st' { context = ctxt }+> runCommand (Forget n) st = do+>     ctxt <- forgetDef (context st) (name n)+>     return $ (respondLn st ("Forgotten back to " ++ n))+>                { context = ctxt }+> runCommand (EvalTerm exp) st+>        | proving (context st) = do+>                       tm <- evalCtxt (context st) defaultGoal exp+>                       return (respondLn st (show tm))+>        | otherwise = do+>                       tm <- check (context st) exp+>                       return (respondLn st (show (eval (context st) tm)))+> runCommand (WHNF exp) st+> {-        | proving (context st) = do+>                       tm <- newevalCtxt (context st) defaultGoal exp+>                       return (respondLn st (show tm))+>        | otherwise -}+>                    = do+>                       tm <- check (context st) exp+>                       return (respondLn st (show (whnf (context st) tm)))+> runCommand (Print n) st = do+>     case (getDef (context st) (name n)) of+>       Just tm -> return (respondLn st (show (view tm)))+>       _ -> case (getPatternDef (context st) (name n)) of+>             Just pats -> return (respondLn st (printPats pats))+>             _ -> do tm <- check (context st) n+>                     case view tm of+>                         (Name TypeCon _) -> return (respondLn st "Type constructor")+>                         (Name ElimOp _) -> return (respondLn st "Elimination operator")+>                         (Name Free _) -> return (respondLn st "Undefined function")+>                         (Name DataCon _) -> return (respondLn st "Data constructor")+>                         _ -> fail "Unknown definition"+>     where printPats (Patterns cs) = unlines (map printClause cs)+>           printClause (PClause args ret) = n ++ " " +++>                                            unwords (map argshow args) +++>                                            " = " ++ show ret+>           argshow x | ' ' `elem` show x = "(" ++ show x ++ ")"+>                     | otherwise = show x++> runCommand (Check exp) st = do+>     tm <- check (context st) exp+>     return (respondLn st (show (viewType tm)))+> runCommand (Freeze n) st = do ctxt <- freeze (context st) (name n)+>                               return st { context = ctxt }+> runCommand (Thaw n) st = do ctxt <- thaw (context st) (name n)+>                             return st { context = ctxt }+> runCommand (Focus n) st = do ctxt <- focus (goal n) (context st)+>                              return st { context = ctxt }+> runCommand (Dump n) st = do+>     let ds = getAllDefs (context st)+>     return (respondLn st (dumpAll n ds))+> runCommand (ReplData eq repl sym) st+>     = return st { repldata = Just (eq, repl, sym) }+> runCommand Prf st = do+>     tm <- proofterm (context st)+>     return (respondLn st (show tm))+> runCommand PrfState st = do let st' = respond st $ showProofState st+>                             return st'+> runCommand Qed st = do ctxt <- qed (context st)+>                        return st { context = (clearSaved ctxt) }+> runCommand Suspend st = do let st' = respondLn st "Suspending Proof"+>                            return st' { context = suspend (context st) }+> runCommand (Resume n) st = do ctxt <- resume (context st) (name n)+>                               let st' = respondLn st $ "Resuming proof of " ++ n+>                               ctxt <- if (numUnsolved ctxt) == 1+>                                        then attack defaultGoal ctxt+>                                        else return ctxt+>                               let st'' = respond st' $+>                                          showProofState st' { context = ctxt }+>                               return st'' { context = ctxt }+> runCommand Undo st = do ctxt <- restore (context st)+>                         let st' = respondLn st $+>                                      showProofState st { context = ctxt }+>                         return st' { context = ctxt }+> runCommand (Ivor.ShellParser.GenRec n) st+>     = do ctxt <- addGenRec (context st) (name n)+>          let st' = respondLn st $ "Added general recursion rule"+>          return st' { context = ctxt }+> runCommand (JMEq n c) st = do ctxt <- addEquality (context st) (name n)+>                                         (name c)+>                               let st' = respondLn st $ "Added dependent equality"+>                               return st' { context = ctxt }+> runCommand Primitives st = do let st' = extendParser st parsePrimitives+>                               ctxt <- addPrimitives (context st')+>                               return st' { context = ctxt }+> runCommand Drop st = return st { finished = True }+> runCommand (Load f) st = fail "Can only load in a shell -- use importFile instead"+> runCommand (Plugin f) st = fail "Can only load plugin in a shell -- use Plugin.load instead"+> runCommand (Compile f) st = fail "Can only Compile in a shell -- use 'compile' function instead"+> runCommand (UserCommand _ _) st = fail "Can only run user commands in a shell"++> runTactic _ _ Attack = attack+> runTactic _ _ (AttackWith n) = attackWith (name n)+> runTactic _ _ (Claim n tm) = claim (name n) tm+> runTactic _ _ (Local n tm) = \g ctxt -> do+>                            ctxt <- claim (name n) tm g ctxt+>                            focus (goal n) ctxt+> runTactic _ _ (Refine tm args) = refineWith tm args+> runTactic _ _ Solve = solve+> runTactic _ _ (Fill tm) = fill tm+> runTactic _ _ ReturnTac = returnComputation+> runTactic _ _ QuoteTac = quoteVal+> runTactic _ _ (CallTac tm) = call tm+> runTactic _ _ Abandon = abandon+> runTactic _ _ (Rename n) = rename (name n)+> runTactic _ _ Intro = intro+> runTactic _ _ (IntroName n) = introName (name n)+> runTactic _ _ Intros = intros+> runTactic _ _ (IntrosNames ns) = introsNames (map name ns)+> runTactic _ _ (Equiv tm) = equiv tm+> runTactic _ _ (AddArg nm tm) = addArg (name nm) tm+> runTactic _ _ (Generalise False tm) = generalise tm+> runTactic _ _ (Generalise True tm) = dependentGeneralise tm+> runTactic _ (Just (eq,repl,sym)) (Replace tm f)+>     = replace eq repl sym tm f+> runTactic _ Nothing (Replace _ _) = fail "replace not configured"+> runTactic _ _ (Axiomatise n ns) = axiomatise (name n) (map name ns)+> runTactic _ _ Normalise = compute+> runTactic _ _ (Unfold n) = unfold (name n)+> runTactic _ _ Trivial = trivial+> runTactic _ _ Split = split+> runTactic _ _ LeftCon = left+> runTactic _ _ RightCon = right+> runTactic _ _ AutoSolve = auto 20+> runTactic _ _ (Exists tm) = exists tm+> runTactic _ _ (By tm) = by tm+> runTactic _ _ (Induction tm) = induction tm+> runTactic _ _ (Cases tm) = cases tm+> runTactic _ _ (Decide me) = isItJust me+> runTactic tacs _ (UserTactic tac tm)  = \g ctxt -> do+>     case lookup tac tacs of+>          (Just t) -> t tm g ctxt+>          Nothing -> fail $ "User tactic "++tac++" undefined"++> dumpAll :: String -> [(Name,Term)] -> String+> dumpAll pat [] = ""+> dumpAll pat ((n,ty):xs)+>         | sublist pat (length pat) (show n) =+>             show n ++" : " ++ show (view ty) ++ "\n" ++ dumpAll pat xs+>         | otherwise = dumpAll pat xs+>    where sublist pat i xs | i > length xs = False+>                           | take i xs == pat = True+>          sublist pat i (x:xs) = sublist pat i xs++Deal with commands that do IO here, so we can have a separate processing+function which doesn't need to be in the IO Monad.++> process :: Result Input -> ShellState -> IO ShellState+> process (Failure err) st = return $ respondLn st err+> process (Success (Command (Load f))) st = do importFile f st+> process (Success (Command (Plugin f))) st = do+>     (ctxt, exts, shell, cmds) <- load f (context st)+>     let st' = st { context = ctxt }+>     let st'' = case exts of+>                    Nothing -> st'+>                    Just p -> extendParser st' p+>     st''' <- case cmds of+>                    Nothing -> return st''+>                    Just c -> do newcmds <- c+>                                 return $ st'' { usercommands = usercommands st'' ++ newcmds }+>     case shell of+>       Nothing -> return st'''+>       Just shfn -> shfn st'''+> process (Success (Command (Compile f))) st = do compile (context st) f+>                                                 putStrLn $ "Output " ++ f ++ ".hs"+>                                                 return st+> process (Success (Command (UserCommand c arg))) st = do+>     let Just fn = lookup c (usercommands st) -- can't fail if parser succeeds+>     (resp, ctxt) <- fn arg (context st)+>     let st' = st { context = ctxt, response = resp }+>     return st'+> process x st = processInput x st++> processInput :: Monad m => Result Input -> ShellState -> m ShellState+> processInput (Failure err) st = return $ respondLn st err+> processInput (Success (Command cmd)) st = runCommand cmd st+> processInput (Success (Tactic goal tac)) st+>     = do let ctxt = save (context st)+>          ctxt <- runTactic (usertactics st) (repldata st)+>                     tac goal ctxt+>          ctxt <- keepSolving defaultGoal ctxt+>          ctxt <- if ((numUnsolved ctxt) > 0)+>                    then beta defaultGoal ctxt+>                    else return ctxt+>          let st' = respond st $ showProofState $ st { context = ctxt }+>          return st' { context = ctxt }++> -- | Get a string representation of the current proof state+> showProofState :: ShellState -> String+> showProofState st+>     | not (proving ctxt) = ""+>     | null $ getGoals ctxt = "\nNo more goals\n\n"+>     | otherwise = let (g:gs) = getGoals ctxt in+>                      "\n" ++ showGoalState g +++>                      "\nOther goals: " ++ show gs ++ "\n\n"+>  where+>   ctxt = context st+>   showGoalState :: Goal -> String+>   showGoalState g = let (Just gd) = goalData ctxt True g+>                         env = bindings gd+>                         ty = goalType gd+>                         nm = goalName gd in+>                        showEnv (reverse env) ++ "\n" +++>                        "--------------------------------\n" +++>                        show nm ++ " ? " ++ show (view ty) ++ "\n"+>   showEnv [] = ""+>   showEnv ((n,ty):xs) = show n ++ " : " ++ show (view ty) ++ "\n" +++>                            showEnv xs++> loop :: ShellState -> IO ShellState+> loop st = do putStr (prompt st)+>              hFlush stdout+>              inp <- readToSemi+>              st' <- catch (process (parseInput (extensions st)+>                                     (gettacs (usertactics st))+>                                     (map fst (usercommands st)) inp) st)+>                      (\e -> do return $ respondLn st (show e))+>              putStr $ (response st')+>              if (finished st')+>                 then return (clearResponse st')+>                 else catch (loop (clearResponse st'))+>                          (\e -> return st')++> -- | Set up the equality type, for use by the 'replace' tactic+> configureEq :: String+>             -> String+>             -> String+>             -> ShellState -> ShellState+> configureEq eq repl sym shell = shell { repldata = Just (eq,repl,sym) }++> -- | Run a command shell.+> runShell :: String -- ^ Prompt string+>          -> ShellState -- ^ Initial state+>          -> IO ShellState+> runShell p shell =+>     do st <- loop shell { prompt = p }+>        return st++> -- | Send a command directly to a shell+> sendCommand :: Monad m => String -> ShellState -> m ShellState+> sendCommand str st = processInput+>                        (parseInput (extensions st)+>                                    (gettacs (usertactics st))+>                                    (map fst (usercommands st)) str) $+>                          clearResponse st++Special case for importFile. Grr.++> -- | Send a command directly to a shell, allowing commands which might+> -- do IO actions.+> sendCommandIO :: String -> ShellState -> IO ShellState+> sendCommandIO str st = process+>                        (parseInput (extensions st)+>                                    (gettacs (usertactics st))+>                                    (map fst (usercommands st)) str) $+>                          clearResponse st++> gettacs :: [(String, String -> Goal -> Context -> IO Context)] -> [String]+> gettacs = map fst++> -- | Get the install prefix of the library+> prefix :: FilePath+> prefix = Ivor.Prefix.prefix++If the given file is already loaded, do nothing.++> -- | Import a file of shell commands; fails if the module does not exist+> -- in the current directory or search path, does nothing if already loaded.+> importFile :: FilePath -> ShellState -> IO ShellState+> importFile fp st+>     | fp `elem` imported st = return st+>     | otherwise = do inp <- findFile (modulePath st) fp+>                      st' <- processFile [] inp st+>                      --resp <- readFile tmpf+>                      return $ st' { imported = fp:(imported st') }+>   where processFile acc (';':rest) st =+>             do --putStrLn ("processing"++acc)+>                st' <- sendCommandIO (acc++";") st+>                processFile [] rest st'+>         processFile acc (x:xs) st = processFile (acc++[x]) xs st+>         processFile [] [] st = return st+>         -- Now eat the whitespace at the end+>         processFile (x:xs) [] st | isSpace x = processFile xs [] st+>                                  | otherwise = fail "Unexpected end of file"++> -- | Add a directory to the module search path+> addModulePath :: ShellState -> FilePath -> ShellState+> addModulePath shell fp = shell { modulePath = fp:(modulePath shell) }++> -- | Add the standard library path to the module search path+> addStdlibPath :: ShellState -> ShellState+> addStdlibPath shell+>     = shell { modulePath = (prefix++"/lib/ivor"):(modulePath shell) }++> environment :: String -> IO (Maybe String)+> environment x = catch (do e <- getEnv x+>                           return (Just e))+>                       (\_ -> return Nothing)++> tempfile :: IO (FilePath, Handle)+> tempfile = do env <- environment "TMPDIR"+>               let dir = case env of+> 		     Nothing -> "/tmp"+> 		     (Just d) -> d+>               openTempFile dir "humett.out"+
+ Ivor/ShellParser.lhs view
@@ -0,0 +1,418 @@+> module Ivor.ShellParser(Command(..),+>                           RunTactic(..),+>                           Input(..),+>                           parseInput) where++> import Ivor.TT hiding (try,check,eval)+> import Ivor.TermParser++> import Text.ParserCombinators.Parsec+> import Text.ParserCombinators.Parsec.Language+> import qualified Text.ParserCombinators.Parsec.Token as PTok+> import Control.Monad++> import Debug.Trace++> type TokenParser a = PTok.TokenParser a++> lexer :: TokenParser ()+> lexer = PTok.makeTokenParser haskellDef++> whiteSpace= PTok.whiteSpace lexer+> lexeme    = PTok.lexeme lexer+> symbol    = PTok.symbol lexer+> natural   = PTok.natural lexer+> parens    = PTok.parens lexer+> semi      = PTok.semi lexer+> identifier= PTok.identifier lexer+> reserved  = PTok.reserved lexer+> operator  = PTok.operator lexer+> reservedOp= PTok.reservedOp lexer+> lchar = lexeme.char++> readToEnd :: Parser String+> readToEnd = do term <- many1 $ noneOf ";"+>                return term+>++> data Command = Def String ViewTerm+>              | TypedDef String ViewTerm ViewTerm+>              | PatternDef String ViewTerm Patterns [PattOpt]+>              | Data Inductive+>              | Axiom String ViewTerm+>              | Declare String ViewTerm+>              | DeclareData String ViewTerm+>              | Theorem String ViewTerm+>              | Interactive String ViewTerm+>              | Forget String+>              | EvalTerm ViewTerm+>              | WHNF ViewTerm+>              | Print String+>              | Check ViewTerm+>              | ReplData String String String+>              | Freeze String+>              | Thaw String+>              | Suspend+>              | Resume String+>              | Load FilePath+>              | Plugin FilePath+>              | Compile String+>              | Focus String+>              | Dump String+>              | Undo+>              | Prf+>              | PrfState+>              | Qed+>              | GenRec String+>              | JMEq String String+>              | Primitives+>              | Drop+>              | UserCommand String String++> data RunTactic = Attack+>                | AttackWith String+>                | Claim String ViewTerm+>                | Local String ViewTerm+>                | Refine ViewTerm [ViewTerm]+>                | Solve+>                | Fill ViewTerm+>                | ReturnTac+>                | QuoteTac+>                | CallTac ViewTerm+>                | Abandon+>                | Rename String+>                | Intro+>                | IntroName String+>                | Intros+>                | IntrosNames [String]+>                | AddArg String ViewTerm+>                | Equiv ViewTerm+>                | Generalise Bool ViewTerm+>                | Replace ViewTerm Bool+>                | Axiomatise String [String]+>                | Normalise+>                | Unfold String+>                | Trivial+>                | Split | LeftCon | RightCon | AutoSolve+>                | Exists ViewTerm+>                | By ViewTerm+>                | Induction ViewTerm+>                | Cases ViewTerm+>                | Decide ViewTerm+>                | UserTactic String String++A user defined tactic is a pair of the tactic name, and the function+which runs it.++> data Input = Command Command+>            | Tactic Goal RunTactic++> def :: Maybe (Parser ViewTerm) -> Parser Command+> def ext+>     = do name <- identifier+>          lchar '='+>          term <- pTerm ext ; semi+>          return $ Def name term++> typeddef :: Maybe (Parser ViewTerm) -> Parser Command+> typeddef ext+>     = do reserved "Let"+>          name <- identifier ; lchar ':'; ty <- pTerm ext+>          lchar '=' ; term <- pTerm ext ; semi+>          return $ TypedDef name term ty++> pclause :: String -> Maybe (Parser ViewTerm) -> Parser PClause+> pclause nm ext+>     = do name <- identifier;+>          when (name /= nm) $ fail $ show nm ++ " & " ++ show name ++ " do not match"+>          args <- many (pNoApp ext)+>          lchar '=' ;+>          ret <- pTerm ext+>          return $ PClause args ret++> ppatterns :: String -> Maybe (Parser ViewTerm) -> Parser Patterns+> ppatterns name ext+>     = do clauses <- sepBy (pclause name ext) (lchar '|' )+>          return $ Patterns clauses++> pPattOpt :: Parser PattOpt+> pPattOpt = do reserved "Partial"+>               return Partial+>            <|> do reserved "Rec"+>                   return Ivor.TT.GenRec++> ppatternDef :: Maybe (Parser ViewTerm) -> Parser Command+> ppatternDef ext+>     = do reserved "Match"+>          opts <- many pPattOpt+>          name <- identifier ; lchar ':' ; ty <- pTerm ext+>          lchar '='+>          patts <- ppatterns name ext+>          semi+>          return $ PatternDef name ty patts opts++> pdata :: Maybe (Parser ViewTerm) -> Parser Command+> pdata ext = do reserved "Data"+>                datadef <- pInductive ext ; semi+>                return $ Data datadef++> plata :: Maybe (Parser ViewTerm) -> Parser Command+> plata ext = do reserved "Data"+>                name <- identifier+>                lchar ':'+>                term <- pTerm ext ; semi+>                return $ DeclareData name term++> axiom :: Maybe (Parser ViewTerm) -> Parser Command+> axiom ext+>       = do reserved "Axiom"+>            name <- identifier+>            lchar ':'+>            term <- pTerm ext ; semi+>            return $ Axiom name term++> pdeclare :: Maybe (Parser ViewTerm) -> Parser Command+> pdeclare ext+>       = do reserved "Declare"+>            name <- identifier+>            lchar ':'+>            term <- pTerm ext ; semi+>            return $ Declare name term++> ptheorem :: Maybe (Parser ViewTerm) -> Parser Command+> ptheorem ext+>          = do name <- identifier+>               lchar ':'+>               term <- pTerm ext ; semi+>               return $ Theorem name term++> pinter :: Maybe (Parser ViewTerm) -> Parser Command+> pinter ext+>          = do reserved "Rec"+>               name <- identifier+>               lchar ':'+>               term <- pTerm ext ; semi+>               return $ Interactive name term++> pforget :: Parser Command+> pforget = do reserved "Forget"+>              name <- identifier ; semi+>              return $ Forget name++> eval :: Maybe (Parser ViewTerm) -> Parser Command+> eval ext+>      = do reserved "Eval"+>           term <- pTerm ext ; semi+>           return $ EvalTerm term++> pwhnf :: Maybe (Parser ViewTerm) -> Parser Command+> pwhnf ext+>      = do reserved "Whnf"+>           term <- pTerm ext ; semi+>           return $ WHNF term++> pprint :: Parser Command+> pprint = do reserved "Print"+>             term <- identifier ; semi+>             return $ Print term++> check :: Maybe (Parser ViewTerm) -> Parser Command+> check ext+>       = do reserved "Check"+>            term <- pTerm ext ; semi+>            return $ Check term++> pdrop :: Parser Command+> pdrop = do reserved "Drop" ; semi+>            return Drop++> pprims :: Parser Command+> pprims = do reserved "Primitives" ; semi+>             return Primitives++> pqed :: Parser Command+> pqed = do reserved "Qed" ; semi+>           return Qed++> pgenrec :: Parser Command+> pgenrec = do reserved "General" ;+>              nm <- identifier ; semi+>              return $ Ivor.ShellParser.GenRec nm++> pjme :: Parser Command+> pjme = do reserved "Equality" ;+>           nm <- identifier+>           con <- identifier+>           semi+>           return $ JMEq nm con++> pprf :: Parser Command+> pprf = do reserved "ProofTerm" ; semi+>           return Prf++> pprfstate :: Parser Command+> pprfstate = do reserved "State" ; semi+>                return PrfState++> pundo :: Parser Command+> pundo = do reserved "Undo" ; semi+>            return Undo++> repldata :: Parser Command+> repldata = do reserved "Repl"+>               eq <- identifier+>               repl <- identifier+>               sym <- identifier+>               return $ ReplData eq repl sym++> pfreeze :: Parser Command+> pfreeze = do reserved "Freeze"+>              term <- identifier ; semi+>              return $ Freeze term++> pthaw :: Parser Command+> pthaw = do reserved "Thaw"+>            term <- identifier ; semi+>            return $ Thaw term++> pfocus :: Parser Command+> pfocus = do reserved "Focus"+>             name <- identifier ; semi+>             return $ Focus name++> pdump :: Parser Command+> pdump = do reserved "Dump"+>            name <- option "" identifier ; semi+>            return $ Dump name++> psuspend :: Parser Command+> psuspend = do reserved "Suspend" ; semi+>               return Suspend++> presume :: Parser Command+> presume = do reserved "Resume"+>              nm <- identifier ; semi+>              return $ Resume nm++> pload :: Parser Command+> pload = do reserved "Load"+>            lchar '"' ; rest <- many $ noneOf ['"'] ; lchar '"' ;+>            whiteSpace ; semi+>            return $ Load rest++> pplugin :: Parser Command+> pplugin = do reserved "Plugin"+>              lchar '"' ; rest <- many $ noneOf ['"'] ; lchar '"' ;+>              whiteSpace ; semi+>              return $ Plugin rest++> pcompile :: Parser Command+> pcompile = do reserved "Compile"+>               lchar '"' ; rest <- many $ noneOf ['"'] ; lchar '"' ;+>               whiteSpace ; semi+>               return $ Compile rest++> puser :: [String] -> Parser Command+> puser coms = do com <- identifier ;+>                 if (com `elem` coms)+>                    then do tm <- readToEnd ; semi+>                            return $ UserCommand com tm+>                    else fail "No such command"++> tryall :: [Parser a] -> Parser a+> tryall [x] = x+> tryall (x:xs) = try x <|> tryall xs++> command :: Maybe (Parser ViewTerm) -> [String] -> Parser Command+> command ext user+>             = tryall [def ext, typeddef ext, pdata ext, plata ext,+>                       axiom ext,+>                       ptheorem ext, pdeclare ext, pinter ext, pforget,+>                       eval ext, pwhnf ext, check ext, ppatternDef ext,+>                       pdrop, repldata, pqed, pprint, pfreeze, pthaw, pprf,+>                       pundo, psuspend, presume, pgenrec, pjme,+>                       pload, pcompile, pfocus, pdump, pprfstate, pprims,+>                       pplugin, puser user]++> tactic :: Maybe (Parser ViewTerm) -> [String] -> Parser RunTactic+> tactic ext usertacs+>        = do reserved "attack" ; semi ; return Attack+>      <|> do reserved "attack" ; nm <- identifier ; semi ;+>             return $ AttackWith nm+>      <|> do reserved "claim" ; name <- identifier ; lchar ':' ;+>             tm <- pTerm ext ; semi ; return $ Claim name tm+>      <|> do reserved "local" ; name <- identifier ; lchar ':' ;+>             tm <- pTerm ext ; semi ; return $ Local name tm+>      <|> do reserved "refine" ; nm <- pNoApp ext ;+>             args <- many (pNoApp ext) ;+>             return $ Refine nm args+>      <|> do reserved "solve" ; semi ; return Solve+>      <|> do reserved "fill" ; tm <- pTerm ext ; semi ;+>             return $ Fill tm+>      <|> do reserved "return" ; semi ; return ReturnTac+>      <|> do reserved "quote" ; semi ; return QuoteTac+>      <|> do reserved "call" ; tm <- pTerm ext ; semi ;+>             return $ CallTac tm+>      <|> do reserved "abandon" ; semi ; return Abandon+>      <|> do reserved "rename" ; nm <- identifier ; semi ;+>             return $ Rename nm+>      <|> try (do reserved "intro" ; nms <- many1 identifier; semi+>                  return $ IntrosNames nms)+>      <|> do reserved "intro" ; semi ; return Intro+>      <|> do reserved "intros" ; semi ; return Intros+>      <|> do reserved "arg"; nm <- identifier ; lchar ':';+>             tm <- pTerm ext ; semi ;+>             return $ AddArg nm tm+>      <|> do reserved "equiv" ; tm <- pTerm ext ; semi ;+>             return $ Equiv tm+>      <|> do reserved "generalise" ; dep <- possible "dependent";+>             tm <- pTerm ext ; semi ;+>             return $ Generalise dep tm+>      <|> do reserved "replace" ; sym <- possible "sym";+>             tm <- pTerm ext ; semi ;+>             return $ Replace tm (not sym)+>      <|> do reserved "axiomatise" ; nm <- identifier ;+>             nms <- many identifier; semi ;+>             return $ Axiomatise nm nms+>      <|> do reserved "compute" ; semi ; return Normalise+>      <|> do reserved "unfold" ; nm <- identifier ;+>             semi ; return $ Unfold nm+>      <|> do reserved "trivial" ; semi ; return Trivial+>      <|> do reserved "split" ; semi ; return Split+>      <|> do reserved "left" ; semi ; return LeftCon+>      <|> do reserved "right" ; semi ; return RightCon+>      <|> do reserved "exists" ; tm <- pTerm ext ; semi ;+>             return $ Exists tm+>      <|> do reserved "auto" ; semi ; return AutoSolve+>      <|> do reserved "by" ; tm <- pTerm ext ; semi ;+>             return $ By tm+>      <|> do reserved "induction" ; tm <- pTerm ext ; semi ;+>             return $ Induction tm+>      <|> do reserved "case" ; tm <- pTerm ext ; semi ;+>             return $ Cases tm+>      <|> do reserved "decide" ; tm <- pTerm ext ; semi ;+>             return $ Decide tm+>      <|> do tac <- identifier ;+>             if (tac `elem` usertacs)+>                then do tm <- readToEnd ; semi+>                        return $ UserTactic tac tm+>                else fail "No such tactic"++> possible :: String -> Parser Bool+> possible word = option False (do reserved word ; return True)++> input :: Maybe (Parser ViewTerm) -> [String] -> [String] -> Parser Input+> input ext usertacs usercoms+>           = try (do whiteSpace+>                     cmd <- command ext usercoms+>                     return $ Command cmd)+>             <|> (do whiteSpace+>                     tac <- tactic ext usertacs+>                     return $ Tactic defaultGoal tac)++> parseInput :: Monad m => Maybe (Parser ViewTerm) ->+>                          [String] -> [String] -> String -> m Input+> parseInput ext usertacs usercoms str+>     = case parse (input ext usertacs usercoms) "(input)" str of+>                 Left err -> fail (show err)+>                 Right inp -> return inp
+ Ivor/ShellState.lhs view
@@ -0,0 +1,34 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> -- | +> -- Module      : Ivor.Shell+> -- Copyright   : Edwin Brady+> -- Licence     : BSD-style (see LICENSE in the distribution)+> --+> -- Maintainer  : eb@dcs.st-and.ac.uk+> -- Stability   : experimental+> -- Portability : non-portable+> -- +> -- Shell interface to theorem prover++> module Ivor.ShellState(ShellState(..)) where++> import Ivor.TT as TT+> import Text.ParserCombinators.Parsec++> data ShellState = Shell {+>                          repldata :: Maybe (String, String, String),+>                          prompt :: String,+>                          finished :: Bool,+>                          context :: !Context,+>                          -- | Get reply from last shell command+>                          response :: String,+>                          usertactics :: forall m.Monad m => [(String, String -> Goal -> Context -> m Context)],+>                          usercommands :: [(String, String -> Context -> IO (String, Context))],+>                          imported :: [String],+>                          extensions :: Maybe (Parser ViewTerm),+>                          -- search path for modules to load+>                          modulePath :: [FilePath]+>                          }++
+ Ivor/State.lhs view
@@ -0,0 +1,200 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.State where++> import Ivor.TTCore+> import Ivor.Nobby+> import Ivor.Gadgets+> import Ivor.Typecheck+> import Ivor.Datatype+> import Ivor.MakeData+> import Ivor.ICompile+> import Ivor.Grouper+> import Ivor.SC+> import Ivor.Bytecode+> import Ivor.CodegenC+> import Ivor.Tactics as Tactics+> import Ivor.Display+> import Ivor.Unify++> import System.Environment+> import Data.List+> import Debug.Trace++State of the system, include all definitions, pattern matching rules,+compiled terms, etc.++> data IState = ISt {+>            -- All definitions+>	     defs :: !(Gamma Name),+>            -- All datatype definitions+>            datadefs :: [(Name,Datatype Name)],+>            -- All elimination rules in their pattern matching form+>            -- (with type)+>            eliminators :: [(Name, (Indexed Name,+>                                    ([RawScheme], PMFun Name)))],+>            -- Supercombinators for each definition+>            runtt :: SCs,+>            -- Bytecode for each definitions+>            bcdefs :: ByteDef,+>            -- List of holes to be solved in proof state+>            holequeue :: ![Name],+>            -- Premises we're not interested in, so don't show+>            hidden :: [Name],+>            -- Current proof term (FIXME: Combine with holequeue, and make it efficient)+>            proofstate :: !(Maybe (Indexed Name)),+>            -- Actions required of last tactic+>            actions :: ![TacticAction],+>            -- List of fresh names for tactics to use+>            namesupply :: [Name],+>            -- Output from last operation+>            response :: String,+>            -- Previous state+>            undoState :: !(Maybe IState)+>        }++> initstate = ISt (Gam []) [] [] [] [] [] [] Nothing [] mknames "" Nothing+>   where mknames = [MN ("myName",x) | x <- [1..]]++> respond :: IState -> String -> IState+> respond st str = st { response = (response st) ++ str }++> gensym :: IState -> (Name, IState)+> gensym st = (head (namesupply st),+>              st { namesupply = tail (namesupply st) })++> jumpqueue hole q = nub (hole: (q \\ [hole]))+> stail (x:xs) = xs+> stail [] = []++> prf st = case (proofstate st) of+>           Nothing -> error "Can't happen"+>           (Just x) -> x++> saveState st = let st' = st in+>                    st { undoState = Just st' }++Take a data type definition and add constructors and elim rule to the context.++> doData :: Monad m => IState -> Name -> RawDatatype -> m IState+> doData st n r = do+>            let ctxt = defs st+>            let runtts = runtt st+>            let bcs = bcdefs st+>            dt <- checkType (defs st) r -- Make iota schemes+>            ctxt <- gInsert (fst (tycon dt)) (snd (tycon dt)) ctxt+>                        -- let ctxt' = (tycon dt):ctxt+>            ctxt <- addCons (datacons dt) ctxt+>            (ctxt, newruntts, newbc) <-+>                addElim ctxt runtts bcs (erule dt) (e_ischemes dt)+>            (newdefs, newruntts, newbc) <-+>                addElim ctxt newruntts newbc (crule dt) (c_ischemes dt)+>            let newelims = (fst (erule dt), (snd (erule dt),+>                              (e_rawschemes dt, e_ischemes dt))):+>                           (fst (crule dt), (snd (crule dt),+>                              (c_rawschemes dt, c_ischemes dt))):+>                           eliminators st+>            let newdatadefs = (n,dt):(datadefs st)+>            return $ st { defs = newdefs, datadefs = newdatadefs,+>                          eliminators = newelims,+>                          bcdefs = newbc, runtt = newruntts }+>    where addCons [] ctxt = return ctxt+>          addCons ((n,gl):xs) ctxt = do+>              ctxt <- addCons xs ctxt+>              gInsert n gl ctxt+>          addElim ctxt runtts bcdefs erule schemes = do+>            newdefs <- gInsert (fst erule)+>                               (G (PatternDef schemes) (snd erule) defplicit)+>                               ctxt+>            return (newdefs, runtts, bcdefs)++> doMkData :: Monad m => IState -> Datadecl -> m IState+> doMkData st (Datadecl n ps rawty cs)+>     = do (gty,_) <- checkIndices (defs st) ps [] rawty+>          let ty = forget (normalise (defs st) gty)+>          -- TMP HACK: Do it twice, to fill in _ placeholders.+>          rd1 <- mkRawData n ps ty cs+>          dt1 <- checkType (defs st) rd1+>          let csfilled = map (forgetcon (length ps)) (datacons dt1)+>          rd <- mkRawData n ps ty csfilled+>          doData st n rd+>  where checkIndices gam [] env rawty = check gam env rawty Nothing+>        checkIndices gam ((n,nrawty):xs) env rawty = do+>            (Ind nty,_) <- check gam env nrawty Nothing+>            checkIndices gam xs (env++[(n,B Pi nty)]) rawty+>        -- also need to strip parameters+>        forgetcon numps (n, (G _ (Ind t) _)) = (n, (stripps numps (forget t)))+>        stripps 0 t = t+>        stripps n (RBind _ _ sc) = stripps (n-1) sc++> suspendProof :: Monad m => IState -> m IState+> suspendProof st = do case proofstate st of+>                        (Just prf) -> do+>                          let (Gam olddefs) = defs st+>                          newdef <- suspendFrom (defs st) prf (holequeue st)+>                          return $ st { proofstate = Nothing,+>                                        defs = Gam (newdef:olddefs),+>                                        holequeue = []+>                                      }+>                        _ -> fail "No proof in progress"++> suspendFrom gam (Ind (Bind x (B (Guess v) ty) (Sc (P n)))) q | n == x =+>               return $ (x, G (Partial (Ind v) q) (finalise (Ind ty)) defplicit)+> suspendFrom _ _ _ = fail "Not a suspendable proof"++> resumeProof :: Monad m => IState -> Name -> m IState+> resumeProof st n = case (proofstate st) of+>      Nothing ->+>          case glookup n (defs st) of+>             Just ((Partial (Ind v) q),(Ind ty)) -> do+>                 -- recheck in case any of the names have changed 'status'+>                 -- (e.g., from undefined to defined type constructors)+>                 let vraw = forget v+>                 let traw = forget ty+>                 (Ind vrecheck, _) <- typecheck (defs st) vraw+>                 (Ind trecheck, _) <- typecheck (defs st) traw+>                 return $ st+>                    { proofstate = Just+>                        (Ind (Bind n (B (Guess (makePs vrecheck))+>                                               (makePs trecheck))+>                               (Sc (P n)))),+>                      defs = remove n (defs st),+>                      holequeue = q+>                    }+>             _ -> fail "Not a suspended proof"+>      (Just _) -> fail "Already a proof in progress"++And an argument to the current proof (after any dependencies)+e.g. adding z:C x to foo : (x:A)(y:B)Z = [x:A][y:B]H+ becomes foo : (x:A)(z:C x)(y:B) = [x:A][z:C x][y:B]H.++> addArg :: Monad m => IState -> Name -> TT Name -> m IState+> addArg st n ty =+>     case proofstate st of+>         Just (Ind (Bind n (B (Guess v) t) sc)) -> do+>            (v',t') <- addArgTy v t (getDeps ty)+>            return $ st { proofstate = Just (Ind (Bind n (B (Guess v') t') sc)) }+>         _ -> fail "Can't add argument now"+>   where+>      getDeps ty = filter (nonfree (defs st)) (getNames (Sc ty))+>      nonfree gam n | Nothing <- lookupval n gam = True+>                    | otherwise = False+>      addArgTy v t [] = return (Bind n (B Lambda ty) (Sc v),+>                                Bind n (B Pi ty) (Sc t))+>      addArgTy (Bind n (B Lambda nty) (Sc v))+>               (Bind n' (B Pi nty') (Sc t)) ds+>          | n == n' = do (v',t') <- addArgTy v t (ds \\ [n])+>                         return (Bind n (B Lambda nty) (Sc v'),+>                                 Bind n (B Pi nty) (Sc t'))+>      addArgTy _ _ _ = fail "Can't add argument here"++++> dumpState :: IState -> String+> dumpState st = dumpProofstate (proofstate st)+>  where dumpProofstate Nothing = ""+>        dumpProofstate (Just p) = dhole p (holequeue st)+>+>        dhole p [] = show p+>        dhole p (n:ns) = displayHoleContext (defs st) (hidden st) n p +++>                           "Next holes: " ++ show ns++"\n"
+ Ivor/TT.lhs view
@@ -0,0 +1,1441 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> -- |+> -- Module      : Ivor.TT+> -- Copyright   : Edwin Brady+> -- Licence     : BSD-style (see LICENSE in the distribution)+> --+> -- Maintainer  : eb@dcs.st-and.ac.uk+> -- Stability   : experimental+> -- Portability : non-portable+> --+> -- Public interface for theorem proving gadgets.++> module Ivor.TT(-- * System state+>               emptyContext, Context,+>               Ivor.TT.check,+>               checkCtxt,converts,+>               Ivor.TT.compile,+>               -- * Exported view of terms+>               module VTerm, IsTerm, IsData,+>               -- * Definitions and Theorems+>               addDef,addTypedDef,addData,addAxiom,declare,declareData,+>               theorem,interactive,+>               addPrimitive,addBinOp,addBinFn,addPrimFn,addExternalFn,+>               addEquality,forgetDef,addGenRec,addImplicit,+>               -- * Pattern matching definitions+>               PClause(..), Patterns(..),PattOpt(..),addPatternDef,+>               -- * Manipulating Proof State+>               proving,numUnsolved,suspend,resume,+>               save, restore, clearSaved,+>               proofterm, getGoals, getGoal, uniqueName, -- getActions+>               allSolved,qed,+>               -- * Examining the Context+>               eval, whnf, evalCtxt, getDef, defined, getPatternDef,+>               getAllDefs, getConstructors,+>               Rule(..), getElimRule,+>               Ivor.TT.freeze,Ivor.TT.thaw,+>               -- * Goals, tactic types+>               Goal,goal,defaultGoal,+>               Tactic, --Tactics.TacticAction(..),+>               GoalData, bindings, goalName, goalType,+>               goalData, subGoals,+>               -- * Primitive Tactics+>               -- ** Basics+>               intro,+>               introName,+>               intros,intros1,+>               introsNames,+>               Ivor.TT.addArg,+>               generalise,+>               dependentGeneralise,+>               claim,+>               -- ** Proof navigation+>               focus,+>               rename,+>               attack, attackWith,+>               solve,+>               trySolve,+>               keepSolving,+>               abandon,+>               hide,+>               -- ** Introductions+>               fill,+>               refine,+>               basicRefine,+>               refineWith,+>               trivial,+>               axiomatise,+>               -- ** Eliminations+>               by,+>               induction,+>               cases,+>               -- ** Conversions+>               equiv,+>               compute,+>               beta,+>               unfold,+>               -- ** Equality+>               replace,+>               -- ** Computations+>               call,+>               returnComputation,+>               -- ** Staging+>               quoteVal,+>               -- ** Tactic combinators+>               idTac, tacs,+>               (>->), (>=>), (>+>), (>|>), try,+>               traceTac)++>     where++> import Ivor.TTCore as TTCore+> import Ivor.State+> import Ivor.Typecheck+> import Ivor.Gadgets+> import Ivor.Nobby+> import Ivor.Evaluator+> import Ivor.SC+> import Ivor.Bytecode+> import Ivor.Datatype+> import Ivor.Constant+> import Ivor.ViewTerm as VTerm+> import Ivor.TermParser+> import qualified Ivor.Tactics as Tactics+> import Ivor.Compiler as Compiler+> import Ivor.CodegenC+> import Ivor.PatternDefs++> import Data.List+> import Debug.Trace+> import Data.Typeable++> -- | Abstract type representing state of the system.+> newtype Context = Ctxt IState++> -- | Abstract type representing goal or subgoal names.+> data Goal = Goal Name | DefaultGoal+>     deriving Eq++> instance Show Goal where+>     show (Goal g) = show g+>     show (DefaultGoal) = "Default Goal"++> goal :: String -> Goal+> goal g = Goal $ UN g++> defaultGoal :: Goal+> defaultGoal = DefaultGoal++> -- |A tactic is any function which manipulates a term at the given goal+> -- binding. Tactics may fail, hence the monad.+> type Tactic = forall m.Monad m => Goal -> Context -> m Context++> -- | Initialise a context, with no data or definitions and an+> -- empty proof state.+> emptyContext :: Context+> emptyContext = Ctxt initstate++> class IsTerm a where+>     -- | Typecheck a term+>     check :: Monad m => Context -> a -> m Term+>     raw :: Monad m => a -> m Raw++> class IsData a where+>     addData :: Monad m => Context -> a -> m Context++> instance IsTerm Term where+>     check _ tm = return tm+>     raw tm = return $ forget (view tm)++> instance IsTerm ViewTerm where+>     check ctxt tm = Ivor.TT.check ctxt (forget tm)+>     raw tm = return $ forget tm++> instance IsTerm String where+>     check ctxt str = case parseTermString str of+>          (Success tm) -> Ivor.TT.check ctxt (forget tm)+>          (Failure err) -> fail err+>     raw str = case parseTermString str of+>          (Success tm) -> return $ forget tm+>          (Failure err) -> fail err++> instance IsTerm Raw where+>     check (Ctxt st) t = do+>        case (typecheck (defs st) t) of+>           (Success (t, ty)) -> return $ Term (t,ty)+>           (Failure err) -> fail err+>     raw t = return t++> -- | Parse and typecheck a data declaration, of the form+> -- "x:Type = c1:Type | ... | cn:Type"+> instance IsData String where+>     addData (Ctxt st) str = do+>         case (parseDataString str) of+>             Success ind -> addData (Ctxt st) ind+>             Failure err -> fail err++> instance IsData Inductive where+>     addData (Ctxt st) ind = do st' <- doMkData st (datadecl ind)+>                                return (Ctxt st')+>       where+>         datadecl (Inductive n ps inds cty cons) =+>             Datadecl n (map (\ (n,ty) -> (n, forget ty)) ps)+>                        (mkTycon inds cty)+>                        (map (\ (n,ty) -> (n, forget ty)) cons)+>         mkTycon [] rty = forget rty+>         mkTycon ((n,ty):ts) rty = RBind n (B Pi (forget ty)) (mkTycon ts rty)++> checkNotExists n gam = case lookupval n gam of+>                                 Just Undefined -> return ()+>                                 Just (TCon _ NoConstructorsYet) -> return ()+>                                 Just _ -> fail $ show n ++ " already defined"+>                                 Nothing -> return ()++> data PClause = PClause {+>                         arguments :: [ViewTerm],+>                         returnval :: ViewTerm+>                        }+>    deriving Show++> data Patterns = Patterns [PClause]+>    deriving Show++> mkRawClause :: PClause -> RawScheme+> mkRawClause (PClause args ret) =+>     RSch (map forget args) (forget ret)++> data PattOpt = Partial -- ^ No need to cover all cases+>              | GenRec -- ^ No termination checking+>   deriving Eq++> -- |Add a new definition to the global state.+> -- By default, these definitions must cover all cases and be well-founded,+> -- but can be optionally partial or general recursive+> addPatternDef :: (IsTerm ty, Monad m) =>+>                Context -> Name -> ty -- ^ Type+>                  -> Patterns -- ^ Definition+>                -> [PattOpt] -- ^ Options to set which definitions will be accepted+>                -> m Context+> addPatternDef (Ctxt st) n ty pats opts = do+>         checkNotExists n (defs st)+>         inty <- raw ty+>         let (Patterns clauses) = pats+>         (pmdef, fty) <- checkDef (defs st) n inty (map mkRawClause clauses)+>                            (not (elem Ivor.TT.Partial opts))+>                            (not (elem GenRec opts))+>         newdefs <- gInsert n (G (PatternDef pmdef) fty defplicit) (defs st)+>         return $ Ctxt st { defs = newdefs }++> -- |Add a new definition, with its type to the global state.+> -- These definitions can be recursive, so use with care.+> addTypedDef :: (IsTerm term, IsTerm ty, Monad m) =>+>                Context -> Name -> term -> ty -> m Context+> addTypedDef (Ctxt st) n tm ty = do+>         checkNotExists n (defs st)+>         (Term (inty,_)) <- Ivor.TT.check (Ctxt st) ty+>         (Ctxt tmpctxt) <- declare (Ctxt st) n ty+>         let Gam tmp = defs tmpctxt+>         let Gam ctxt = defs st+>         let runtts = runtt st+>         term <- raw tm+>         case (checkAndBind (Gam tmp) [] term (Just inty)) of+>              (Success (v,t@(Ind sc),_)) -> do+>                 if (convert (defs st) inty t)+>                     then (do+>                       checkBound (getNames (Sc sc)) t+>                       newdefs <- gInsert n (G (Fun [Recursive] v) t defplicit) (Gam ctxt)+>                               -- = Gam ((n,G (Fun [] v) t):ctxt)+>                       let scs = lift n (levelise (normalise (Gam []) v))+>                       let bc = compileAll (runtts++scs) scs+>                       let newbc = bc++(bcdefs st)+>                       return $ Ctxt st { defs = newdefs, bcdefs = newbc,+>                                    runtt = (runtts++scs) })+>                     else (fail $ "The given type and inferred type do not match, inferred " ++ show t)+>              (Failure err) -> fail err+++> -- |Add a new definition to the global state.+> addDef :: (IsTerm a, Monad m) => Context -> Name -> a -> m Context+> addDef (Ctxt st) n tm = do+>         checkNotExists n (defs st)+>         v <- raw tm+>         let Gam ctxt = defs st+>         let runtts = runtt st+>         case (typecheck (Gam ctxt) v) of+>             (Success (v,t@(Ind sc))) -> do+>                 checkBound (getNames (Sc sc)) t+>                 newdefs <- gInsert n (G (Fun [] v) t defplicit) (Gam ctxt)+>                 -- let newdefs = Gam ((n,G (Fun [] v) t):ctxt)+>                 let scs = lift n (levelise (normalise (Gam []) v))+>                 let bc = compileAll (runtts++scs) scs+>                 let newbc = bc++(bcdefs st)+>                 return $ Ctxt st { defs = newdefs, bcdefs = newbc,+>                                    runtt = (runtts++scs) }+>             (Failure err) -> fail err++> checkBound :: Monad m => [Name] -> (Indexed Name) -> m ()+> checkBound [] t = return ()+> checkBound (nm@(MN ("INFER",_)):ns) t+>                = fail $ "Can't infer value for " ++ show nm ++ " in " ++ show t+> checkBound (_:ns) t = checkBound ns t++> -- |Forget a definition and all following definitions.+> forgetDef :: Monad m => Context -> Name -> m Context+> forgetDef (Ctxt st) n = do let (Gam olddefs) = defs st+>                            newdefs <- f olddefs n+>                            return $ Ctxt st { defs = Gam newdefs }+>   where f [] n = fail "No such name"+>         f (def@(x,_):xs) n | x == n = return xs+>                            | otherwise = f xs n++> -- |Add the general recursion elimination rule, thus making all further+> -- definitions untrustworthy :).+> addGenRec :: Monad m => Context -> Name -- ^ Name to give recursion rule+>                      -> m Context+> addGenRec (Ctxt st) n+>     = do checkNotExists n (defs st)+>          (Ctxt tmpctxt) <- addAxiom (Ctxt st) n+>                              "(P:*)(meth_general:(p:P)P)P"+>          let Gam tmp = defs tmpctxt+>          let Gam ctxt = defs st+>          let runtts = runtt st+>          general <- raw $ "[P:*][meth_general:(p:P)P](meth_general (" +++>                            show n ++ " P meth_general))"+>          case (typecheck (Gam tmp) general) of+>              (Success (v,t)) -> do+>                 -- let newdefs = Gam ((n,G (Fun [] v) t):ctxt)+>                 newdefs <- gInsert n (G (Fun [] v) t defplicit) (Gam ctxt)+>                 let scs = lift n (levelise (normalise (Gam []) v))+>                 let bc = compileAll (runtts++scs) scs+>                 let newbc = bc++(bcdefs st)+>                 return $ Ctxt st { defs = newdefs, bcdefs = newbc,+>                                    runtt = (runtts++scs) }+>              (Failure err) -> fail $ "Can't happen (general): "++err++> -- | Add the heterogenous (\"John Major\") equality rule and its reduction+> addEquality :: Monad m => Context -> Name -- ^ Name to give equality type+>             -> Name -- ^ Name to give constructor+>             -> m Context+> addEquality ctxt@(Ctxt st) ty con = do+>     checkNotExists ty (defs st)+>     checkNotExists con (defs st)+>     rtycon <- eqTyCon ty+>     rdatacon <- eqCon (show ty) con+>     rerule <- eqElimType (show ty) (show con) "Elim"+>     rcrule <- eqElimType (show ty) (show con) "Case"+>     rischeme <- eqElimSch (show con)+>     let rdata = (RData rtycon [rdatacon] 2 rerule rcrule [rischeme] [rischeme])+>     st <- doData st ty rdata+>     return $ Ctxt st++> -- eqElim : (A:*)(a:A)(b:A)(q:JMEq A A a a)+> --       (Phi:(a':A)(target:JMEq A A a a')*)+> --       (meth_refl:(a:A)(Phi a (refl A a)))(Phi a q);+> -- eqelim A a Phi meth_refl a (refl A a) => meth_refl a++> eqTyCon jmeq = do ty <- raw $ "(A:*)(B:*)(a:A)(b:B)*"+>                   return (jmeq, ty)++> eqCon jmeq refl = do ty <- raw $ "(A:*)(a:A)" ++ jmeq ++ " A A a a"+>                      return (refl, ty)++> eqElimType jmeq refl nm+>     = do ty <- raw $+>                 "(A:*)(a:A)(b:A)(q:" ++ jmeq +++>                 " A A a b)(Phi:(a':A)(target:" +++>                 jmeq ++ " A A a a')*)(meth_" +++>                 refl ++ ":Phi a (" ++ refl ++ " A a))(Phi b q)"+>          return (name (jmeq++nm), ty)++> eqElimSch refl = do aty <- raw "A"+>                     a <- raw "a"+>                     b <- raw "_"+>                     phi <- raw "phi"+>                     mrefl <- raw "meth_refl"+>                     arg <- raw $ refl ++ " A a"+>                     ret <- raw "meth_refl"+>                     return $ RSch [aty,a,b,arg,phi,mrefl] ret++> -- | Declare a name which is to be defined later+> declare :: (IsTerm a, Monad m) => Context -> Name -> a -> m Context+> declare ctxt n tm = addUn Undefined ctxt n tm++> -- | Declare a type constructor which is to be defined later+> declareData :: (IsTerm a, Monad m) => Context -> Name -> a -> m Context+> declareData ctxt@(Ctxt st) n tm = do+>   let gamma = defs st+>   Term (ty, _) <- Ivor.TT.check ctxt tm+>   addUn (TCon (arity gamma ty) NoConstructorsYet) ctxt n tm++> -- | Add a new axiom to the global state.+> addAxiom :: (IsTerm a, Monad m) => Context -> Name -> a -> m Context+> addAxiom ctxt n tm = addUn Unreducible ctxt n tm++> addUn und (Ctxt st) n tm = do+>        checkNotExists n (defs st)+>        t <- raw tm+>        let Gam ctxt = defs st+>        case (typecheck (defs st) t) of+>           (Success (t, ty)) ->+>              do checkConv (defs st) ty (Ind TTCore.Star) "Not a type"+>                 -- let newdefs = Gam ((n, (G und (finalise t))):ctxt)+>                 newdefs <- gInsert n (G und (finalise t) defplicit) (Gam ctxt)+>                 return $ Ctxt st { defs = newdefs }+>           (Failure err) -> fail err++> -- | Add a new primitive type. This should be done in assocation with+> -- creating an instance of 'ViewConst' for the type, and creating appropriate+> -- primitive functions.+> addPrimitive :: Monad m => Context -> Name -- ^ Type name+>                 -> m Context+> addPrimitive (Ctxt st) n = do+>        checkNotExists n (defs st)+>        let Gam ctxt = defs st+>        let elims = Elims (MN ("none",0)) (MN ("none",0)) []+>        -- let newdefs = Gam ((n, (G (TCon 0 elims) (Ind TTCore.Star))):ctxt)+>        newdefs <- gInsert n (G (TCon 0 elims) (Ind TTCore.Star) defplicit) (Gam ctxt)+>        return $ Ctxt st { defs = newdefs }++> -- | Add a new binary operator on constants. Warning: The type you give+> -- is not checked!+> addBinOp :: (ViewConst a, ViewConst b, ViewConst c, IsTerm ty, Monad m) =>+>             Context -> Name -> (a->b->c) -> ty -> m Context+> addBinOp (Ctxt st) n f tyin = do+>        checkNotExists n (defs st)+>        Term (ty, _) <- Ivor.TT.check (Ctxt st) tyin+>        let fndef = PrimOp mkfun mktt+>        let Gam ctxt = defs st+>        -- let newdefs = Gam ((n,(G fndef ty)):ctxt)+>        newdefs <- gInsert n (G fndef ty defplicit) (Gam ctxt)+>        return $ Ctxt st { defs = newdefs }+>    where mkfun :: Spine Value -> Maybe Value+>          mkfun (Snoc (Snoc Empty (MR (RdConst x))) (MR (RdConst y)))+>              = case cast x of+>                   Just x' -> case cast y of+>                      Just y' -> Just $ MR (RdConst $ f x' y')+>                      Nothing -> Nothing+>                   Nothing -> Nothing+>          mkfun _ = Nothing+>          mktt :: [TT Name] -> Maybe (TT Name)+>          mktt [Const x, Const y]+>               = case cast x of+>                   Just x' -> case cast y of+>                      Just y' -> Just $ Const (f x' y')+>                      Nothing -> Nothing+>          mktt _ = Nothing++> -- | Add a new binary function on constants. Warning: The type you give+> -- is not checked!+> addBinFn :: (ViewConst a, ViewConst b, IsTerm ty, Monad m) =>+>             Context -> Name -> (a->b->ViewTerm) -> ty -> m Context+> addBinFn (Ctxt st) n f tyin = do+>        checkNotExists n (defs st)+>        Term (ty, _) <- Ivor.TT.check (Ctxt st) tyin+>        let fndef = PrimOp mkfun mktt+>        let Gam ctxt = defs st+>        -- let newdefs = Gam ((n,(G fndef ty)):ctxt)+>        newdefs <- gInsert n (G fndef ty defplicit) (Gam ctxt)+>        return $ Ctxt st { defs = newdefs }+>    where mkfun :: Spine Value -> Maybe Value+>          mkfun (Snoc (Snoc Empty (MR (RdConst x))) (MR (RdConst y)))+>              = case cast x of+>                   Just x' -> case cast y of+>                      Just y' -> case Ivor.TT.check (Ctxt st) $ f x' y' of+>                          Just (Term (Ind v,_)) ->+>                              Just $ nf (Gam []) (VG []) [] False v+>                      Nothing -> Nothing+>                   Nothing -> Nothing+>          mkfun _ = Nothing+>          mktt :: [TT Name] -> Maybe (TT Name)+>          mktt [Const x, Const y]+>              = case cast x of+>                   Just x' -> case cast y of+>                      Just y' -> case Ivor.TT.check (Ctxt st) $ f x' y' of+>                          Just (Term (Ind v,_)) ->+>                              Just v+>                      Nothing -> Nothing+>                   Nothing -> Nothing+>          mktt _ = Nothing+++> -- | Add a new primitive function on constants, usually used for converting+> -- to some form which can be examined in the type theory itself.+> -- Warning: The type you give is not checked!+> addPrimFn :: (ViewConst a, IsTerm ty, Monad m) =>+>             Context -> Name -> (a->ViewTerm) -> ty -> m Context+> addPrimFn (Ctxt st) n f tyin = do+>        checkNotExists n (defs st)+>        Term (ty, _) <- Ivor.TT.check (Ctxt st) tyin+>        let fndef = PrimOp mkfun mktt+>        let Gam ctxt = defs st+>        -- let newdefs = Gam ((n,(G fndef ty)):ctxt)+>        newdefs <- gInsert n (G fndef ty defplicit) (Gam ctxt)+>        return $ Ctxt st { defs = newdefs }+>    where mkfun :: Spine Value -> Maybe Value+>          mkfun (Snoc Empty (MR (RdConst x)))+>              = case cast x of+>                   Just x' -> case Ivor.TT.check (Ctxt st) $ f x' of+>                                  Just (Term (Ind v,_)) ->+>                                      Just $ nf (Gam []) (VG []) [] False v+>                                  Nothing -> Nothing+>                   Nothing -> Nothing+>          mkfun _ = Nothing+>          mktt :: [TT Name] -> Maybe (TT Name)+>          mktt [Const x]+>               = case cast x of+>                   Just x' -> case Ivor.TT.check (Ctxt st) $ f x' of+>                                  Just (Term (Ind v,_)) ->+>                                      Just v+>                                  Nothing -> Nothing+>                   Nothing -> Nothing+>          mktt _ = Nothing++> -- | Add a new externally defined function.+> -- Warning: The type you give is not checked!+> addExternalFn :: (IsTerm ty, Monad m) =>+>                  Context -> Name -> Int -- ^ arity+>                  -> ([ViewTerm] -> Maybe ViewTerm) -- ^ The function, which must+>                     -- accept a list of the right length given by arity.+>                  -> ty -> m Context+> addExternalFn (Ctxt st) n arity f tyin = do+>        checkNotExists n (defs st)+>        Term (ty, _) <- Ivor.TT.check (Ctxt st) tyin+>        let fndef = PrimOp mkfun mktt+>        let Gam ctxt = defs st+>        -- let newdefs = Gam ((n,(G fndef ty)):ctxt)+>        newdefs <- gInsert n (G fndef ty defplicit) (Gam ctxt)+>        return $ Ctxt st { defs = newdefs }+>    where mkfun :: Spine Value -> Maybe Value+>          mkfun sx | xs <- listify sx+>            = if (length xs) /= arity then Nothing+>               else case runf xs of+>                      Just res ->+>                          case (Ivor.TT.check (Ctxt st) res) of+>                             Nothing -> Nothing+>                             Just (Term (Ind tm, _)) ->+>                                 Just $ nf (Gam []) (VG []) [] False tm+>                      Nothing -> Nothing+>          mktt :: [TT Name] -> Maybe (TT Name)+>          mktt xs+>            = if (length xs) /= arity then Nothing+>               else case f (map viewtt xs) of+>                      Just res ->+>                          case (Ivor.TT.check (Ctxt st) res) of+>                             Nothing -> Nothing+>                             Just (Term (Ind tm, _)) ->+>                                 Just tm+>                      Nothing -> Nothing++Using 'Star' here is a bit of a hack; I don't want to export vt from+ViewTerm, and I don't want to cut&paste code, and it's thrown away anyway...+Slightly annoying, but we'll cope.++>          runf spine = f (map viewValue spine)+>          viewValue x = view (Term (Ind (forget ((quote x)::Normal)),+>                                 Ind TTCore.Star))+>          viewtt x = view (Term (Ind x, Ind TTCore.Star))+++> -- |Add implicit binders for names used in a type, but not declared.+> -- |Returns the new type and the number of implicit names bound.++Search for all unbound names and reverse the list so that we bind them+in left to right order. (Not that this really matters but I find it more+intuitive)++> addImplicit :: Context -> ViewTerm -> (Int, ViewTerm)+> addImplicit ctxt tm = bind 0 (reverse (namesIn tm)) tm+>   where bind i [] tm = (i,tm)+>         bind i (n:ns) tm | defined ctxt n = bind i ns tm+>                          | otherwise = bind (i+1) ns+>                                           (Forall n Placeholder tm)++> -- |Begin a new proof.+> theorem :: (IsTerm a, Monad m) => Context -> Name -> a -> m Context+> theorem (Ctxt st) n tm = do+>        checkNotExists n (defs st)+>        rawtm <- raw tm+>        (tv,tt) <- tcClaim (defs st) rawtm+>        case (proofstate st) of+>            Nothing -> do+>                       let thm = Tactics.theorem n tv+>                       attack defaultGoal+>                                  $ Ctxt st { proofstate = Just $ thm,+>                                              holequeue = [n],+>                                              hidden = []+>                                              }+>            (Just t) -> fail "Already a proof in progress"++> -- |Begin a new interactive definition.+> -- Actually, just the same as 'theorem' but this version allows you to+> -- make recursive calls, which should of course be done with care.+> interactive :: (IsTerm a, Monad m) => Context -> Name -> a -> m Context+> interactive (Ctxt st) n tm = do+>        checkNotExists n (defs st)+>        (Ctxt st') <- declare (Ctxt st) n tm+>        rawtm <- raw tm+>        (tv,tt) <- tcClaim (defs st) rawtm+>        case (proofstate st) of+>            Nothing -> do+>                       let thm = Tactics.theorem n tv+>                       attack defaultGoal+>                                  $ Ctxt st' { proofstate = Just $ thm,+>                                               holequeue = [n],+>                                               hidden = []+>                                               }+>            (Just t) -> fail "Already a proof in progress"++> -- |Suspend the current proof. Clears the current proof state; use 'resume'+> -- to continue the proof.+> suspend :: Context -> Context+> suspend (Ctxt st) = case (suspendProof st) of+>                        (Just st') -> Ctxt st'+>                        Nothing -> Ctxt st++> -- |Resume an unfinished proof, suspending the current one if necessary.+> -- Fails if there is no such name. Can also be used to begin a+> -- proof of an identifier previously claimed as an axiom.+> -- Remember that you will need to 'attack' the goal if you are resuming an+> -- axiom.+> resume :: Monad m => Context -> Name -> m Context+> resume ctxt@(Ctxt st) n =+>     case glookup n (defs st) of+>         Just ((Ivor.Nobby.Partial _ _),_) -> do let (Ctxt st) = suspend ctxt+>                                                 st' <- resumeProof st n+>                                                 return (Ctxt st')+>         Just (Unreducible,ty) ->+>             do let st' = st { defs = remove n (defs st) }+>                theorem (Ctxt st') n (Term (ty, Ind TTCore.Star))+>         _ -> fail "No such suspended proof"++> -- | Freeze a name (i.e., set it so that it does not reduce)+> -- Fails if the name does not exist.+> freeze :: Monad m => Context -> Name -> m Context+> freeze (Ctxt st) n+>      = case glookup n (defs st) of+>           Nothing -> fail $ show n ++ " is not defined"+>           _ -> return $ Ctxt st { defs = Ivor.Nobby.freeze n (defs st) }++> -- | Unfreeze a name (i.e., allow it to reduce).+> -- Fails if the name does not exist.+> thaw :: Monad m => Context -> Name -> m Context+> thaw (Ctxt st) n+>      = case glookup n (defs st) of+>           Nothing -> fail $ show n ++ " is not defined"+>           _ -> return $ Ctxt st { defs = Ivor.Nobby.thaw n (defs st) }+++> -- | Save the state (e.g. for Undo)+> save :: Context -> Context+> save (Ctxt st) = Ctxt $ saveState st++> -- | Clears the saved state (e.g. if undo no longer makes sense, like when+> -- a proof has been completed)+> clearSaved :: Context -> Context+> clearSaved (Ctxt st) = Ctxt st { undoState = Nothing }++> -- | Restore a saved state; fails if none have been saved.+> restore :: Monad m => Context -> m Context+> restore (Ctxt st) = case undoState st of+>                        Nothing -> fail "No saved state"+>                        (Just st') -> return $ Ctxt st'+++Give a parseable but ugly representation of a term.++> uglyPrint :: ViewTerm -> String+> uglyPrint t = show (forget t)++ -- |Parse and typecheck a term+ newTerm :: Monad m => Context -> String -> m Term+ newTerm (Ctxt st) str = do+     case (parseterm str) of+         Success raw -> do (tm,ty) <- typecheck (defs st) raw+                           return $ Term (tm, ty)+         Failure err -> fail err++> -- |Normalise a term and its type+> eval :: Context -> Term -> Term+> eval (Ctxt st) (Term (tm,ty)) = Term (normalise (defs st) tm,+>                                       normalise (defs st) ty)++> -- |Reduce a term and its type to Weak Head Normal Form+> whnf :: Context -> Term -> Term+> whnf (Ctxt st) (Term (tm,ty)) = Term (eval_whnf (defs st) tm,+>                                          eval_whnf (defs st) ty)++> -- |Check a term in the context of the given goal+> checkCtxt :: (IsTerm a, Monad m) => Context -> Goal -> a -> m Term+> checkCtxt (Ctxt st) goal tm =+>     do rawtm <- raw tm+>        prf <- case proofstate st of+>                 Nothing -> fail "No proof in progress"+>                 Just x -> return x+>        let h = case goal of+>                (Goal x) -> x+>                DefaultGoal -> head (holequeue st)+>        case (Tactics.findhole (defs st) (Just h) prf holeenv) of+>          (Just env) -> do t <- Ivor.Typecheck.check (defs st) env rawtm Nothing+>                           return $ Term t+>          Nothing -> fail "No such goal"+>  where holeenv :: Gamma Name -> Env Name -> Indexed Name -> Env Name+>        holeenv gam hs _ = Tactics.ptovenv hs++> -- |Evaluate a term in the context of the given goal+> evalCtxt :: (IsTerm a, Monad m) => Context -> Goal -> a -> m Term+> evalCtxt (Ctxt st) goal tm =+>     do rawtm <- raw tm+>        prf <- case proofstate st of+>                 Nothing -> fail "No proof in progress"+>                 Just x -> return x+>        let h = case goal of+>                (Goal x) -> x+>                DefaultGoal -> head (holequeue st)+>        case (Tactics.findhole (defs st) (Just h) prf holeenv) of+>          (Just env) -> do (tm, ty) <- Ivor.Typecheck.check (defs st) env rawtm Nothing+>                           let tnorm = normaliseEnv env (defs st) tm+>                           return $ Term (tnorm, ty)+>          Nothing -> fail "No such goal"+>  where holeenv :: Gamma Name -> Env Name -> Indexed Name -> Env Name+>        holeenv gam hs _ = Tactics.ptovenv hs+++> -- |Check whether the conversion relation holds between two terms, in the+> -- context of the given goal++> converts :: (Monad m, IsTerm a, IsTerm b) =>+>             Context -> Goal -> a -> b -> m Bool+> converts ctxt@(Ctxt st) goal a b+>     = do atm <- checkCtxt ctxt goal a+>          btm <- checkCtxt ctxt goal b+>          prf <- case proofstate st of+>                 Nothing -> fail "No proof in progress"+>                 Just x -> return x+>          let (Term (av,_)) = atm+>          let (Term (bv,_)) = btm+>          let h = case goal of+>                (Goal x) -> x+>                DefaultGoal -> head (holequeue st)+>          case (Tactics.findhole (defs st) (Just h) prf holeenv) of+>                (Just env) -> case checkConvEnv env (defs st) av bv "" of+>                     Just _ -> return True+>                     _ -> return False+>                Nothing -> fail "No such goal"+>  where holeenv :: Gamma Name -> Env Name -> Indexed Name -> Env Name+>        holeenv gam hs _ = Tactics.ptovenv hs++> -- |Lookup a definition in the context.+> getDef :: Monad m => Context -> Name -> m Term+> getDef (Ctxt st) n = case glookup n (defs st) of+>                         Just ((Fun _ tm),ty) -> return $ Term (tm,ty)+>                         _ -> fail "Not a function name"++> -- |Check whether a name is defined+> defined :: Context -> Name -> Bool+> defined (Ctxt st) n = case glookup n (defs st) of+>                          Just _ -> True+>                          _ -> False++> -- |Lookup a pattern matching definition in the context.+> getPatternDef :: Monad m => Context -> Name -> m Patterns+> getPatternDef (Ctxt st) n+>     = case glookup n (defs st) of+>           Just ((PatternDef pmf),ty) ->+>               return $ Patterns (map mkPat (getPats pmf))+>           Nothing -> fail "Not a pattern matching definition"+>    where getPats (PMFun _ ps) = ps+>          mkPat (Sch ps ret) = PClause (map viewPat ps) (view (Term (ret, (Ind TTCore.Star))))+>+>          viewPat (PVar n) = Name Bound (name (show n))+>          viewPat (PCon t n ty ts) = VTerm.apply (Name Bound (name (show n))) (map viewPat ts)+>          viewPat (PConst c) = Constant c+>          viewPat _ = Placeholder++> -- |Get all the names and types in the context+> getAllDefs :: Context -> [(Name,Term)]+> getAllDefs (Ctxt st) = let (Gam ds) = defs st in+>                            reverse (map info ds) -- input order!+>    where info (n,G _ ty _) = (n, Term (ty, Ind TTCore.Star))++> -- | Get the names of all of the constructors of an inductive family+> getConstructors :: Monad m => Context -> Name -> m [Name]+> getConstructors (Ctxt st) n+>      = case glookup n (defs st) of+>           Just ((TCon _ (Elims _ _ cs)),ty) -> return cs+>           _ -> fail "Not a type constructor"++Examine pattern matching elimination rules++> -- | Types of elimination rule+> data Rule = Case | Elim++> -- | Get the pattern matching elimination rule for a type+> getElimRule :: Monad m => Context -> Name -- ^ Type+>                  -> Rule -- ^ Which rule to get patterns for (case or elim)+>                  -> m Patterns+> getElimRule (Ctxt st) nm r =+>     case (lookupval nm (defs st)) of+>       Just (TCon _ (Elims erule crule cons)) ->+>          do let rule = case r of -- rule :: Name+>                          Case -> crule+>                          Ivor.TT.Elim -> erule+>             elim <- lookupM rule (eliminators st)+>             return $ Patterns $ map mkRed (fst $ snd elim)+>       Nothing -> fail $ (show nm) ++ " is not a type constructor"+>  where mkRed (RSch pats ret) = PClause (map viewRaw pats) (viewRaw ret)+>         -- a reduction will only have variables and applications+>        viewRaw (Var n) = Name Free n+>        viewRaw (RApp f a) = VTerm.App (viewRaw f) (viewRaw a)+>        viewRaw _ = VTerm.Placeholder++Get the actions performed by the last tactic++ getActions :: Context -> [Tactics.TacticAction]+ getActions (Ctxt st) = actions st++> getResponse :: Context -> String+> getResponse (Ctxt st) = response st++> -- |Get the goals still to be solved.+> getGoals :: Context -> [Goal]+> getGoals (Ctxt st) = map Goal (holequeue st)++> -- |Return whether all goals have been solved.+> allSolved :: Context -> Bool+> allSolved (Ctxt st) = null $ holequeue st++> -- |Get the number of unsolved goals+> numUnsolved :: Context -> Int+> numUnsolved (Ctxt st) =+>     case proofstate st of+>         Nothing -> 0+>         (Just t) -> length $ Tactics.allholes (defs st) False t++> -- |Return whether we are in the middle of proving something.+> proving :: Context -> Bool+> proving (Ctxt st) = case proofstate st of+>                        Nothing -> False+>                        _ -> True++> -- |Get the current proof term, if we are in the middle of a proof.+> proofterm :: Monad m => Context -> m Term+> proofterm (Ctxt st) = case proofstate st of+>                         Nothing -> fail "No proof in progress"+>                         Just (Ind (Bind _ (B (Guess v) t) _)) ->+>                             return $ Term (Ind v,Ind t)+>                         Just t -> fail $ "Proof finished; " ++ show t++> -- |Get the type and context of the given goal, if it exists+> getGoal :: Monad m => Context -> Goal -> m ([(Name,Term)], Term)+> getGoal (Ctxt st) goal =+>     let h = case goal of+>                   (Goal x) -> x+>                   DefaultGoal -> head (holequeue st) in+>       case (proofstate st) of+>         Nothing -> fail "No proof in progress"+>         (Just tm) ->+>             case (Tactics.findhole (defs st) (Just h) tm getHoleTerm) of+>               Just x -> return x+>               Nothing -> fail "No such goal"++> getHoleTerm gam hs tm = (getctxt hs,+>                          Term (normaliseEnv hs (Gam []) (binderType tm),+>                                Ind TTCore.Star))+>    where getctxt [] = []+>          getctxt ((n,B _ ty):xs) = (n,Term (Ind ty,Ind TTCore.Star)):+>                                    getctxt xs+>          binderType (Ind (Bind _ (B _ ty) _)) = (Ind ty)+>          binderType _ = error "Can't happen (binderType)"++> -- |Environment and goal type for a given subgoal+> data GoalData = GoalData {+>                  bindings :: [(Name,Term)],+>                      -- ^ Get the premises of the goal+>                  goalName :: Goal,+>                      -- ^ Get the name of the goal+>                  goalType :: Term+>                      -- ^ Get the type of the goal+>                  }+++> -- |Get information about a subgoal.+> goalData :: Monad m => Context -> Bool -- ^ Get all bindings (True), or+>                                        -- just lambda bindings (False)+>          -> Goal -> m GoalData+> goalData (Ctxt st) all goal = case proofstate st of+>         Nothing -> fail "No proof in progress"+>         (Just prf) ->+>             let h = case goal of+>                           (Goal x) -> x+>                           DefaultGoal -> head (holequeue st) in+>               case (Tactics.findhole (defs st) (Just h) prf holedata) of+>                  (Just x) -> return x+>                  Nothing -> fail "No such goal"+>  where holedata :: Gamma Name -> Env Name -> Indexed Name -> GoalData+>        holedata gam hs tm = hd' (Tactics.ptovenv hs) (finalise tm) -- (normaliseEnv hs (Gam []) (finalise tm))+>        hd' hs (Ind (Bind n (B _ tm) _))+>            = GoalData (getbs hs) (Goal n)+>                  (Term (Ind tm,+>                         (Ind TTCore.Star)))+>        getbs [] = []+>        getbs ((n,B b ty):xs)+>            | (b == TTCore.Lambda || all) && (not (n `elem` (hidden st)))+>                = (n, (Term (Ind ty, Ind TTCore.Star))):+>                  getbs xs+>        getbs (_:xs) = getbs xs++> -- | Get the names and types of all goals+> subGoals :: Monad m => Context -> m [(Name,Term)]+> subGoals (Ctxt st) = case proofstate st of+>         Nothing -> fail "No proof in progress"+>         (Just prf) -> return $+>                        map (\ (x,ty) -> (x,Term (ty,Ind TTCore.Star)))+>                         $ Tactics.allholes (defs st) True prf++> -- | Create a name unique in the proof state+> uniqueName :: Monad m => Context -> Name -- ^ Suggested name+>            -> m Name -- ^ Unique name based on suggested name+> uniqueName (Ctxt st) n = case proofstate st of+>         Nothing -> fail "No proof in progress"+>         (Just (Ind prf)) -> return $ uniqify n $ getBoundNames (Sc prf)++Tactics++ newTheorem :: Monad m => Context -> Name -> String -> m Context+ newTheorem (Ctxt st) n str = do+    rawtm <- case parseterm str of+                    (Success x) -> return x+                    (Failure err) -> fail err+    (tv,tt) <- tcClaim (defs st) rawtm+    case (proofstate st) of+        Nothing -> do let thm = Tactics.theorem n tv+                      (start, _) <- Tactics.runtactic (defs st) n thm+                                       (Tactics.attack (fH tt))+                      return $ Ctxt st { proofstate = Just $ start,+                                         holequeue =+                                             (fH tt):n:(holequeue st) }+        (Just t) -> fail "Already a proof in progress"+   where fH (Ind tt) = uniqify (UN "H") [n]+++> -- |Lift a finished proof into the context+> qed :: Monad m => Context -> m Context+> qed (Ctxt st)+>     = do case proofstate st of+>            Just prf -> do+>              newdef@(name,val@(G (Fun _ ind) _ _)) <-+>                  qedLift (defs st) False prf+>              let isrec = rec name+>              let (Gam olddefs) = remove name (defs st)+>              let runtts = runtt st+>              let scs = lift name (levelise (normalise (Gam []) ind))+>              let bc = compileAll (runtts++scs) scs+>              let newbc = bc++(bcdefs st)+>              defs' <- gInsert name val (defs st)+>              let newdefs = setRec name isrec defs'+>              return $ Ctxt st { proofstate = Nothing,+>                             bcdefs = newbc,+>                             runtt = runtts ++ scs,+>                             defs = newdefs } -- Gam (newdef:olddefs) }+>            Nothing -> fail "No proof in progress"+>  where rec nm = case lookupval nm (defs st) of+>                   Nothing -> False+>                   _ -> True++> qedLift :: Monad m => Gamma Name -> Bool -> Indexed Name ->+>                       m (Name, Gval Name)+> qedLift gam freeze+>             (Ind (Bind x (B (TTCore.Let v) ty) (Sc (P n)))) | n == x =+>     do let (Ind vnorm) = convNormalise (Gam []) (finalise (Ind v))+>        verify gam (Ind v)+>        return $ (x, G (Fun opts (Ind vnorm)) (finalise (Ind ty)) defplicit)+>   where opts = if freeze then [Frozen] else []+> qedLift _ _ tm = fail $ "Not a complete proof " ++ show tm++> -- | Focus on a different hole, i.e. set the default goal.+> focus :: Tactic+> focus (Goal n) (Ctxt st)+>    | n `elem` holequeue st+>        = attack (Goal n) $ Ctxt st { holequeue = jumpqueue n (holequeue st) }+>    | otherwise = fail "No such goal"+> focus _ x = return x -- Default goal already first++> -- | Hide a premise+> hide :: Tactic+> hide (Goal n) (Ctxt st)+>    = return $ Ctxt st { hidden = nub (n:(hidden st)) }++> -- | The Identity tactic, does nothing.+> idTac :: Tactic+> idTac goal ctxt = return ctxt++> -- | The Tracing tactic; does nothing, but uses 'trace' to dump the+> -- current proof state+> traceTac :: Tactic+> traceTac goal ctxt@(Ctxt st) = trace ("Proofstate: " +++>                                       (show (proofstate st) ++ "\nHoles" +++>                                       (show (holequeue st)))) $ return ctxt++> infixl 5 >->, >=>, >+>, >|>++Apply two tactics consecutively to the same goal.++> seqTac :: Tactic -> Tactic -> Tactic+> seqTac tac1 tac2 goalin ctxt@(Ctxt st) = do+> -- In case the default goal changes, remember where we are+>     let goal = case goalin of+>                     DefaultGoal -> Goal $ head (holequeue st)+>                     x -> x+>     ctxt' <- tac1 goal ctxt+>     tac2 goal ctxt'++> -- | Sequence two tactics; applies two tactics sequentially to the same goal+> (>->) :: Tactic -> Tactic -> Tactic+> (>->) x y = seqTac x y++> thenTac :: Tactic -> Tactic -> Tactic+> thenTac tac1 tac2 goal ctxt@(Ctxt st) = do+>     let hq = holequeue st+>     (Ctxt st') <- tac1 goal ctxt+>     let newholes = (holequeue st') \\ hq+>     -- Why reverse? Because then the new hole queue is the right order.+>     runThen (map Goal (reverse newholes)) tac2 (Ctxt st')+>   where runThen [] _ ctxt = return ctxt+>         runThen (x:xs) tac ctxt = do ctxt' <- tac x ctxt+>                                      runThen xs tac ctxt'++> -- | Apply a tactic, then apply another to each subgoal generated.+> (>=>) :: Tactic -> Tactic -> Tactic+> (>=>) x y = thenTac x y+++> nextTac :: Tactic -> Tactic -> Tactic+> nextTac tac1 tac2 goal ctxt = do+>     ctxt' <- tac1 goal ctxt+>     tac2 DefaultGoal ctxt'++> -- | Apply a sequence of tactics to the default goal. Read the type+> -- as ['Tactic'] -> 'Tactic'+> tacs :: Monad m => [Goal -> Context -> m Context] ->+>         Goal -> Context -> m Context+> tacs [] = idTac+> tacs (t:ts) = \g ctxt -> do ctxt <- t g ctxt+>                             tacs ts DefaultGoal ctxt++> -- | Apply a tactic, then apply the next tactic to the next default subgoal.+> (>+>) :: Tactic -> Tactic -> Tactic+> (>+>) x y = nextTac x y++> -- | Try a tactic.+> try :: Tactic -- ^ Tactic to apply+>     -> Tactic -- ^ Apply if first tactic succeeds+>     -> Tactic -- ^ Apply if first tactic fails.+>     -> Tactic+> try tac success failure goal ctxt =+>     case tac goal ctxt of+>         Just ctxt' -> success goal ctxt'+>         Nothing -> failure goal ctxt++> -- | Tries the left tactic, if that fails try the right one. Shorthand for+> -- 'try' x 'idTac' y.+> (>|>) :: Tactic -> Tactic -> Tactic+> (>|>) x y = try x idTac y++Convert an internal tactic into a publicly available tactic.++> runTac :: Tactics.Tactic -> Tactic+> runTac tac goal (Ctxt st) | null (holequeue st) = fail "No more goals"+> runTac tac goal (Ctxt st) = do+>     let hole = case goal of+>                     (Goal x) -> x+>                     DefaultGoal -> head (holequeue st)+>     let (Just prf) = proofstate st+>     (prf', act) <- Tactics.runtactic (defs st) hole prf tac+>     let st' = addgoals act st+>     return $ Ctxt st' { proofstate = Just prf',+>                         --holequeue = jumpqueue hole+>                         --       (holequeue st'),+>                         actions = act+>                       }+>     where addgoals [] st = st+>           addgoals ((Tactics.AddGoal n):xs) st+>               = addgoals xs (st { holequeue = nub (n:(holequeue st)) })+>           addgoals ((Tactics.NextGoal n):xs) st+>               = addgoals xs (st { holequeue = nub (second n (holequeue st)) })+>           addgoals ((Tactics.AddAxiom n ty):xs) st+>               = let Gam ctxt = defs st in+>                     addgoals xs (st+>                        { defs = Gam ((n,G Unreducible (finalise (Ind ty)) defplicit):ctxt) })+>           addgoals ((Tactics.HideGoal n):xs) st+>               = addgoals xs (st { hidden = nub (n:(hidden st)) })+>           addgoals (_:xs) st = addgoals xs st+>           second n (x:xs) = x:n:xs+>           second n [] = [n]++> -- | Prepare a goal for introduction.+> attackWith :: Name -- ^ Name for new goal+>            -> Tactic+> attackWith n goal ctxt =+>     do (Ctxt st) <- runTac (Tactics.attack n) goal ctxt+>        return $ Ctxt st { holequeue = nub (n:(holequeue st)) }++> -- | Prepare a goal for introduction.+> attack :: Tactic+> attack goal (Ctxt st) = do n <- getName+>                            attackWith n goal (Ctxt st)+>    where getName = do allnames <- case (proofstate st) of+>                             Nothing -> fail "No proof in progress"+>                             Just (Ind tm) ->+>                                 return $ binderMap (\n _ _ -> n) tm+>                       return $ uniqify (name "H") ((holequeue st)++allnames)++> -- | Make a local claim+> claim :: IsTerm a => Name -> a -> Tactic+> claim name ty = claim' name ty >+> keepSolving+> claim' name ty g ctxt = do rawty <- raw ty+>                            name' <- uniqueName ctxt name+>                            runTac (Tactics.claim name' rawty) g ctxt++> -- | Solve a goal by applying a function.+> -- If the term given has arguments, attempts to fill in these arguments+> -- by unification and solves them (with 'solve').+> -- See 'refineWith' and 'basicRefine' for slight variations.+> refine :: IsTerm a => a -> Tactic+> refine tm = (basicRefine tm >=> trySolve) >+> keepSolving++> -- | Solve a goal by applying a function.+> -- If the term given has arguments, this will create a subgoal for each.+> -- Some arguments may be solved by unification, in which case they will+> -- already have a guess attached after refinement, but the guess will not+> -- be solved (via 'solve').+> basicRefine :: IsTerm a => a -> Tactic+> basicRefine tm = do rawtm <- raw tm+>                     runTac (Tactics.refine rawtm [])++> -- | Solve a goal by applying a function with some arguments filled in.+> -- See 'refine' for details.+> refineWith :: IsTerm a => a -> [a] -> Tactic+> refineWith tm args = (refineWith' tm args >=> trySolve) >+> keepSolving++> refineWith' tm args = do rawtm <- raw tm+>                          rawargs <- mapM raw args+>                          runTac (Tactics.refine rawtm rawargs)++> -- | Finalise a goal's solution.+> solve :: Tactic+> solve goal ctxt+>     = do (Ctxt st') <- runTac (Tactics.solve) goal ctxt+>          return $ Ctxt st' { holequeue =+>                                  removeGoal goal (holequeue st') }+>   where removeGoal DefaultGoal xs = stail xs+>         removeGoal (Goal x) xs = xs \\ [x]++> -- | If the goal has a solution, finalise it, otherwise prepare the+> -- goal (with attack).+> -- Typically, could be used on the subgoals generated by refinement, where+> -- some may have solutions attached already, and others will need to be+> -- prepared.+> trySolve :: Tactic+> trySolve = try solve idTac attack++> -- | Finalise as many solutions of as many goals as possible.+> keepSolving :: Tactic+> keepSolving goal ctxt+>     | allSolved ctxt = return ctxt+> keepSolving goal ctxt = trySolve (getGoals ctxt) ctxt+>    where trySolve [] ctxt = return ctxt+>          trySolve (x:xs) ctxt+>              = case solve x ctxt of+>                   Just ctxt' -> trySolve xs ctxt'+>                   Nothing -> trySolve xs ctxt++-- > keepSolving goal ctxt+-- >   | not (null (getGoals ctxt)) =+-- >     case solve goal ctxt of+-- >        (Just ctxt') -> keepSolving defaultGoal ctxt'+-- >        Nothing -> return ctxt+-- >   | otherwise = return ctxt++> -- | Attach a solution to a goal.+> fill :: IsTerm a => a -> Tactic+> fill guess = fill' guess >+> keepSolving++> fill' guess = do rawguess <- raw guess+>                  runTac (Tactics.fill rawguess)++> -- | Remove a solution from a goal.+> abandon :: Tactic+> abandon = runTac (Tactics.regret)++> -- | Remove all claims with no guesses attached and which are unused in+> -- their scope.+> tidy :: Tactic+> tidy = runTac (Tactics.tidy)++> -- | Substitute a let bound value into its scope.+> cut :: Tactic+> cut goal ctxt = do (Ctxt st) <- runTac (Tactics.cut) goal ctxt+>                    return $ Ctxt st { holequeue = stail (holequeue st) }++> -- | Rename the outermost binder in the given goal+> rename :: Name -> Tactic+> rename n = runTac (Tactics.rename n)++FIXME: Choose a sensible name here++> -- | Introduce an assumption (i.e. a lambda binding)+> intro :: Tactic+> intro = runTac (Tactics.intro)++> -- | Introduce an assumption (i.e. a lambda binding)+> introName :: Name -- ^ Name for the assumption+>                -> Tactic+> introName n = (rename n >-> intro)++> -- | Keep introducing things until there's nothing left to introduce.+> intros :: Tactic+> intros goal ctxt = do_intros goal ctxt+>   where do_intros :: Tactic+>         do_intros = try intro do_intros idTac++> -- | Keep introducing things until there's nothing left to introduce,+> -- Must introduce at least one thing.+> intros1 :: Tactic+> intros1 goal ctxt =+>     do ctxt <- intro goal ctxt -- Must be at least one thing+>        do_intros goal ctxt+>   where do_intros :: Tactic+>         do_intros = try intro do_intros idTac++> -- | As 'intros', but with names, and stop when we've run out of names.+> -- Fails if too many names are given.++> introsNames :: [Name] -> Tactic+> introsNames [] = idTac+> introsNames (n:ns) = \goal ctxt ->+>     do ctxt <- introName n goal ctxt+>        introsNames ns goal ctxt++> -- | Check that the goal is definitionally equal to the given term,+> -- and rewrite the goal accordingly.+> equiv :: IsTerm a => a -> Tactic+> equiv ty = do rawty <- raw ty+>               runTac (Tactics.equiv rawty)++> -- | Abstract over the given term in the goal.+> generalise :: IsTerm a => a -> Tactic+> generalise tm = generalise' tm >-> attack++> generalise' tm = do rawtm <- raw tm+>                     runTac (Tactics.generalise rawtm)++> -- | Abstract over the given term in the goal, and also all variables+> -- appearing in the goal whose types depend on it.+> dependentGeneralise :: IsTerm a => a -> Tactic+> dependentGeneralise tm = dependentGeneralise' tm++> dependentGeneralise' tm g ctxt =+>     do gd <- goalData ctxt False g+>        vtm <- checkCtxt ctxt g tm+>        ctxt <- gDeps (filter ((occursIn (view vtm)).(view.snd))+>                                  (bindings gd))+>                   ctxt (view (goalType gd))+>        generalise tm g ctxt+>   where gDeps [] ctxt gty = return ctxt+>         gDeps (x:xs) ctxt gty+>           | freeIn (fst x) gty+>               = do ctxt <- generalise (Name Free (fst x)) g ctxt+>                    gDeps xs ctxt gty+>           | otherwise = gDeps xs ctxt gty++> -- | Add a new top level argument after the arguments its type depends on+> -- (changing the type of the theorem). This can be useful if, for example,+> -- you find you need an extra premise to prove a goal.+> addArg :: IsTerm a => Name -> a -> Tactic+> addArg n ty g ctxt@(Ctxt st)+>     = do rawty <- raw ty+>          Term (Ind tm, _) <- checkCtxt ctxt g rawty+>          st' <- Ivor.State.addArg st n tm+>          return $ Ctxt st'++> -- | Replace a term in the goal according to an equality premise. Any+> -- equality type with three arguments is acceptable (i.e. the type,+> -- and the two values),+> -- provided there are suitable replacement and symmetry lemmas.+> -- Heterogeneous equality as provided by 'addEquality' is acceptable+> -- (if you provide the lemmas!).+> replace :: (IsTerm a, IsTerm b, IsTerm c, IsTerm d) =>+>            a -- ^ Equality type (e.g. @Eq : (A:*)(a:A)(b:A)*@)+>         -> b -- ^ replacement lemma (e.g. @repl : (A:*)(a:A)(b:A)(q:Eq _ a b)(P:(a:A)*)(p:P a)(P b)@)+>         -> c -- ^ symmetry lemma (e.g. @sym : (A:*)(a:A)(b:A)(p:Eq _ a b)(Eq _ b a)@)+>         -> d -- ^ equality premise+>         -> Bool -- ^ apply premise backwards (i.e. apply symmetry)+>         -> Tactic+> replace eq repl sym tm flip = replace' eq repl sym tm flip >+> attack+> replace' eq repl sym tm flip =+>     do rawtm <- raw tm+>        raweq <- raw eq+>        rawrepl <- raw repl+>        rawsym <- raw sym+>        runTac (Tactics.replace raweq rawrepl rawsym rawtm flip)++> -- | Add an axiom to the global context which would solve the goal,+> -- and apply it.+> -- FIXME: This tactic doesn't pick up all dependencies on types, but is+> -- okay for simply typed axioms, e.g. equations on Nats.+> axiomatise :: Name -- ^ Name to give axiom+>            -> [Name] -- ^ Premises to pass to axiom+>            -> Tactic+> axiomatise n ns = runTac (Tactics.axiomatise n ns)++> -- | Normalise the goal+> compute :: Tactic+> compute = runTac Tactics.evalGoal++> -- | Beta reduce in the goal+> beta :: Tactic+> beta = runTac Tactics.betaReduce++> -- | Beta reduce the goal, unfolding the given function+> unfold :: Name -> Tactic+> unfold nm = runTac (Tactics.reduceWith nm)++> -- | Prepare to return a value in a computation+> returnComputation :: Tactic+> returnComputation g ctxt = do+>     (_, gtype) <- getGoal ctxt g+>     rtype <- getRType (view gtype)+>     name <- uniqueName ctxt (name "returnval")+>     ctxt <- claim name rtype g ctxt+>     fill (VTerm.Return (Name Bound name)) g ctxt+>  where getRType (VTerm.Label _ _ ty) = return ty+>        getRType _ = fail "Not a labelled type"++> -- | Prepare to return a quoted value+> quoteVal :: Tactic+> quoteVal = runTac Tactics.quote++> -- | Apply an eliminator.+> by :: IsTerm a => a -- ^ An elimination rule applied to a target.+>        -> Tactic+> by rule = (by' rule >=> attack) >+> keepSolving++> by' rule = do rawrule <- raw rule+>               runTac (Tactics.by rawrule)++> -- | Apply the appropriate induction rule to the term.+> induction :: IsTerm a => a -- ^ target of the elimination+>                -> Tactic+> induction tm = (induction' tm >=> attack) >+> keepSolving++> induction' tm = do rawtm <- raw tm+>                    runTac (Tactics.casetac True rawtm)++> -- | Apply the appropriate case analysis rule to the term.+> -- Like 'induction', but no induction hypotheses generated.+> cases :: IsTerm a => a -- ^ target of the case analysis+>                -> Tactic+> cases tm = (cases' tm >=> attack) >+> keepSolving+> cases' tm = do rawtm <- raw tm+>                runTac (Tactics.casetac False rawtm)++> -- | Find a trivial solution to the goal by searching through the context+> -- for a premise which solves it immediately by refinement+> trivial :: Tactic+> trivial g ctxt+>     = do gd <- goalData ctxt False g+>          let ps = bindings gd+>          tryall ps g ctxt+>    where tryall [] g ctxt = fail "No trivial solution found"+>          tryall ((x,ty):xs) g ctxt+>              = do ctxt' <- ((refine (Name Free x)) >|> (fill (Name Free x))+>                                 >|> idTac)  g ctxt+>                   if (numUnsolved ctxt' < numUnsolved ctxt)+>                      then return ctxt'+>                      else tryall xs g ctxt++Spot the allowed recursive calls in a proof state. This is quite basic,+and only spots primitive recursion for the moment, rather than any+particularly cunning induction hypotheses like those living in memos etc.++> data RecAllowed = Rec { flexible :: [Name], -- arguments that can be anything+>                         function :: Name, -- function to call+>                         args :: [ViewTerm], -- arguments to function+>                         hypothesis :: ViewTerm -- hypothesis which calls it+>                       }+>   deriving Show++> allowedrec :: Monad m => Goal -> Context -> m [RecAllowed]+> allowedrec g ctxt = do+>     gd <- goalData ctxt False g+>     return $ findRec $ bindings gd+>  where+>    findRec [] = []+>    findRec ((n,t):ts) = case isCall (Name Bound n) [] (view t) of+>                           Just v -> v:(findRec ts)+>                           _ -> findRec ts++>    isCall n env (VTerm.Label name args _) = Just (Rec env name args n)+>    isCall n env (Forall name _ scope) = isCall n (name:env) scope+>    isCall _ _ _ = Nothing++> -- | Make a recursive call of a computation. The term must be an+> -- allowed recursive call, identified in the context by having a+> -- labelled type.++FIXME: This function is horrible. Redo it at some point...++> call :: IsTerm a => a -> Tactic+> call tm g ctxt = do tm <- raw tm+>                     allowed <- allowedrec g ctxt+>                     rec <- {- trace (show allowed) $ -} findRec allowed tm+>                     fill rec g ctxt+>   where+>     findRec :: Monad m => [RecAllowed] -> Raw -> m ViewTerm+>     findRec [] tm = fail "This recursive call not allowed"+>     findRec ((Rec fs nm args hyp):rs) tm =+>         case mkRec fs nm args hyp tm of+>            Just x -> return x+>            _ -> findRec rs tm+>     mkRec fs nm args hyp tm = do+>          let (tmf,tmas) = getfa tm []+>          ttmas <- mapM (checkCtxt ctxt g) tmas+>          let vtmas = map view ttmas+>          if (nm==tmf) then do+>             ihargs <- getIH fs args vtmas+>             return $ VTerm.Call nm vtmas (VTerm.apply hyp ihargs)+>           else fail "Not this one"+>     getfa (RApp f a) args = getfa f (a:args)+>     getfa (Var x) args = (x,args)+>     getIH fs [] [] = return []+>     getIH (f:fs) (x:xs) (y:ys)+>         | Just f == tryvar x = -- x is pi bound, so better get an ih arg.+>                    do ycheck <- checkCtxt ctxt g y+>                       rest <- getIH fs xs ys+>                       return ((view ycheck):rest)+>     getIH fs (x:xs) (y:ys)+>         | tryvareq x y+>              = getIH fs xs ys -- x not pi bound, but names okay.+>     getIH _ _ _ = fail "Not this one" -- Something doesn't match up.++>     tryvar (Name _ x) = Just x+>     tryvar _ = Nothing+>     tryvareq x y = let jx = tryvar x+>                        jy = tryvar y in+>                        jx /= Nothing && jx == jy++> -- | Create a .hs file containing (unreadable) Haskell code implementing+> -- all of the definitions.+> -- (TODO: Generate a more readable, usable interface)+> compile :: Context -- ^ context to compile+>            -> String -- ^ root of filenames to generate+>            -> IO ()+> compile (Ctxt st) froot+>     = do let hd = mkHeaders (bcdefs st)+>          let ev = mkEval (bcdefs st)+>          let cd = mkCode (bcdefs st)+>          Compiler.compile st froot+>          -- writeFile (froot++".c") $ hd ++ ev ++ cd++
+ Ivor/TTCore.lhs view
@@ -0,0 +1,831 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.TTCore where++> import Ivor.Gadgets+> import Ivor.Constant++> import Data.List+> import Data.Char+> import Control.Monad.State+> import Data.Typeable+> import Debug.Trace++Raw terms are those read in directly from the user, and may be badly typed.+(Need to add marked up terms for optimisation).++> data Raw+>     = Var Name+>     | RApp Raw Raw+>     | RBind Name (Binder Raw) Raw+>     | forall c.(Constant c) => RConst !c+>     | RStar+>     | RInfer -- Term to be inferred by the typechecker+>     | RMeta Name -- a metavariable, to be implemented separately+>     | RLabel Raw RComputation+>     | RCall RComputation Raw+>     | RReturn Raw+>     | RAnnot String -- Debugging hack+>     | RStage RStage++> data RComputation = RComp Name [Raw]+>   deriving Eq++> data RStage = RQuote Raw+>             | RCode Raw+>             | REval Raw+>             | REscape Raw+>   deriving Eq++TT represents terms in the core type theory, parametrised by the+representation of the names++> data TT n+>     = P n+>     | V Int+>     | Con Int n Int -- Tag, name and arity+>     | TyCon n Int  -- Name and arity+>     | Elim n+>     | App (TT n) (TT n)+>     | Bind n (Binder (TT n)) (Scope (TT n))+>     | Proj n Int (TT n) -- Projection in iota schemes (carries type name)+>     | Label (TT n) (Computation n)+>     | Call (Computation n) (TT n)+>     | Return (TT n)+>     | forall c. Constant c => Const !c+>     | Star+>     | Stage (Stage n)++> data Computation n = Comp n [TT n]++Stage gives staging annotations++> data Stage n = Quote (TT n)+>              | Code (TT n)+>              | Eval (TT n) (TT n) -- term, type+>              | Escape (TT n) (TT n) -- term, type+>  deriving Show++Constants++> class (Typeable c, Show c, Eq c) => Constant c where+>     constType :: c -> TT Name++> newtype Scope n = Sc n+>    deriving (Show, Eq)++> data Binder n = B (Bind n) n+>    deriving (Show, Eq)++> data Bind n+>     = Lambda+>     | Pi+>     | Let n+>     | Hole+>     | Guess n+>     | Pattern n+>     | MatchAny+>    deriving (Show, Eq)++Local environments++> type Env n = [(n,Binder (TT n))]++Separate types for de Bruijn indexed terms and de Bruijn levelled terms++> newtype Levelled n = Lev (TT n) deriving Eq+> newtype Indexed n = Ind (TT n) deriving Eq++Pattern represents the patterns used to define iota schemes.++> data Pattern n =+>	 PVar n  -- Variable+>      | PCon Int n n [Pattern n] -- Constructor, with tag and type+>      | forall c.(Constant c) => PConst !c+>      | PMarkCon n [Pattern n] -- Detagged constructor+>      | PTerm -- Presupposed term (don't care what it is)+>      | PMark n  -- Marked variable++> instance Show n => Show (Pattern n) where+>     show (PVar n) = show n+>     show (PCon t n ty ts) = show n ++ show ts+>     show (PConst c) = show c+>     show (PMarkCon n ts) = show n ++ show ts+>     show PTerm = "_"+>     show (PMark n) = "[" ++ show n ++ "]"++> instance Eq n => Eq (Pattern n) where+>     (==) (PVar x) (PVar y) = x == y+>     (==) (PCon t1 n1 ty1 ts1) (PCon t2 n2 ty2 ts2) = t1 == t2 &&+>                                                      n1 == n2 &&+>                                                      ty1 == ty2 &&+>                                                      ts1 == ts2+>     (==) (PConst x) (PConst y) = case cast x of+>                                     Just x' -> x' == y+>                                     _ -> False+>     (==) (PMarkCon n1 ts1) (PMarkCon n2 ts2) = n1 == n2 && ts1 == ts2+>     (==) PTerm PTerm = True+>     (==) (PMark x) (PMark y) = x == y+>     (==) _ _ = False++      {- | forall c. Constant c => PConst c -- Constant (don't think it makes sense) -}++> instance Eq n => Ord (Pattern n) where+>     compare (PCon x _ _ _) (PCon y _ _ _) = compare x y+>     compare _ _ = EQ -- Don't care!++UN covers names defined by users, MN covers names invented by the system.+This keeps both namespaces separate.++> data Name+>     = UN String+>     | MN (String,Int)+>   deriving Eq++Data declarations and pattern matching++> data RawScheme = RSch [Raw] Raw+>   deriving Show++> data Scheme n = Sch [Pattern n] (Indexed n)+>         deriving Show++> type PMRaw = RawScheme++For equality of patterns, we're only interested in whether the LHS are+equal. This is so that we can easily filter out overlapping cases when+generating cases for coverage/type checking. Checking for overlapping+is dealt with later.++> instance Eq PMRaw where+>     (==) (RSch ps r) (RSch ps' r') = ps == ps'++> type PMDef n = Scheme n++> data PMFun n = PMFun Int -- arity+>                      [PMDef n] -- patterns+>    deriving Show++====================== Functors ===============================++> instance Functor Scope where+>     fmap f (Sc x) = Sc (f x)++> instance Functor Binder where+>     fmap f (B b x) = B (fmap f b) (f x)++> instance Functor Bind where+>     fmap f Lambda = Lambda+>     fmap f Pi = Pi+>     fmap f (Let x) = Let (f x)+>     fmap f Hole = Hole+>     fmap f (Guess x) = Guess (f x)+>     fmap f (Pattern x) = Pattern (f x)+>     fmap f MatchAny = MatchAny++> instance Functor TT where+>     fmap f (P x) = P (f x)+>     fmap f (V i) = V i+>     fmap f (Con t x i) = Con t (f x) i+>     fmap f (TyCon x i) = TyCon (f x) i+>     fmap f (Elim x) = Elim (f x)+>     fmap f (App tf a) = App (fmap f tf) (fmap f a)+>     fmap f (Bind n b sc) = Bind (f n) (fmap (fmap f) b) (fmap (fmap f) sc)+>     fmap f (Proj n i x) = Proj (f n) i (fmap f x)+>     fmap f (Const x) = Const x+>     fmap f (Label t c) = Label (fmap f t) (fmap f c)+>     fmap f (Call c t) = Call (fmap f c) (fmap f t)+>     fmap f (Return t) = Return (fmap f t)+>     fmap f (Stage t) = Stage (fmap f t)+>     fmap f Star = Star++> instance Functor Stage where+>     fmap f (Quote t) = Quote (fmap f t)+>     fmap f (Code t) = Code (fmap f t)+>     fmap f (Eval t ty) = Eval (fmap f t) (fmap f ty)+>     fmap f (Escape t ty) = Escape (fmap f t) (fmap f ty)++> sLift :: (TT a -> TT b) -> Stage a -> Stage b+> sLift f (Quote t) = Quote (f t)+> sLift f (Code t) = Code (f t)+> sLift f (Eval t ty) = Eval (f t) (f ty)+> sLift f (Escape t ty) = Escape (f t) (f ty)++> sLiftf :: (TT a -> b) -> Stage a -> b+> sLiftf f (Quote t) = f t+> sLiftf f (Code t) = f t+> sLiftf f (Eval t ty) = f t+> sLiftf f (Escape t ty) = f t++> sLiftM :: Monad m => (TT a -> m (TT b)) -> Stage a -> m (Stage b)+> sLiftM f (Quote t) = do x <- f t+>                         return $ Quote x+> sLiftM f (Code t) = do x <- f t+>                        return $ Code x+> sLiftM f (Eval t ty) = do x <- f t+>                           xty <- f ty+>                           return $ Eval x xty+> sLiftM f (Escape t ty) = do x <- f t+>                             xty <- f ty+>                             return $ Escape x xty++> instance Functor Computation where+>     fmap f (Comp n ts) = Comp (f n) (fmap (fmap f) ts)++> instance Functor Indexed where+>     fmap f (Ind t) = Ind $ fmap f t++> instance Functor Levelled where+>     fmap f (Lev t) = Lev $ fmap f t++====================== Gadgets for TT =============================++Do something hairy to all the Vs in a TT term. Kind of like fmap, only on+the variable numbers rather than the names.++Each V is processed with a function taking the context and the index.++> vapp :: (([n],Int) -> (TT n)) -> TT n -> TT n+> vapp f t = v' [] t+>   where+>     v' ctx (V i) = f (ctx,i)+>     v' ctx (App f' a) = (App (v' ctx f') (v' ctx a))+>     v' ctx (Bind n b (Sc sc)) = (Bind n (fmap (v' ctx) b)+>			          (Sc (v' (n:ctx) sc)))+>     v' ctx (Proj n i x) = Proj n i (v' ctx x)+>     v' ctx (Label t (Comp n cs))+>         = Label (v' ctx t) (Comp n (fmap (v' ctx) cs))+>     v' ctx (Call (Comp n cs) t)+>         = Call (Comp n (fmap (v' ctx) cs)) (v' ctx t)+>     v' ctx (Return t) = Return (v' ctx t)+>     v' ctx (Stage t) = Stage (sLift (v' ctx) t)+>     v' ctx x = x++> indexise :: Levelled n -> Indexed n+> indexise (Lev t) = Ind $ vapp (\ (ctx,i) -> V (i-((length ctx)-1))) t++> levelise :: Indexed n -> Levelled n+> levelise (Ind t) = Lev $ vapp (\ (ctx,i) -> V ((length ctx)-i-1)) t++Same, but for Ps++> papp :: (n -> (TT n)) -> TT n -> TT n+> papp f t = v' t+>   where+>     v' (P n) = f n+>     v' (V i) = V i+>     v' (App f' a) = (App (v' f') (v' a))+>     v' (Bind n b (Sc sc)) = (Bind n (fmap (v') b)+>			          (Sc (v' sc)))+>     v' (Proj n i x) = Proj n i (v' x)+>     v' (Label t (Comp n cs))+>         = Label (v' t) (Comp n (fmap (v') cs))+>     v' (Call (Comp n cs) t)+>         = Call (Comp n (fmap (v') cs)) (v' t)+>     v' (Return t) = Return (v' t)+>     v' (Stage t) = Stage (sLift (v') t)+>     v' x = x++FIXME: This needs to rename all duplicated binder names first, otherwise+we get a duff term when we go back to the indexed version.++> makePs :: TT Name -> TT Name+> makePs t = let t' = evalState (uniqifyAllState t) [] in+>                 vapp (\ (ctx,i) -> P (traceIndex ctx i "makePsEnv")) t'+>                            --if (i<length ctx) then P (ctx!!i)+>                              --           else V i) t'++> makePsEnv env t = let t' = evalState (uniqifyAllState t) env in+>                       vapp (\ (ctx,i) -> P (traceIndex ctx i "makePsEnv")) t'+++> uniqifyAllState :: TT Name -> State [Name] (TT Name)+> uniqifyAllState (Bind n b (Sc sc)) =+>     do names <- get+>        let n' = uniqify n names+>        put $ nub (n':names)+>        b' <- uniqifyAllStateB b+>        sc' <- uniqifyAllState sc+>        return (Bind n' b' (Sc sc'))+> uniqifyAllState (App f a) =+>     do f' <- uniqifyAllState f+>        a' <- uniqifyAllState a+>        return (App f' a')+> uniqifyAllState (Proj n i t) =+>     do t' <- uniqifyAllState t+>        return (Proj n i t')+> uniqifyAllState (Label t c) =+>     do t' <- uniqifyAllState t+>        c' <- uniqifyAllStateC c+>        return (Label t' c')+> uniqifyAllState (Call c t) =+>     do t' <- uniqifyAllState t+>        c' <- uniqifyAllStateC c+>        return (Call c' t')+> uniqifyAllState (Return t) =+>     do t' <- uniqifyAllState t+>        return (Return t')+> uniqifyAllState (Stage t) =+>     do t' <- sLiftM uniqifyAllState t+>        return (Stage t')+> uniqifyAllState x = return $ x++> uniqifyAllStateB (B Lambda ty) =+>     do ty' <- uniqifyAllState ty+>        return (B Lambda ty')+> uniqifyAllStateB (B Pi ty) =+>     do ty' <- uniqifyAllState ty+>        return (B Pi ty')+> uniqifyAllStateB (B Hole ty) =+>     do ty' <- uniqifyAllState ty+>        return (B Hole ty')+> uniqifyAllStateB (B (Let v) ty) =+>     do ty' <- uniqifyAllState ty+>        v' <- uniqifyAllState v+>        return (B (Let v') ty')+> uniqifyAllStateB (B (Guess v) ty) =+>     do ty' <- uniqifyAllState ty+>        v' <- uniqifyAllState v+>        return (B (Guess v') ty')+> uniqifyAllStateB (B (Pattern v) ty) =+>     do ty' <- uniqifyAllState ty+>        v' <- uniqifyAllState v+>        return (B (Pattern v') ty')+> uniqifyAllStateB (B MatchAny ty) =+>     do ty' <- uniqifyAllState ty+>        return (B MatchAny ty')+> uniqifyAllStateC (Comp n cs) =+>     do cs' <- mapM uniqifyAllState cs+>        return (Comp n cs')+++Take a term with explicit names and convert it to a term with+de Bruijn indices++> finalise :: Eq n => Indexed n -> Indexed n+> finalise (Ind tm) = Ind (pv [] tm)+>   where+>    pv env (P n) | Just i <- lookupidx 0 n env = V i+>                 | otherwise = P n+>    pv env (App f a) = App (pv env f) (pv env a)+>    pv env (Proj n i t) = Proj n i (pv env t)+>    pv env (Bind n b@(B _ ty) (Sc t))+>        = Bind n (fmap (pv env) b) (Sc (pv ((n,(pv env ty)):env) t))+>    pv env (Label t (Comp n cs))+>       = Label (pv env t) (Comp n (fmap (pv env) cs))+>    pv env (Call (Comp n cs) t)+>       = Call (Comp n (fmap (pv env) cs)) (pv env t)+>    pv env (Return t) = Return (pv env t)+>    pv env (Stage t) = Stage (sLift (pv env) t)+>    pv env x = x+>+>    lookupidx i n ((x,_):xs) | n==x = Just i+>                             | otherwise = lookupidx (i+1) n xs+>    lookupidx i n [] = Nothing++Check the purity of a term; a term is pure iff it has no holes.++> pure :: TT Name -> Bool+> pure (Bind _ (B b ty) (Sc sc)) = purebind b && pure ty && pure sc+> pure (App f a) = pure f && pure a+> pure (Proj _ _ t) = pure t+> pure (Label t (Comp n cs)) = pure t && and (map pure cs)+> pure (Call (Comp n cs) t) = pure t && and (map pure cs)+> pure (Return t) = pure t+> pure (Stage t) = sLiftf pure t+> pure _ = True+>+> purebind Hole = False -- Seems a bit OTT to use a type class just for this...+> purebind (Guess _) = False+> purebind (Let t) = pure t+> purebind _ = True++Map a function across all binders in a term++> binderMap :: (Name -> Bind (TT Name) -> TT Name -> a) -> TT Name -> [a]+> binderMap f (Bind n (B b@(Let v) ty) (Sc sc))+>     = (f n b ty):(binderMap f v) ++ (binderMap f ty) ++ (binderMap f sc)+> binderMap f (Bind n (B b@(Guess v) ty) (Sc sc))+>     = (f n b ty):(binderMap f v) ++ (binderMap f ty) ++ (binderMap f sc)+> binderMap f (Bind n (B b@(Pattern v) ty) (Sc sc))+>     = (f n b ty):(binderMap f v) ++ (binderMap f ty) ++ (binderMap f sc)+> binderMap f (Bind n (B b ty) (Sc sc))+>     = (f n b ty):(binderMap f ty) ++ (binderMap f sc)+> binderMap bf (App f a) = binderMap bf f ++ binderMap bf a+> binderMap f (Proj _ _ t) = binderMap f t+> binderMap f (Label t (Comp n cs)) = binderMap f t +++>                                     concat (fmap (binderMap f) cs)+> binderMap f (Call (Comp n cs) t) = concat (fmap (binderMap f) cs) +++>                                    binderMap f t+> binderMap f (Return t) = binderMap f t+> binderMap f (Stage t) = sLiftf (binderMap f) t+> binderMap f _ = []++Substitute a term into V 0 in the scope (and weaken other indices)+I think this works! But de Bruijn index mangling breaks my brain, so+maybe find a better way, or think carefully about why this is okay...++> subst :: TT n -> Scope (TT n) -> TT n+> subst tm (Sc x) = vapp weakenv $ vapp subv x+>   where subv (xs,i) | i == length xs = (vinc tm)+>                     | otherwise = V i+>         weakenv (xs,i) | i > length xs = V (i-1)+>                        | otherwise = V i+>         vinc (V n) = V (n+1) -- So that we weakenv it correctly+>         vinc x = x++Return all the names used in a scope++> getNames :: Eq n => Scope (TT n) -> [n]+> getNames (Sc x) = nub $ p' x where+>     p' (P x) = [x]+>     p' (App f' a) = (p' f')++(p' a)+>     p' (Bind n b (Sc sc))+>      | scnames <- p' sc = (scnames \\ [n]) ++ pb' b+>     p' (Proj _ i x) = p' x+>     p' (Label t (Comp n cs)) = p' t ++ concat (map p' cs)+>     p' (Call (Comp n cs) t) = concat (map p' cs) ++ p' t+>     p' (Return t) = p' t+>     p' (Stage t) = sLiftf p' t+>     p' x = []+>     pb' (B (Let v) ty) = p' v ++ p' ty+>     pb' (B (Guess v) ty) = p' v ++ p' ty+>     pb' (B (Pattern v) ty) = p' v ++ p' ty+>     pb' (B _ ty) = p' ty++Return all the bound names used in a scope++> getBoundNames :: Eq n => Scope (TT n) -> [n]+> getBoundNames (Sc x) = nub $ p' x where+>     p' (P x) = []+>     p' (App f' a) = (p' f')++(p' a)+>     p' (Bind n b (Sc sc)) = n:(p' sc) ++ pb' b+>     p' (Proj _ i x) = p' x+>     p' (Label t (Comp n cs)) = p' t ++ concat (map p' cs)+>     p' (Call (Comp n cs) t) = concat (map p' cs) ++ p' t+>     p' (Return t) = p' t+>     p' (Stage t) = sLiftf p' t+>     p' x = []+>     pb' (B (Let v) ty) = p' v ++ p' ty+>     pb' (B (Guess v) ty) = p' v ++ p' ty+>     pb' (B (Pattern v) ty) = p' v ++ p' ty+>     pb' (B _ ty) = p' ty++The following gadgets expect a fully explicitly named term, rather than+with de Bruijn indices or levels. We need a newtype Named n.++> substName :: (Show n, Eq n) => n -> TT n -> Scope (TT n) -> TT n+> substName p tm (Sc x) = p' x where+>     p' (P x) | x == p = tm+>     p' (App f' a) = (App (p' f') (p' a))+>     p' (Bind n b (Sc sc)) = (Bind n (fmap p' b) (Sc (p' sc)))+>      --   | n == p = (Bind n (fmap p' b) (Sc sc))+>      --   | otherwise+>     p' (Proj n i x) = Proj n i (p' x)+>     p' (Label t (Comp n cs)) = Label (p' t) (Comp n (map p' cs))+>     p' (Call (Comp n cs) t) = Call (Comp n (map p' cs)) (p' t)+>     p' (Return t) = Return (p' t)+>     p' (Stage t) = Stage (sLift p' t)+>     p' x = x++Look for a specific term and replace it.+Probably hopelessly inefficient.++> substTerm :: (Show n, Eq n) => TT n -> TT n -> Scope (TT n) -> TT n+> substTerm p tm (Sc x) = p' x where+>     p' x | x == p = tm+>     p' (App f' a) = (App (p' f') (p' a))+>     p' (Bind n b (Sc sc)) = (Bind n (fmap p' b) (Sc (p' sc)))+>      --   | n == p = (Bind n (fmap p' b) (Sc sc))+>      --   | otherwise+>     p' (Proj n i x) = Proj n i (p' x)+>     p' (Label t (Comp n cs)) = Label (p' t) (Comp n (map p' cs))+>     p' (Call (Comp n cs) t) = Call (Comp n (map p' cs)) (p' t)+>     p' (Return t) = Return (p' t)+>     p' (Stage t) = Stage (sLift p' t)+>     p' x = x++> getSc (Sc x) = x++Apply a function (non-recursively) to every sub term.++> mapSubTerm :: (TT Name -> TT Name) -> TT Name -> TT Name+> mapSubTerm f = mst where+>    mst (App ff s) = App (f ff) (f s)+>    mst (Bind x b (Sc sc)) = Bind x (fmap f b) (Sc (f sc))+>    mst (Proj n i ty) = Proj n i (f ty)+>    mst (Stage t) = Stage (sLift f t)+>    mst x = x++Get the arguments of an application++> getArgs :: TT Name -> [TT Name]+> getArgs (App f a) = getArgs f ++ [a]+> getArgs _ = []++Get the function being applied in an application++> getFun :: TT Name -> TT Name+> getFun (App f a) = getFun f+> getFun x = x++Get the expected arguments of a function type++> getExpected :: TT Name -> [(Name,TT Name)]+> getExpected (Bind n (B Pi ty) (Sc sc)) = (n,ty):(getExpected sc)+> getExpected _ = []++Get the return type of a function type++> getReturnType :: TT Name -> TT Name+> getReturnType (Bind n (B Pi ty) (Sc sc)) = getReturnType sc+> getReturnType x = x++Make a name unique in the given environment++> uniqify :: Name -> [Name] -> Name+> uniqify x env | x `elem` env = uniqify (mangleName x) env+>               | otherwise = x++x -> x0, x1 -> x2, etc. Increments an index at the end of a name, in order+to generate a new and hopefully unique name.++> mangleName :: Name -> Name+> mangleName (MN (n,i)) = MN (n,i+1)+> mangleName (UN n) = UN (incName n)+>    where incName x | (num, name) <- span isDigit (reverse x)+>                        = (reverse name)++show (inc num)+>+>          inc :: String -> Int+>          inc "" = 0+>          inc xs = (read (reverse xs)) + 1++Bind a list of things++> bind :: Bind (TT Name) -> [(Name,TT Name)] -> Scope (TT Name) -> TT Name+> bind binder [] sc = getSc sc+> bind binder ((n,ty):xs) sc = Bind n (B binder ty) (Sc (bind binder xs sc))++Apply a function to a list of arguments++> appArgs :: TT n -> [TT n] -> TT n+> appArgs f [] = f+> appArgs f (x:xs) = appArgs (App f x) xs++====================== Show instances =============================++> instance Show Name where+>     show = forget++> instance Show n => Show (TT n) where+>     show x = forget (forget x)++> instance Show Raw where+>     show = forget++> instance Show n => (Show (Levelled n)) where+>     show = show.indexise++> instance Show n => (Show (Indexed n)) where+>     show (Ind t) = show t++===================== Eq instances ================================++> instance Eq Raw where+>     (==) (Var x) (Var y) = x==y+>     (==) (RApp f a) (RApp f' a') = f==f' && a==a'+>     (==) (RBind n b sc) (RBind n' b' sc') = n==n' && b==b' && sc==sc'+>     (==) (RConst x) (RConst y) = case cast x of+>                                    Just x' -> x'==y+>                                    Nothing -> False+>     (==) RStar RStar = True+>     (==) (RLabel t (RComp n cs)) (RLabel t' (RComp n' cs')) =+>         t==t' && n==n' && cs == cs'+>     (==) (RCall (RComp n cs) t) (RCall (RComp n' cs') t') =+>         t==t' && n==n' && cs == cs'+>     (==) (RReturn t) (RReturn t') = t == t'+>     (==) (RStage t) (RStage t') = t == t'+>     (==) RInfer RInfer = True+>     (==) (RMeta x) (RMeta x') = x == x'+>     (==) _ _ = False++> instance Eq n => Eq (TT n) where+>     (==) (P x) (P y) = x==y+>     (==) (V i) (V j) = i==j+>     (==) (Con t x i) (Con t' y j) = x==y+>     (==) (TyCon x i) (TyCon y j) = x==y+>     (==) (Elim x) (Elim y) = x==y+>     (==) (App f a) (App f' a') = f==f' && a==a'+>     (==) (Bind _ b sc) (Bind _ b' sc') = b==b' && sc==sc'+>     (==) (Proj _ i x) (Proj _ j y) = i==j && x==y+>     (==) (Const x) (Const y) = case cast x of+>                                   Just x' -> x'==y+>                                   Nothing -> False+>     (==) Star Star = True+>     (==) (Label t (Comp n cs)) (Label t' (Comp n' cs')) =+>         t==t' -- && n==n' && cs == cs'+>     (==) (Call (Comp n cs) t) (Call (Comp n' cs') t') =+>         t==t' -- && n==n' && cs == cs'+>     (==) (Return t) (Return t') = t == t'+>     (==) (Stage t) (Stage t') = t == t'+>     (==) _ _ = False++> instance Eq n => Eq (Stage n) where+>     (==) (Quote t) (Quote t') = t == t'+>     (==) (Code t) (Code t') = t == t'+>     (==) (Eval t _) (Eval t' _) = t == t'+>     (==) (Escape t _) (Escape t' _) = t == t'+>     (==) _ _ = False++===================== Forgetful maps ==============================++> instance Forget Name String where+>     forget (UN n) = n+>     forget (MN ("INFER",i)) = "y"++show i+>     forget (MN ("T",i)) = "z"++show i+>     forget (MN (x,i)) = x ++ "[" ++ show i ++ "]"++> instance Forget Raw String where+>     forget x = fPrec 10 x where+>       fPrec :: Int -> Raw -> String+>       fPrec _ (Var n) = forget n+>       fPrec x (RApp f a) = bracket x 1 $ fPrec 1 f ++ " " ++ fPrec 0 a+>       fPrec x (RBind n (B Lambda t) sc) = bracket x 2 $+>           "["++forget n ++":"++fPrec 10 t++"]" ++ fPrec 10 sc+>       fPrec x (RBind n (B Pi t) sc)+>           | nameOccurs n sc = bracket x 2 $+>              "("++forget n ++":"++fPrec 10 t++") -> " ++ fPrec 10 sc+>           | otherwise = bracket x 2 $+>              (fPrec 1 t) ++" -> " ++ fPrec 10 sc+>       fPrec x (RBind n (B (Let v) t) sc) = bracket x 2 $+>           "let "++forget n ++":"++ fPrec 10 t+>                 ++"=" ++ fPrec 10 v ++ " in " ++ fPrec 10 sc+>       fPrec x (RBind n (B Hole t) sc) = bracket x 2 $+>           "?"++forget n ++":"++fPrec 10 t++"." ++ fPrec 10 sc+>       fPrec x (RBind n (B (Guess v) t) sc) = bracket x 2 $+>           "try "++forget n ++":"++fPrec 10 t+>                 ++"=" ++ fPrec 10 v ++ " in " ++ fPrec 10 sc+>       fPrec x (RBind n (B (Pattern v) t) sc) = bracket x 2 $+>           "patt "++forget n ++":"++fPrec 10 t+>                 ++"=" ++ fPrec 10 v ++ " in " ++ fPrec 10 sc+>       fPrec x (RBind n (B MatchAny t) sc) = bracket x 2 $+>           "patt "++forget n ++":"++fPrec 10 t ++ " in " ++ fPrec 10 sc+>       fPrec _ (RLabel t c) =+>           "< "++fPrec 10 t++" : "++fcomp c++" >"+>       fPrec x (RCall c t) = bracket x 3 $+>           "call < " ++ fcomp c ++ " > "++ fPrec 0 t+>       fPrec _ (RReturn t) = "return " ++ fPrec 0 t+>       fPrec _ (RStage (RQuote t)) = "{'" ++ fPrec 10 t ++ "}"+>       fPrec _ (RStage (RCode t)) = "{{" ++ fPrec 10 t ++ "}}"+>       fPrec _ (RStage (REval t)) = "!" ++ fPrec 0 t+>       fPrec _ (RStage (REscape t)) = "~" ++ fPrec 0 t+>       fPrec _ (RConst x) = show x+>       fPrec _ (RStar) = "*"+>       fPrec _ (RInfer) = "_"+>       fPrec _ (RMeta n) = "?"++forget n+>       fPrec _ (RAnnot t) = t+>       bracket outer inner str | inner>outer = "("++str++")"+>                               | otherwise = str++>       fcomp (RComp n cs) = forget n ++ showargs cs+>           where showargs [] = ""+>                 showargs (x:xs) = " " ++ fPrec 0 x ++ showargs xs++> instance Forget RStage String where+>     forget (RQuote x) = "{'" ++ forget x ++ "}"+>     forget (RCode x) = "{{" ++ forget x ++ "}}"+>     forget (REval x) = "{!" ++ forget x ++ "}"+>     forget (REscape x) = "{~" ++ forget x ++ "}"++> instance Show n => Forget (Indexed n) Raw where+>     forget (Ind t) = forget t++> instance Show n => Forget (Levelled n) Raw where+>     forget (Lev t) = forget t++> instance Show n => Forget (TT n) Raw where+>     forget t = forgetTT (vapp showV t)+>      where+>        showV (ctx,i) | i < length ctx = P (ctx!!i)+>	               | otherwise = V i+>        forgetTT (P x) = Var $ UN (show x)+>        forgetTT (V i) = RAnnot $ "v" ++ (show i)+>        forgetTT (Con t x i) = Var $ UN (show x)+>        forgetTT (TyCon x i) = Var $ UN (show x)+>        forgetTT (Elim x) = Var $ UN (show x)+>        forgetTT (App f a) = RApp (forgetTT f) (forgetTT a)+>        forgetTT (Bind n (B Lambda t) (Sc sc)) =+>                    (RBind (UN (show n)) (B Lambda (forget t)) (forget sc))+>        forgetTT (Bind n (B Pi t) (Sc sc)) =+>                    (RBind (UN (show n)) (B Pi (forget t)) (forget sc))+>        forgetTT (Bind n (B MatchAny t) (Sc sc)) =+>                    (RBind (UN (show n)) (B MatchAny (forget t)) (forget sc))+>        forgetTT (Bind n (B (Let v) t) (Sc sc)) =+>                    (RBind (UN (show n)) (B (Let (forget v)) (forget t))+>                      (forget sc))+>        forgetTT (Bind n (B Hole t) (Sc sc)) =+>                    (RBind (UN (show n)) (B Hole (forget t)) (forget sc))+>        forgetTT (Bind n (B (Guess v) t) (Sc sc)) =+>                    (RBind (UN (show n)) (B (Guess (forget v)) (forget t))+>                      (forget sc))+>        forgetTT (Bind n (B (Pattern v) t) (Sc sc)) =+>                    (RBind (UN (show n)) (B (Pattern (forget v)) (forget t))+>                      (forget sc))+>        forgetTT (Proj n i t) = RAnnot $ (show t)++"!"++(show i)++":"++show n+>        forgetTT (Label t (Comp n cs)) = RLabel (forgetTT t)+>                                          (RComp (UN $ show n)+>                                             (map forgetTT cs))+>        forgetTT (Call (Comp n cs) t) = RCall (RComp (UN $ show n)+>                                               (map forgetTT cs))+>                                                 (forgetTT t)+>        forgetTT (Return t) = RReturn (forgetTT t)+>        forgetTT (Stage t) = RStage (forget t)+>        forgetTT (Const x) = RConst x+>        forgetTT Star = RStar++> instance Show n => Forget (Stage n) RStage where+>     forget (Code x) = RCode (forget x)+>     forget (Quote x) = RQuote (forget x)+>     forget (Eval x _) = REval (forget x)+>     forget (Escape x _) = REscape (forget x)++> testid = (Bind (UN "x") (B Lambda Star) (Sc (V 0)))+> testterm = (App testid Star)++Some handy gadgets for Raw terms++> mkapp f [] = f+> mkapp f (x:xs) = mkapp (RApp f x) xs++> getargnames (RBind n _ sc) = n:(getargnames sc)+> getargnames _ = []++> getappargs (RApp f a) = getappargs f ++ [a]+> getappargs _ = []++> getappfun (RApp f a) = getappfun f+> getappfun x = x++> getrettype (RBind n (B Pi _) sc) = getrettype sc+> getrettype x = x++> nameOccurs x (Var n) | x == n = True+>                      | otherwise = False+> nameOccurs x (RApp f a) = nameOccurs x f || nameOccurs x a+> nameOccurs x (RBind n b sc)+>     | x == n = False+>     | otherwise = occBind x b || nameOccurs x sc+> nameOccurs x (RLabel r comp) = nameOccurs x r || occComp x comp+> nameOccurs x (RCall comp r)  = nameOccurs x r || occComp x comp+> nameOccurs x (RReturn r) = nameOccurs x r+> nameOccurs x (RStage s) = occStage x s+> nameOccurs x _ = False++> occComp x (RComp _ rs) = or $ map (nameOccurs x) rs+> occBind x (B (Let v) t) = nameOccurs x v || nameOccurs x t+> occBind x (B _ t) = nameOccurs x t+> occStage x (RQuote r) = nameOccurs x r+> occStage x (RCode r) = nameOccurs x r+> occStage x (REval r) = nameOccurs x r+> occStage x (REscape r) = nameOccurs x r+++> debugTT t = show (forgetTT (vapp showV t))+>      where+>        showV (ctx,i) | i < length ctx = P (UN ("{v}"++show i))+>	               | otherwise = V i+>        forgetTT (P x) = Var $ UN (show x)+>        forgetTT (V i) = RAnnot $ "v" ++ (show i)+>        forgetTT (Con t x i) = Var $ UN (show x)+>        forgetTT (TyCon x i) = Var $ UN (show x)+>        forgetTT (Elim x) = Var $ UN (show x)+>        forgetTT (App f a) = RApp (forgetTT f) (forgetTT a)+>        forgetTT (Bind n (B Lambda t) (Sc sc)) =+>                    (RBind (UN (show n)) (B Lambda (forget t)) (forget sc))+>        forgetTT (Bind n (B Pi t) (Sc sc)) =+>                    (RBind (UN (show n)) (B Pi (forget t)) (forget sc))+>        forgetTT (Bind n (B (Let v) t) (Sc sc)) =+>                    (RBind (UN (show n)) (B (Let (forget v)) (forget t))+>				(forget sc))+>        forgetTT (Bind n (B Hole t) (Sc sc)) =+>                    (RBind (UN (show n)) (B Hole (forget t)) (forget sc))+>        forgetTT (Bind n (B (Guess v) t) (Sc sc)) =+>                    (RBind (UN (show n)) (B (Guess (forget v)) (forget t))+>				(forget sc))+>        forgetTT (Bind n (B (Pattern v) t) (Sc sc)) =+>                    (RBind (UN (show n)) (B (Pattern (forget v)) (forget t))+>				(forget sc))+>        forgetTT (Proj n i t) = RAnnot $ (show t)++"!"++(show i)++":"++show n+>        forgetTT (Label t (Comp n cs)) = RLabel (forgetTT t)+>                                          (RComp (UN $ show n)+>                                             (map forgetTT cs))+>        forgetTT (Call (Comp n cs) t) = RCall (RComp (UN $ show n)+>                                               (map forgetTT cs))+>                                                 (forgetTT t)+>        forgetTT (Return t) = RReturn (forgetTT t)+>        forgetTT (Stage (Quote t)) = RStage (RQuote (forgetTT t))+>        forgetTT (Stage (Code t)) = RStage (RCode (forgetTT t))+>        forgetTT (Stage (Eval t _)) = RStage (REval (forgetTT t))+>        forgetTT (Stage (Escape t _)) = RStage (REscape (forgetTT t))+>        forgetTT (Const x) = RConst x+>        forgetTT Star = RStar
+ Ivor/Tactics.lhs view
@@ -0,0 +1,666 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.Tactics where++> import Ivor.TTCore+> import Ivor.Typecheck+> import Ivor.Nobby+> import Ivor.Gadgets+> import Ivor.Unify++> import Data.List+> import Data.Maybe+> import Data.Char+> import Debug.Trace++Tactics for manipulating holes (See Conor McBride's thesis for the+inspiration for many of these).++Tactics may do several things in addition to manipulating the term. These+include adding a new goal, solving other holes, and wanting to add a+new axiom to the context.++> data TacticAction = AddGoal Name+>                   | NextGoal Name+>                   | Solved Name (TT Name)+>                   | AddAxiom Name (TT Name)+>                   | HideGoal Name+>    deriving (Show,Eq)++> type Tactic = Monad m => Gamma Name ->+>                          Env Name ->+>                          Indexed Name ->+>                          m (Indexed Name, [TacticAction])++> type HoleFn a = Gamma Name -> Env Name -> Indexed Name -> a++Find a named hole in a term (or the leftmost outermost hole if no name+is given), and do something if/when you get there.  Could be used for,+e.g., applying tactics, displaying a proof context, etc.++> findhole :: Gamma Name -> Maybe Name -> Indexed Name ->+>             HoleFn a -> Maybe a+> findhole gam n (Ind s) holefn = fh [] s+>     where fh env b@(Bind x (B Hole ty) _)+>               | same x n = Just $ holefn gam env (Ind b)+>           fh env b@(Bind x (B (Guess v) ty) _)+>               | same x n = Just $ holefn gam env (Ind b)+>           fh env (Bind x binder@(B b ty) (Sc s)) =+>               first [fhb env b,+>                      fh env ty,+>                      fh ((x,binder):env) s]+>           fh env (App f s) = first [fh env f, fh env s]+>           fh env (Stage (Quote t)) = fh env t+>           fh env (Stage (Code t)) = fh env t+>           fh env (Stage (Eval t _)) = fh env t+>           fh env (Stage (Escape t _)) = fh env t+>           fh _ _ = fail "No such hole binder"+>+>           fhb env (Let x) = fh env x+>           fhb env (Guess x) = fh env x+>           fhb env _ = Nothing+>+>           first = maybeHead.catMaybes+>           maybeHead (x:xs) = Just x+>           maybeHead _ = Nothing+>+>           same x Nothing = True+>           same x (Just n) = x == n++Boolean indicates whether to return all (True) or just the ones with+no guesses attached (False).++> allholes :: Gamma Name -> Bool -> Indexed Name -> [(Name,Indexed Name)]+> allholes gam guesses (Ind s) = fh [] s+>     where fh env b@(Bind x binder@(B Hole ty) (Sc sc))+>               = [(x,Ind ty)] ++ fh env ty ++ fh ((x,binder):env) sc+>           fh env b@(Bind x binder@(B (Guess v) ty) (Sc sc))+>              | guesses = [(x,Ind ty)] ++ fh env v ++ fh env ty ++ fh ((x,binder):env) sc+>           fh env (Bind x binder@(B b ty) (Sc s)) =+>               fhb env b ++ fh env ty ++ fh ((x,binder):env) s+>           fh env (App f s) = fh env f ++ fh env s+>           fh env (Stage (Quote t)) = fh env t+>           fh env (Stage (Code t)) = fh env t+>           fh env (Stage (Eval t _)) = fh env t+>           fh env (Stage (Escape t _)) = fh env t+>           fh _ _ = []+>+>           -- fhb env (Let x) = fh env x+>           fhb env (Guess x) = fh env x+>           fhb env _ = []++Typecheck a term in the context of the given hole++> holecheck :: Monad m => Name -> Gamma Name -> Indexed Name ->+>              Raw -> m (Indexed Name, Indexed Name)+> holecheck n gam state raw = case (findhole gam (Just n) state docheck) of+>                                Nothing -> fail "No such hole binder"+>                                (Just x) -> x+>    where docheck gam env _ = check gam env raw Nothing++Run a tactic on the given named hole (or the first hole, if no name is+given). Searches through the given term for a hole with the given+name, and runs the tactic on the term it finds, with the term in its+appropriate context.++[I wanted to write this in terms of findhole, but then I lose the rest of+the term. Oh well.]++FIXME: Why not use a state monad for the unified variables in rt?++> runtactic :: Monad m => Gamma Name -> Name ->+>              Indexed Name -> Tactic -> m (Indexed Name, [TacticAction])+> runtactic gam n t tac = runtacticEnv gam [] n t tac++> runtacticEnv :: Monad m => Gamma Name -> Env Name -> Name ->+>                 Indexed Name -> Tactic -> m (Indexed Name, [TacticAction])+> runtacticEnv gam env n (Ind s) tactic =+>     do (tm, actions) <- (rt env s)+>        return ((Ind (substNames (mapMaybe mkUnify actions) tm)), actions)+>     where rt env b@(Bind x (B Hole ty) _)+>               | x == n = do (Ind b', u) <- tactic gam env (Ind b)+>                             return (b', u)+>           rt env b@(Bind x (B (Guess v) ty) _)+>               | x == n = do (Ind b',u) <- tactic gam env (Ind b)+>                             return (b', u)+>           rt env b@(Bind x (B (Let v) ty) _)+>               | x == n = do (Ind b',u) <- tactic gam env (Ind b)+>                             return (b',u)++                | otherwise = return (b, []) -- fail "No such hole"++>           rt env b@(Bind x (B Lambda ty) _)+>               | x == n = do (Ind b',u) <- tactic gam env (Ind b)+>                             return (b',u)+>           rt env (Bind x binder@(B b ty) (Sc s)) =+>               do (b',u) <- rtb env b+>                  (ty',u') <- rt env ty+>                  (s',u'') <- rt ((x,binder):env) s+>                  return (Bind x (B b' ty') (Sc s'), nub (u++u'++u''))+>           rt env (App f s) =+>               do (f',u) <- rt env f+>                  (s',u') <- rt env s+>                  return (App f' s', nub (u++u'))+>           rt env (Stage (Quote t)) = do (t',u) <- rt env t+>                                         return (Stage (Quote t'), u)+>           rt env (Stage (Code t)) = do (t',u) <- rt env t+>                                        return (Stage (Code t'), u)+>           rt env (Stage (Eval t ty)) = do (t',u) <- rt env t+>                                           (ty',u) <- rt env ty+>                                           return (Stage (Eval t' ty'), u)+>           rt env (Stage (Escape t ty)) = do (t',u) <- rt env t+>                                             (ty',u) <- rt env ty+>                                             return (Stage (Escape t' ty'), u)+>           rt env x = return (x, [])+>+>           -- No holes in let bound values!+>           --rtb env (Let x) = do (rtx, u) <- rt env x+>           --                     return (Let rtx, u)+>           rtb env (Guess x) = do (rtx, u) <- rt env x+>                                  return (Guess rtx, u)+>           rtb env b = return (b, [])+>           mkUnify (Solved x ty) = Just (x, ty)+>           mkUnify _ = Nothing++Tactics by default don't need to return the other holes they solved.++> tacret :: Monad m => Indexed Name -> m (Indexed Name, [TacticAction])+> tacret x = return (x,[])++Sequence two tactics++> thenT :: Tactic -> Tactic -> Tactic+> thenT tac1 tac2 gam env tm = do (tm',u) <- tac1 gam env tm+>                                 (tm'',u') <- tac2 gam env tm'+>                                 return (tm',nub (u++u'))++Try to run a tactic, do nothing silently if it fails.++> attempt :: Tactic -> Tactic+> attempt tac gam env tm =+>     case tac gam env tm of+>        Just (tm',act) -> return (tm',act)+>        Nothing -> tacret tm++Create a new theorem ?x:S. x++> theorem :: Name -> Indexed Name -> Indexed Name+> theorem x (Ind s) = Ind (Bind x (B Hole s) (Sc (P x)))++Create a new definition with holes ?x:S = holey in x++> makeholey :: Name -> Indexed Name -> Indexed Name -> Indexed Name+> makeholey x (Ind holey) (Ind ty) =+>     Ind (Bind x (B (Guess holey) ty) (Sc (P x)))++Add a new claim to the current state++> claim :: Name -> Raw -> Tactic -- ?Name:Type.+> claim x s gam env (Ind t) =+>     do (Ind sv, st) <- check gam (ptovenv env) s Nothing+>        checkConv gam st (Ind Star) "Type of claim must be *"+>        return $ (Ind (Bind x (B Hole (makePsEnv (map fst env) sv)) (Sc t)),+>                      [NextGoal x])++Add a new claim with guess to the current state+[FIXME: Doesn't work yet, should put new goal at the end.]++> claimholey :: Name -> Indexed Name -> Indexed Name -> Tactic+> claimholey x (Ind holey) (Ind ty) gam env (Ind term) =+>     tacret $ Ind (Bind x (B (Guess holey) ty) (Sc term))++> claimsolved :: Name -> Indexed Name -> Indexed Name -> Tactic+> claimsolved x (Ind holey) (Ind ty) gam env (Ind term) =+>     tacret $ Ind (Bind x (B (Let holey) ty) (Sc term))++Begin solving a goal++> attack :: Name -> Tactic+> attack h gam env (Ind (Bind x b@(B Hole ty) sc))+>         = tacret $ Ind (Bind x (B (Guess newtm) ty) sc)+>   where newtm = Bind h0 (B Hole ty) (Sc (P h0))+>         h0 = uniqify h (x:(map fst env))+> attack _ _ _ t = fail $ "Internal error; not an attackable hole: " ++ show t++Try filling the current goal with a term++> fill :: Raw -> Tactic+> fill guess gam env (Ind (Bind x (B Hole tyin') sc)) =+>     do let (Ind tyin) = finalise (Ind tyin')+>        (Ind gvin,Ind gtin, env) <- {-trace ("checking "++show guess++" in context " ++ show (ptovenv env)) $ -}+>                               checkAndBind gam (ptovenv env) guess (Just (Ind tyin))+>        let gv = makePsEnv (map fst env) gvin+>        let gt = makePsEnv (map fst env) gtin+>        let (Ind ty') = normaliseEnv (ptovenv env) (Gam []) (Ind tyin)+>        let (Ind ty) = normaliseEnv (ptovenv env) gam (Ind tyin)+>        let fgt = finalise (Ind gt)+>        let fty' = finalise (Ind ty')+>        let fty = finalise (Ind ty)+>        others <- -- trace ("unifying "++show gt++" and "++show ty') $+>                  case unifyenv (Gam []) (ptovenv env) fgt fty' of+>                     Nothing -> unifyenv gam (ptovenv env) fgt fty+>                     (Just x) -> return x+>        -- let newgt = substNames others gt+>        -- let newgv = substNames others gv+>        let newgv = gv+>        -- trace ((show others) ++ ", "++ show (Ind newgt)) $ checkConv gam (Ind gt) (Ind ty) $ "Guess is badly typed ("++show gt++", "++show ty++")"+>        return $ (Ind (Bind x (B (Guess newgv) ty) sc),+>                      map mkAction (nodups others))+>    where pToVs i [] gv = gv+>          pToVs i ((x,_):xs) gv = {- trace ("pToVing "++show x++", " ++ show i++ " in "++show gv) $ -}+>              let (Sc gv') = pToV2 i x gv in+>                  pToVs (i+1) xs gv'+>          mkAction (x,tm) = Solved x tm+>          nodups [] = []+>          nodups ((x,y):xs) | x `elem` (map fst xs) = nodups xs+>                            | otherwise = (x,y):(nodups xs)+> fill _ _ _ _ = fail "Can't try to fill something which isn't a hole"++Use defaults to fill in arguments which don't appear in the goal (hence aren't+solvable by unification). (FIXME: Not yet implemented.)++> refine :: Raw -> [Raw] -> Tactic+> refine rtm defaults gam env tm@(Ind (Bind x (B Hole ty) (Sc sc))) =+>     do (Ind bv,Ind ntyin) <- check gam (ptovenv env) rtm Nothing+>        let (Ind nty) = normaliseEnv (ptovenv env) gam (Ind ntyin)+>        let bvin = makePsEnv (map fst env) bv+>        -- let (Just (Ind nty)) = lookuptype n gam+>        let claimTypes = getClaims (makePsEnv (map fst env) nty)+>        let rawapp = mkapp rtm (map (\_ -> RInfer) claimTypes)+>        let (Ind tyin') = finalise (normaliseEnv (ptovenv env) gam (Ind ty))+>        (Ind rtch, rtych, ev) <- checkAndBind gam (ptovenv env) rawapp (Just (Ind tyin'))+>        let argguesses = getArgs rtch+>        -- So we'll have an application, some of the arguments with inferred+>        -- names. Let's record which ones...+>        let claims = uniqifyClaims x env claimTypes+>        let claimGuesses = zip claims (map appVar argguesses)+>        (tm',_) <- {- trace (show claimGuesses) $ -} doClaims x claimGuesses gam env tm+>        let guess = (mkGuess claimGuesses [] (forget bvin))+>        (filled, unified) <- runtacticEnv gam env x tm'+>                  (fill guess)+>        -- (filled, solved) <- solveUnified [] unified filled+>        -- filled <- tryDefaults defaults claims filled+>        -- (tm', _) <- trace (show claims) $ tidy gam env filled+>        let newgoals = mapMaybe isGoal claimGuesses+>        return $ (filled, map HideGoal (map fst claims) +++>                          map AddGoal (reverse newgoals))+>        --                  map AddGoal (map fst (reverse claims)))+>        -- tacret filled --(Ind (Bind x (B Hole ty) (Sc sc')))+>   where mkGuess [] defs n = n+>         mkGuess (((x,_),guess):xs) (RInfer:ds) n+>             = (mkGuess xs ds (RApp n (Var x)))+>         mkGuess (((x,_),guess):xs) [] n+>             = (mkGuess xs [] (RApp n (Var x)))+>         -- FIXME: Fix this so default arguments use the 'guess'+>         mkGuess (((x,_),_):xs) (d:ds) n+>             = (mkGuess xs ds (RApp n d))++>         -- if we inferred a guess, use that, otherwise use the claim name+>         appVar (P (MN ("INFER",_))) = Nothing+>         appVar guess = Just guess+>         isGoal ((n,ty),Nothing) = Just n+>         isGoal ((n,ty),Just _) = Nothing++>         todo uns (x,_) = not (isSolved x uns)+>         solveUnified tohide [] tm = return (tm, tohide)+>         solveUnified tohide ((Solved x guess):xs) tm+>             = do (filled,_) <- runtacticEnv gam env x tm (fill (forget guess))+>                  solveUnified (x:tohide) xs filled+>         solveUnified tohide (_:xs) tm = solveUnified tohide xs tm+>         isSolved x [] = False+>         isSolved x ((Solved n _):xs) | x==n = True+>         isSolved x (_:xs) = isSolved x xs+>         tryDefaults [] _ f = return f+>         tryDefaults (RInfer:xs) (c:cs) tm+>             = do tryDefaults xs cs tm+>         tryDefaults (x:xs) ((c,ty):cs) tm+>             = do (filled, _) <- runtacticEnv gam env c tm (fill x)+>                  (filled, _) <- runtacticEnv gam env c filled solve+>                  (filled, _) <- runtacticEnv gam env c filled cut+>                  tryDefaults xs cs filled+>         removeClaims claims tm@(Ind (Bind x b@(B _ ty) (Sc sc)))+>             | x `elem` (map fst claims)+>                  = {- trace (show (x,sc, forget sc)) $ -}+>                    let (cl',Ind sc') = removeClaims claims (Ind sc) in+>                      if (nameOccurs x (forget sc'))+>                        then (cl', Ind (Bind x b (Sc sc')))+>                        else ((x,ty):cl', Ind sc')+>             | otherwise = ([], tm)++> refine _ _ _ _ _ = fail "Not focused on a hole"++        trace (show claims) $ fail "Unimplemented"++> getClaims :: TT Name -> [(Name, TT Name)]+> getClaims (Bind n (B Pi ty) (Sc sc)) = (n,ty):(getClaims sc)+> getClaims _ = []++> uniqifyClaims :: Name -> Env Name -> [(Name, TT Name)] -> [(Name, TT Name)]+> uniqifyClaims nspace env [] = []+> uniqifyClaims nspace env ((x,ty):xs) =+>     let newx = uniqify (mkns nspace x) (map fst env)+>         xs' = substClaim x (P newx) xs in+>         (newx, ty):(uniqifyClaims nspace ((newx, B Hole ty):env) xs')+>   where substClaim x newx [] = []+>         substClaim x newx ((n,ty):xs)+>                        = (n,substName x newx (Sc ty)):+>                           (substClaim x newx xs)+>         mkns (UN a) (UN b) = UN (a++"_"++b)+>         mkns (MN (a,i)) (UN b) = MN (a++"_"++b, i)+>         mkns (MN (a,i)) (MN (b,j)) = MN (a++"_"++b, i)++> doClaims :: Name -> [((Name, TT Name), Maybe (TT Name))] -> Tactic+> doClaims h [] gam env tm = tacret $ tm+> doClaims h (((n,ty),Nothing):xs) gam env tm =+>     do (tm',_) <- runtacticEnv gam env h tm (claim n (forget ty))+>        doClaims h xs gam env tm'+> doClaims h (((n,ty),Just v):xs) gam env tm =+>     do (tm',_) <- runtacticEnv gam env h tm (claimsolved n (Ind v) (Ind ty))+>        doClaims h xs gam env tm'++Give up the current try++> regret :: Tactic+> regret _ _ (Ind (Bind x (B (Guess gv) ty) sc)) =+>     tacret $ Ind (Bind x (B Hole ty) sc)+> regret _ _ _ = fail "Can't regret something you haven't done"++Attempt to solve the current goal with the guess++> solve :: Tactic+> solve _ _ (Ind (Bind x (B (Guess gv) ty) sc))+>       | (pure gv) = tacret (Ind (Bind x (B (Let (finind gv)) ty) sc))+>       | otherwise = fail "I see a hole in your solution"+>    where finind t = case (finalise (Ind t)) of+>                        (Ind x) -> x+> solve _ _ _ = fail "Not a guess"++Substitute a let bound variable into a term++> cut :: Tactic+> cut _ env (Ind (Bind x (B (Let v) ty) sc)) =+>     tacret $ {- trace ("Cutting "++show v++" into "++show sc) $ -}+>            Ind (substName x (makePsEnv (map fst env) v) sc)+>   where+> cut _ _ _ = fail "Not a let bound term"++Normalise the goal++> evalGoal :: Tactic+> evalGoal gam env (Ind (Bind x (B Hole ty) sc)) =+>    do let (Ind nty) = normaliseEnv (ptovenv env) gam (finalise (Ind ty))+>       tacret $ Ind (Bind x (B Hole nty) sc)+> evalGoal _ _ (Ind (Bind x _ _)) = fail $ "evalGoal: " ++ show x ++ " Not a hole"+> evalGoal _ _ _ = fail "evalGoal: Can't happen"++Do beta reductions (i.e., normalise the goal without expanding global names)++> betaReduce :: Tactic+> betaReduce gam env (Ind (Bind x (B Hole ty) sc)) =+>    do let (Ind nty) = normaliseEnv (ptovenv env) (Gam []) (finalise (Ind ty))+>       tacret $ Ind (Bind x (B Hole nty) sc)+> betaReduce _ _ (Ind (Bind x _ _)) = fail $ "betaReduce: " ++ show x ++ " Not a hole"+> betaReduce _ _ _ = fail "betaReduce: Not a binder, can't happen"++Normalise the goal, only expanding the given global name.++> reduceWith :: Name ->Tactic+> reduceWith fn gam env (Ind (Bind x (B Hole ty) sc)) =+>    do case glookup fn gam of+>           Nothing -> fail $ "Unknown name " ++ show fn+>           Just (v,t) -> do+>              let (Ind nty) = normaliseEnv (ptovenv env)+>                                           (Gam [(fn,G v t defplicit)])+>                                           (finalise (Ind ty))+>              tacret $ Ind (Bind x (B Hole nty) sc)+> reduceWith _ _ _ (Ind (Bind x _ _)) = fail $ "reduceWith: " ++ show x ++ " Not a hole"+> reduceWith _ _ _ _ = fail "reduceWith: Not a binder, can't happen"++Do case analysis by the given elimination operator++> by :: Raw -> Tactic+> by rule gam env tm@(Ind (Bind x (B Hole ty) sc)) =+>     do (Ind bv,Ind bt) <- check gam (ptovenv env) rule Nothing+>        let bvin = makePsEnv (map fst env) bv+>        let btin = makePsEnv (map fst env) bt+>        -- Take eliminator apart, find the motive and method names/types+>        (motive,methods) <- getBits btin+>        let motiveargs = getExpected (snd motive)+>        let eargs = getArgs bvin+>        let elimargs = drop (length eargs - length motiveargs) eargs+>        let tyuniq = uniqifyBinders (map fst motiveargs) ty+>        -- Construct the type of the motive Phi+>        let (Ind mtype) = finalise $ Ind $ bind Lambda motiveargs $+>                  Sc $ motiveType (zip (map fst motiveargs) elimargs) tyuniq+>        let mbinding = (B (Let mtype) (snd motive))+>        let claims = uniqifyClaims x env methods+>        (Ind mbody, [])+>            <- doClaims x (zip claims (repeat Nothing)) gam (((fst motive),mbinding):env) tm+>        let mbind = Bind (fst motive) mbinding (Sc mbody)+>        let ruleapp = (forget (mkGuess claims (App bvin (P (fst motive)))))+>        (filled, _) <- runtacticEnv gam env x (Ind mbind)+>                         (fill ruleapp)+>        (tm', _) <- tidy gam env filled+>        --(tm'', _) <- runtacticEnv gam env (fst motive) tm' cut+>        return (tm', map HideGoal ((fst motive):(map fst claims)) +++>                     map AddGoal (map fst (reverse claims)))+>   where+>     getBits (Bind mname (B Pi ty) (Sc sc))+>        | getReturnType ty == Star = do+>            meths <- getMeths sc+>            let names = map fst env+>            return ((mname,(uniqifyBinders names ty)), meths)+>     getBits _ = fail "What's my motivation?"+>     getMeths (Bind meth (B Pi ty) (Sc sc)) = do+>         rest <- getMeths sc+>         return ((meth,ty):rest)+>     getMeths _ = return []+>     motiveType [] ty = ty+>     motiveType ((marg,earg):xs) ty+>         = let sc = (motiveType xs ty) in+>             --trace (show marg ++ " for " ++ show earg ++ " in " ++ show sc) $+>             substTerm earg (P marg) (Sc (motiveType xs ty))+>     mkGuess [] n = n+>     mkGuess ((x,_):xs) n = (mkGuess xs (App n (P x)))+> by _ _ _ _ = fail "Not focussed on a hole"++Do case analysis on the given term. Work out which elimination rule is+needed and the necessary indices, then run the 'by' tactic.++Either run the induction rule (if rec is true) or the case analysis rule+otherwise.++> casetac :: Bool -> Raw -> Tactic+> casetac rec scrutinee gam env tm@(Ind (Bind x (B Hole ty) sc)) =+>     do (Ind bv,bt) <- check gam (ptovenv env) scrutinee Nothing+>        let (Ind btnorm) = (normaliseEnv (ptovenv env) gam bt)+>        let bvin = makePsEnv (map fst env) bv+>        let btin = makePsEnv (map fst env) btnorm+>        let indices = getArgs btin+>        let ty = getFun btin+>        runCaseTac rec ty (indices++[bvin]) gam env tm+> casetac _ _ _ _ _ = fail "Not focussed on a hole"++> runCaseTac :: Bool -> TT Name -> [TT Name] -> Tactic+> runCaseTac rec (TyCon n _) args gam env tm =+>     case (lookupval n gam) of+>         (Just (TCon _ (Elims erule crule cons))) -> do+>             by (mkapp (Var (if rec then erule else crule))+>                                (map forget args)) gam env tm+>         (Just (TCon _ NoConstructorsYet)) ->+>              fail $ (show n) ++ " is declared but not defined"+>         _ -> fail $ (show n) ++ " is not a type constructor"++> runCaseTac _ x indices gam env tm =+>     fail $ (show x) ++ " is not a type constructor"++elimargs <- Get arguments to elimination operator+motiveargs <- Get expected arguments to motive+Remove args from elimargs so there are the right number to motiveargs+  (i.e. remove the ones which come from parameters)+motivetype <- goal subst[motiveargs for elimargs]+let motivename = lam motiveargs . motivetype+in [claim meths]+++> uniqifyBinders env (Bind n (B Pi p) sc)+>      | n `elem` env+>          = let newname = uniqify n env in+>                Bind newname (B Pi p)+>                         (Sc (substName n (P newname) sc))+>      | otherwise = Bind n (B Pi p) (fmap (uniqifyBinders env) sc)+> uniqifyBinders env x = x++Rename a binder++> rename :: Name -> Tactic+> rename n gam env (Ind (Bind x (B Hole rnin) sc))+>     = do renamed <- doRename n rnin+>          tacret $ Ind (Bind x (B Hole renamed) sc)+>   where doRename n (Bind x b sc)+>             = return (Bind n b (Sc (substName x (P n) sc)))+>         doRename _ _ = fail "Nothing to rename"+> rename _ _ _ (Ind (Bind x _ _)) = fail $ "rename: " ++ show x ++ " Not a hole"+> rename _ _ _ _ = fail "rename: Not a binder, can't happen"++Introduce a lambda or let++> intro :: Tactic+> intro gam env intm@(Ind (Bind x (B Hole tyin) (Sc p)))+>     | p == (P x) =+>         do let (Ind ty) = normaliseEnv (ptovenv env) (Gam []) (finalise (Ind tyin))+>            let ty' = makePsEnv (map fst env) ty+>            introsty (uniqify x (map fst env)) ty' (Sc p)+>     | otherwise =+>            fail $ "Not an introduceable hole. Attack it first."+> intro _ _ _ = fail $ "Can't introduce here."++> introsty x (Bind y (B Pi s) (Sc t)) xscope =+>     tacret $ Ind (Bind y (B Lambda s) (Sc (Bind x (B Hole t) xscope)))+> introsty x (Bind y (B (Let v) s) (Sc t)) xscope =+>     tacret $ Ind (Bind y (B (Let v) s) (Sc (Bind x (B Hole t) xscope)))+> introsty x b xscope = fail $ "Nothing to introduce from " ++ show b++Tidy up a term to remove all holes which are not used.++> tidy :: Tactic+> tidy _ _ (Ind t) = tacret $ Ind $ tidy' t where+>    tidy' (Bind n (B Hole ty) (Sc sc))+>        | not $ n `elem` (getNames (Sc sc)) = tidy' sc+>    tidy' (Bind n (B (Guess _) ty) (Sc sc))+>        | not $ n `elem` (getNames (Sc sc)) = tidy' sc+>    tidy' (Bind n b (Sc sc)) =+>          Bind n (fmap tidy' b) (Sc (tidy' sc))+>    tidy' (App f a) = App (tidy' f) (tidy' a)+>    tidy' (Proj n i t) = Proj n i (tidy' t)+>    tidy' x = x++Replace a goal with an equivalent (convertible) goal.++> equiv :: Raw -> Tactic+> equiv goal gam env tm@(Ind (Bind x (B Hole ty) sc)) =+>     do (Ind goalv,Ind goalt) <- check gam (ptovenv env) goal Nothing+>        let goalvin = makePsEnv (map fst env) goalv+>        checkConvEnv env gam (Ind goalv) (finalise (Ind ty))+>                         "Not equivalent to the Goal"+>        tacret $ Ind (Bind x (B Hole goalvin) sc)+> equiv _ _ _ (Ind (Bind x _ _)) = fail $ "equiv: " ++ show x ++ " Not a hole"+> equiv _ _ _ _ = fail "equiv: Not a binder, can't happen"++> generalise :: Raw -> Tactic+> generalise expr gam env (Ind (Bind x (B Hole tyin) sc)) =+>     do (nv, nt) <- check gam (ptovenv env) expr Nothing+>        let (Ind ntyin) = normaliseEnv (ptovenv env) (Gam []) (finalise (Ind tyin))+>        let (Ind exprv) = normaliseEnv (ptovenv env) gam nv+>        let (Ind exprt) = normaliseEnv (ptovenv env) gam nt+>        let ty = makePsEnv (map fst env) ntyin+>        let exprvin = makePsEnv (map fst env) exprv+>        let exprtin = makePsEnv (map fst env) exprt+>        let newname = uniqify (UN "x") $+>                        (map fst env) ++ (getBoundNames (Sc ty))+>        let newtysc = unifySubstTerm gam exprvin (P newname) (Sc ty)+>        let newty = Bind newname (B Pi exprtin) (Sc newtysc)+>        let newsc = substName x (App (P x) exprvin) sc+>        tacret $ Ind (Bind x (B Hole newty) (Sc newsc))+> generalise _ _ _ (Ind (Bind x b sc)) = fail $ "generalise: " ++ show x ++ " Not a hole"+> generalise _ _ _ _ = fail "generalise: Can't happen"++Replace a term in the goal according to the given equality rule, and the+given equality type and replacement/symmetry lemmas.++Algorithm:+rule has type "eq X a b" (b is what we've got, a is what we want)+Create P = [n:X](ty[n/b])+claim p : ty[a/b]+try (repl _ _ _ rule P p)++Boolean flag (flip) is True if symmetry should be applied first.++> replace :: Raw -> Raw -> Raw -> Raw -> Bool -> Tactic+> replace eq repl sym rule flip gam env tm@(Ind (Bind x (B Hole ty) sc))+>         = do let userule = if flip+>                     then (mkapp sym [RInfer, RInfer, RInfer, rule])+>                     else rule+>              (Ind rulev, Ind rulet) <- check gam (ptovenv env) userule Nothing+>              (Ind eqv, Ind eqt) <- check gam (ptovenv env) eq Nothing+>              (Ind replv, Ind replt) <- check gam (ptovenv env) repl Nothing+>              (qty,a,b) <- getTypes rulet+>              let tP = (Bind nm (B Lambda qty) (Sc (substTerm b (P nm) (Sc ty))))+>              let p = substTerm b a (Sc ty)+>              (tm',_) <- doClaims x ([((claimname,p),Nothing)]) gam env tm+>              let repltm = mkapp repl (RInfer:RInfer:RInfer:userule:(forget tP):(Var claimname):[])+>              (filled, _) <- runtacticEnv gam env x tm' (fill repltm)+>              return (filled, [AddGoal claimname])+>    where psn = makePsEnv (map fst env)+>          nm = uniqify (UN "q") (map fst env)+>          claimname = mkns x (UN "q")+>          getTypes (App (App (App (App eq x) _) a) b) = return (x,a,b)+>          getTypes (App (App (App eq x) a) b) = return (x,a,b)+>          getTypes _ = fail "Rule is not of equality type"+>          mkns (UN a) (UN b) = UN (a++"_"++b)+> replace _ _ _ _ _ _ _ (Ind (Bind x b sc)) = fail $ "replace: " ++ show x ++ " Not a hole"+> replace _ _ _ _ _ _ _ _ = fail "replace: Not a binder, can't happen"++Create an axiom for the current goal (quantifying over all bound variables+in the goal, and [FIXME!] all variables they depend on) and use it to+solve the goal.++> axiomatise :: Name -> [Name] -> Tactic+> axiomatise n helpers gam env tm@(Ind (Bind x (B Hole tyin) sc)) =+>     do let (Ind ty') = normaliseEnv (ptovenv env) (Gam []) (finalise (Ind tyin))+>        let ty = makePsEnv (map fst env) ty'+>        let fvs = reverse $ getUsedBoundVars env ((getNames (Sc ty))++helpers)+>        let axiom = bind Pi fvs (Sc ty)+>        return (Ind (Bind x+>                     (B (Guess (appArgs (P n) (map (P . fst) fvs))) ty) sc),+>                    [AddAxiom n axiom])+>  where getUsedBoundVars [] ns = []+>        getUsedBoundVars ((n,b@(B _ ty)):bs) ns+>            | n `elem` ns = (n,ty):(getUsedBoundVars bs ns)+>            | otherwise = getUsedBoundVars bs ns+> axiomatise _ _ _ _ (Ind (Bind x b sc)) = fail $ "axiomatise: " ++ show x ++ " Not a hole"+> axiomatise _ _ _ _ _ = fail "axiomatise: Not a binder, can't happen"++Prepare to return a quoted value++> quote :: Tactic+> quote gam env tm@(Ind (Bind h (B Hole tyin) sc)) =+>     do let (Ind ty') = normaliseEnv (ptovenv env) (Gam []) (finalise (Ind tyin))+>        ty <- checkQuoted ty'+>        let qv = uniqify (mkns h (UN "qv")) $+>                        (map fst env) ++ (getBoundNames (Sc ty))+>        -- Fill hole with {'?qv:ty . qv}+>        let tm = (Bind qv (B Hole ty) (Sc (P qv)))+>        -- (tm',_) <- trace (show ty) $ runtacticEnv gam env h tm (claim qv (forget ty))+>        let filltm = Stage (Quote tm)+>        return (Ind (Bind h (B (Guess filltm) tyin) sc), [AddGoal qv])+>   where checkQuoted (Stage (Code t)) = return t+>         checkQuoted _ = fail "Not a code type"+>         mkns (UN a) (UN b) = UN (a++"_"++b)+> quote _ _ (Ind (Bind x b sc)) = fail $ "quote: " ++ show x ++ " Not a hole"+> quote _ _ _ = fail "quote: Not a binder, can't happen"++> ptovenv [] = []+> ptovenv ((x,b):xs) = (x,fmap finind b):(ptovenv xs)+>    where finind t = case finalise (Ind t) of+>                      (Ind t') -> t'
+ Ivor/TermParser.lhs view
@@ -0,0 +1,227 @@+> -- | +> -- Module      : Ivor.TermParser+> -- Copyright   : Edwin Brady+> -- Licence     : BSD-style (see LICENSE in the distribution)+> --+> -- Maintainer  : eb@dcs.st-and.ac.uk+> -- Stability   : experimental+> -- Portability : non-portable+> -- +> -- Extensible Parsec based parsing library for 'ViewTerm's.+> --+> -- Briefly, the syntax is as follows:+> --+> --  * @[x:A]y@ -- Lambda binding with scope @y@.+> --+> --  * @(x:A) -> B@ -- Forall binding with scope @B@ (@->@ optional).+> --+> --  * @A -> B@ -- Forall binding where name bound is not used in @B@..+> --+> --  * @let x:A=v in y@ -- Let binding, @x=v@ in scope @y@.+> -- +> --  * @f a@ -- Function application (left associative, by juxtaposition).+> --   +> --  * @[identifier]@ -- names are legal Haskell identifiers.+> --  +> --  * @\*@ -- Asterisk is type of types.+> --+> --  * @_@ -- Underscore is a placeholder.+> --+> --  * @?identifier@ -- metavariable, add a name to be defined later+> --+> -- Lambda\/forall bindings of multiple variables are also accepted,+> -- in the form @[x,y:A;z:B]@+> --+> -- Staging annotations have the following syntax:+> --+> --  * @{'x}@ -- quoted term @x@+> --+> --  * @{{A}}@ -- code type @A@ (if @x:A@, @{'x}:{{A}}@+> --+> --  * @!x@ -- evaluate a quoted term+> --+> --  * @~x@ -- escape a quoted term (i.e. splice into a quoted term)+> -- +> -- Extensions for labelled types (see McBride\/McKinna \"The View+> -- From The Left\" for details):+> --+> --  * @\<[identifier] args : t\>@ -- Labelled type.+> --+> --  * @call \<label\> term@ -- Call a computation.+> --   +> --  * @return t@ -- Return a value from a computation.+> --++> module Ivor.TermParser(pTerm, pNoApp, pInductive,+>                          parseTermString, parseDataString) where++> import Ivor.ViewTerm+> import Ivor.TTCore(Name(..))++> import Text.ParserCombinators.Parsec+> import Text.ParserCombinators.Parsec.Expr+> import Text.ParserCombinators.Parsec.Language+> import qualified Text.ParserCombinators.Parsec.Token as PTok++> import Debug.Trace++> type TokenParser a = PTok.TokenParser a++> lexer :: TokenParser ()+> lexer  = PTok.makeTokenParser haskellDef++> whiteSpace= PTok.whiteSpace lexer+> lexeme    = PTok.lexeme lexer+> symbol    = PTok.symbol lexer+> natural   = PTok.natural lexer+> parens    = PTok.parens lexer+> semi      = PTok.semi lexer+> comma     = PTok.comma lexer+> identifier= PTok.identifier lexer+> reserved  = PTok.reserved lexer+> operator  = PTok.operator lexer+> reservedOp= PTok.reservedOp lexer+> lchar = lexeme.char++> app :: Parser (ViewTerm -> ViewTerm -> ViewTerm)+> app = do whiteSpace ; return App++> arrow :: Parser (ViewTerm -> ViewTerm -> ViewTerm)+> arrow = do symbol "->" ; return $ Forall (name "X")++> -- | Basic parsec combinator for parsing terms.+> pTerm :: Maybe (Parser ViewTerm) -- ^ Extra parse rules (for example +>          -- for any primitive types or operators you might have added).+>          -> Parser ViewTerm+> pTerm Nothing = try (do chainl1 (pNoApp Nothing) app)+>             <|> (pNoApp Nothing)+>             -- <|> pInfix Nothing+> pTerm (Just ext) = try (do chainl1 (pNoApp (Just ext)) app)+>                    -- <|> try (pInfix (Just ext))+>                    <|> try (pNoApp (Just ext))+>                    <|> ext++> -- | Parse a term which is not an application; +> -- use for parsing lists of terms.+> pNoApp :: Maybe (Parser ViewTerm) -> Parser ViewTerm+> pNoApp ext = try (do chainr1 (pExp ext) arrow)+>              <|> pExp ext++> pNoInfix :: Maybe (Parser ViewTerm) -> Parser ViewTerm+> pNoInfix ext = +>        do lchar '[' ; bs <- bindList ext ; lchar ']'+>           sc <- pTerm ext ;+>           return $ bindAll Lambda bs sc+>        <|> try (do lchar '(' ; bs <- bindList ext ; lchar ')'+>                    option "" (symbol "->")+>                    sc <- pTerm ext ;+>                    return $ bindAll Forall bs sc)+>        <|> do reserved "let" ; var <- identifier;+>               lchar ':' ; ty <- pTerm ext ; lchar '=' ; val <- pTerm ext ;+>               reserved "in" ; sc <- pTerm ext ;+>               return $ Let (UN var) ty val sc+>        <|> do lchar '(' ; t <- pTerm ext ; lchar ')' ; return t+>        <|> do lchar '<'+>               (nm,args) <- computation ext ; lchar ':' ; lty <- pTerm ext+>               lchar '>';+>               return $ Label nm args lty+>        <|> do reserved "call" ; lchar '<' +>               (nm,args) <- computation ext ;+>               lchar '>' ; tm <- pNoApp ext;+>               return $ Call nm args tm+>        <|> do reserved "return"; tm <- pTerm ext;+>               return $ Return tm+>        <|> do nm <- identifier ; return (Name Unknown (UN nm))+>        <|> do lchar '*' ; return Star+>        <|> do lchar '_' ; return Placeholder+>        <|> do lchar '?' ; var <- identifier ;+>               return $ Metavar (UN var)+>        <|> try (do symbol "{'" ; tm <- pTerm ext; lchar '}'+>                    return $ Quote tm)+>        <|> try (do symbol "{{" ; tm <- pTerm ext; symbol "}}"+>                    return $ Code tm)+>        <|> try (do symbol "!" ; tm <- pNoApp ext;+>                    return $ Eval tm)+>        <|> try (do symbol "~" ; tm <- pNoApp ext;+>                    return $ Escape tm)+>        <|> do case ext of+>                  Nothing -> fail "Parse error"+>                  Just ext -> ext++> -- | Parse an expression with infix expressions (doesn't work!)+> pExp :: Maybe (Parser ViewTerm) -> Parser ViewTerm+> pExp ext = pNoInfix ext -- buildExpressionParser opTable (pNoInfix ext)++-- > pInfix ext = do +-- >                 lexp <- trace ("Trying = ") $ pNoApp ext+-- >                 lchar '='+-- >                 rexp <- trace (show lexp) $ pTerm ext+-- >                 return $ apply (Name Unknown (name "Eq"))+-- >                            [Placeholder,Placeholder,lexp,rexp]++> opTable = [[op "$" (\ l r -> apply (Name Unknown (name "Eq"))+>                                    [Placeholder,Placeholder,l,r])+>                    AssocLeft]]+>     where op s f assoc = Infix (do string s+>                                    return f)+>                                assoc+++> -- | Basic parsec combinator for parsing inductive data types+> pInductive :: Maybe (Parser ViewTerm) -- ^ Extra parse rules (for example +>          -- for any primitive types or operators you might have added).+>          -> Parser Inductive+> pInductive ext = do nm <- identifier+>                     parmsM <- many (do lchar '('+>                                        xs <- bindList ext+>                                        lchar ')' ; return xs)+>                     lchar ':'+>                     indicesM <- many (do lchar '('+>                                          xs <- bindList ext+>                                          lchar ')' ; return xs)+>                     ty <- pTerm ext ; whereIntro+>                     cons <- sepBy (constructor ext) (lchar '|')+>                     return $ Inductive (UN nm) +>                                        (concat parmsM) +>                                        (concat indicesM)+>                                        ty cons+>   where whereIntro = do lchar '=' +>                         return ()+>                      <|> do reserved "where"+>                             return ()++> constructor ext = do nm <- identifier ; lchar ':'+>                      ty <- pTerm ext+>                      return $ (UN nm,ty)++> bindList :: Maybe (Parser ViewTerm) -> Parser [(Name, ViewTerm)]+> bindList ext +>     = do namelist <- sepBy1 identifier comma+>          lchar ':'+>          ty <- pTerm ext+>          rest <- option [] (do semi ; bindList ext)+>          return $ (map (\x -> (UN x,ty)) namelist) ++ rest++> bindAll binder [] sc = sc+> bindAll binder ((n,ty):xs) sc = binder n ty (bindAll binder xs sc)++> computation :: Maybe (Parser ViewTerm) -> Parser (Name, [ViewTerm])+> computation ext = do nm <- identifier ; args <- many (pNoApp ext)+>                      return (UN nm, args)++> -- | Parse a string into a ViewTerm, without mucking about with parsec+> -- or any extra parse rules.+> parseTermString :: Monad m => String -> m ViewTerm+> parseTermString str +>     = case parse (do t <- pTerm Nothing ; eof ; return t) "(input)" str of+>           Left err -> fail (show err)+>           Right tm -> return tm++> -- | Parse a string into an Inductive, without mucking about with parsec+> -- or any extra parse rules.+> parseDataString :: Monad m => String -> m Inductive+> parseDataString str +>     = case parse (do t <- pInductive Nothing ; eof ; return t) +>                   "(input)" str of+>           Left err -> fail (show err)+>           Right d -> return d
+ Ivor/Typecheck.lhs view
@@ -0,0 +1,599 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.Typecheck(typecheck, tcClaim,+>                       check, checkAndBind, checkAndBindPair,+>                       convert,+>                       checkConv, checkConvEnv, pToV, pToV2,+>                       verify, Gamma) where++> import Ivor.TTCore+> import Ivor.Gadgets+> import Ivor.Nobby+> import Ivor.Unify+> import Ivor.Constant++> import Control.Monad.State+> import Debug.Trace++Conversion in the presence of staging is a bit more than simply syntactic+equality on values, since it is possible values contain quoted code which+code be run later. So we say {'x} =~ {'y] iff x =~ y. Otherwise it's +syntactic.++> convert :: Gamma Name -> Indexed Name -> Indexed Name -> Bool+> convert g x y = convertEnv [] g x y++> convertEnv env g x y +>     = (convNormaliseEnv env g x) == (convNormaliseEnv env g y)+>   -- conv (Stage (Quote x)) (Stage (Quote y)) = convertEnv env g x y+>   -- need to actually reduce inside quotes to do conversion check++ convert g x y = trace ((show (normalise g x)) ++ " & " ++ (show (normalise g y))) $ (normalise g x)==(normalise g y)++> checkConv :: Monad m => Gamma Name -> Indexed Name -> Indexed Name -> +>              String -> m ()+> checkConv g x y err = if convert g x y then return ()+>	                 else fail err++> checkConvEnv :: Monad m => Env Name -> Gamma Name -> +>                 Indexed Name -> Indexed Name -> +>              String -> m ()+> checkConvEnv env g x y err = if convertEnv env g x y then return ()+>                              else fail err+++*****+SORT OUT TOP LEVEL TYPECHECKING FUNCTIONS+DEFINE THE INTERFACE CLEARLY++These are: check, checkAndBind, checkAndBindPair.++All should work by generating constraints and solving them, differing only+in when the constraints get solved.+so....+1. Generate constraints+2. Unify, checking for conversion and creating a substitution+3. Substitute into term and type+*****++Top level typechecking function - takes a context and a raw term,+returning a pair of a term and its type++> typecheck :: Monad m => Gamma Name -> Raw -> m (Indexed Name,Indexed Name)+> typecheck gamma term = do t <- check gamma [] term Nothing+>			    return t++> typecheckAndBind :: Monad m => Gamma Name -> Raw -> +>                     m (Indexed Name,Indexed Name, Env Name)+> typecheckAndBind gamma term = checkAndBind gamma [] term Nothing++Check a term, and return well typed terms with explicit names (i.e. no+de Bruijn indices)++> tcClaim :: Monad m => Gamma Name -> Raw -> m (Indexed Name,Indexed Name)+> tcClaim gamma term = do (Ind t, Ind v) <- check gamma [] term Nothing+>			    {-trace (show t) $-}+>                         return (Ind (makePs t), Ind (makePs v))++Check takes a global context, a local context, the term to check and+its expected type, if known, and returns a pair of a term and its+type.++> type CheckState = +>     (Level, -- Level number+>      Bool, -- Inferring types of names (if true)+>      Env Name, -- Extra bindings, if above is true+>      -- conversion constraints; remember the environment at the time we tried+>      [(Env Name, Indexed Name, Indexed Name)])++> type Level = Int++Finishes up type checking by making a substitution from all the conversion+constraints and applying it to the term and type.++> doConversion :: Monad m =>+>                 Raw -> Gamma Name ->+>                 [(Env Name, Indexed Name, Indexed Name)] ->+>                 Indexed Name -> Indexed Name -> +>                m (Indexed Name, Indexed Name)+> doConversion raw gam constraints (Ind tm) (Ind ty) =+>     -- trace ("Finishing checking " ++ show tm) $ -- ++ " with " ++ show constraints) $ +>           -- Unify twice; first time collect the substitutions, second+>           -- time do them. Because we don't know what order we can solve+>           -- constraints in and they might depend on each other...+>       do (subst, nms) <- mkSubst $ (map (\x -> (False,x)) constraints) +++>                                    (map (\x -> (True,x)) ((reverse constraints)++constraints))+>          let tm' = papp subst tm+>          let ty' = papp subst ty+>          return {- $ trace (show nms ++ "\n" ++ show (tm',ty')) -} (Ind tm',Ind ty')++>    where mkSubst [] = return (P, [])+>          mkSubst ((ok, (env,Ind x,Ind y)):xs) +>             = do (s',nms) <- mkSubst xs+>                  let x' = papp s' x+>                  let (Ind y') = normalise gam (Ind (papp s' y))+>                  uns <- case unifyenvErr ok gam env (Ind x') (Ind y') of+>                         Success x' -> return x'+>                         Failure err -> fail err++{- trace ("XXX: " ++ err ++ show (x',y')) $ return [] -} fail $ err {- ++"\n" ++ show nms ++"\n" ++ show constraints -- $ -} ++ " Can't convert "++show x'++" and "++show y' ++ "\n" ++ show constraints ++ "\n" ++ show nms++>                  extend s' nms uns++>          extend phi nms [] = return (phi, nms)+>          extend phi nms ((n,tm):uns) +>             = extend ((scomp $! (delta n tm)) $! phi) ((n,tm):nms) uns++>          scomp :: Subst -> Subst -> Subst+>          scomp s2 s1 tn = papp s2 (s1 tn)++>          delta n ty n' | n == n' = ty+>                        | otherwise = P n'++> check :: Monad m => Gamma Name -> Env Name -> Raw -> Maybe (Indexed Name) -> +>          m (Indexed Name, Indexed Name)+> check gam env tm mty = do+>   ((tm', ty'), (_,_,_,convs)) <- lvlcheck 0 False 0 gam env tm mty+>   tm'' <- doConversion tm gam convs tm' ty'+>   return tm''++> checkAndBind :: Monad m => Gamma Name -> Env Name -> Raw -> +>                 Maybe (Indexed Name) -> +>                 m (Indexed Name, Indexed Name, Env Name)+> checkAndBind gam env tm mty = do+>    ((v,t), (_,_,e,convs)) <- lvlcheck 0 True 0 gam env tm mty+>    (v',ty') <- doConversion tm gam convs v t+>    return (v',ty',e)+++Check two things together, with the same environment and variable inference,+and with the same expected type.+We need this for checking pattern clauses...++> checkAndBindPair :: Monad m => Gamma Name -> Raw -> Raw -> +>                     m (Indexed Name, Indexed Name, +>                        Indexed Name, Indexed Name, Env Name)+> checkAndBindPair gam tm1 tm2 = do+>    ((v1,t1), (next, inf, e, bs)) <- lvlcheck 0 True 0 gam [] tm1 Nothing+>    -- rename all the 'inferred' things to another generated name,+>    -- so that they actually get properly checked on the rhs+>    let realNames = mkNames next+>    e' <- fixupB gam realNames e+>    (v1', t1') <- fixupGam gam realNames (v1, t1)+>    (v1'',t1'') <- doConversion tm1 gam bs v1 (normalise gam t1) +>    ((v2,t2), (_, _, e'', bs')) <- {- trace ("Checking " ++ show tm2 ++ " has type " ++ show t1') $ -} lvlcheck 0 inf next gam e' tm2 (Just t1')+>    (v2',t2') <- doConversion tm2 gam bs' v2 (normalise gam t2) +>    return (v1',t1',v2',t2',e'')+>  where mkNames 0 = []+>        mkNames n+>           = ([],Ind (P (MN ("INFER",n-1))), +>                 Ind (P (MN ("T",n-1)))):(mkNames (n-1))++> lvlcheck :: Monad m => Level -> Bool -> Int -> +>             Gamma Name -> Env Name -> Raw -> +>             Maybe (Indexed Name) -> +>             m ((Indexed Name, Indexed Name), CheckState)+> lvlcheck lvl infer next gamma env tm exp +>     = do runStateT (tcfixupTop env lvl tm exp) (next, infer, [], []) +>  where++Do the typechecking, then unify all the inferred terms.++>  tcfixupTop env lvl t exp = do+>     tm@(_,tmty) <- tc env lvl t exp+>     (next, infer, bindings, errs) <- get+>     -- First, insert inferred values into the term+>     tm'@(_,tmty) <- fixup errs tm+>     -- Then check the resulting type matches the expected type.+>     if infer then (case exp of+>              Nothing -> return ()+>              Just expty -> checkConvSt env gamma expty tmty +>                               $ "Expected type and inferred type do not match: " +>                               ++ show expty ++ " and " ++ show tmty)+>       else return ()+>     -- Then fill in any remained inferred values we got by knowing the+>     -- expected type+>     (next, infer, bindings, errs) <- get+>     tm <- fixup errs tm+>     bindings <- fixupB gamma errs bindings+>     put (next, infer, bindings, errs)+>     return tm'++>  tcfixup env lvl t exp = do+>     tm@(_,tmty) <- tc env lvl t exp+>     -- case exp of+>     --   Nothing -> return ()+>     --   Just expt -> checkConvSt env gamma expt tmty "Type error"+>     (next, infer, bindings, errs) <- get+>     tm' <- fixup errs tm+>     bindings <- fixupB gamma errs bindings+>     put (next, infer, bindings, errs)+>     return tm'++tc has state threaded through -- state is a tuple of the next name to+generate, the stage we're at, and a list of conversion errors (which+will later be unified).  Needs an explicit type to help out ghc's+typechecker...++>  tc :: Monad m => Env Name -> Level -> Raw -> Maybe (Indexed Name) ->+>                   StateT CheckState m (Indexed Name, Indexed Name)+>  tc env lvl (Var n) exp = do+>        (rv, rt) <- mkTT (lookupi n env 0) (glookup n gamma)+>        case exp of+>           Nothing -> return (rv,rt)+>           Just expt -> do checkConvSt env gamma rt expt $ "Type error"+>                           return (rv,rt)++>    where mkTT (Just (i, B _ t)) _ = return (Ind (P n), Ind t)+>          mkTT Nothing (Just ((Fun _ _),t)) = return (Ind (P n), t)+>          mkTT Nothing (Just ((Partial _ _),t)) = return (Ind (P n), t)+>          mkTT Nothing (Just ((PatternDef _),t)) = return (Ind (P n), t)+>          mkTT Nothing (Just (Unreducible,t)) = return (Ind (P n), t)+>          mkTT Nothing (Just (Undefined,t)) = return (Ind (P n), t)+>          mkTT Nothing (Just ((ElimRule _),t)) = return (Ind (Elim n), t)+>          mkTT Nothing (Just ((PrimOp _ _),t)) = return (Ind (P n), t)+>          mkTT Nothing (Just ((DCon tag i),t)) = return (Ind (Con tag n i), t)+>          mkTT Nothing (Just ((TCon i _),t)) = return (Ind (TyCon n i), t)+>          mkTT Nothing Nothing = defaultResult++>          lookupi x [] _ = Nothing+>          lookupi x ((n,t):xs) i | x == n = Just (i,t)+>          lookupi x (_:xs) i = lookupi x xs (i+1)++>          defaultResult = do+>              (next, infer, bindings, errs) <- get+>              if infer+>                 then case exp of+>                        Nothing -> fail $ "No such name as " ++ show n+>                        Just (Ind t) -> do put (next, infer, (n, B Pi t):bindings, errs)+>                                           return (Ind (P n), Ind t)+>                 else fail $ "No such name as " ++ show n++>  tc env lvl (RApp f a) exp = do+>     (Ind fv, Ind ft) <- tcfixup env lvl f Nothing+>     let fnfng = normaliseEnv env (Gam []) (Ind ft)+>     let fnf = normaliseEnv env gamma (Ind ft)+>     (rv, rt) <-+>       case (fnfng,fnf) of+>        ((Ind (Bind _ (B Pi s) (Sc t))),_) -> do+>          (Ind av,Ind at) <- tcfixup env lvl a (Just (Ind s))+>          checkConvSt env gamma (Ind at) (Ind s) $ "Type error: " ++ show a ++ " : " ++ show at ++ ", expected type "++show s -- ++" "++show env+>          let tt = (Bind (MN ("x",0)) (B (Let av) at) (Sc t))+>          let tmty = (normaliseEnv env (Gam []) (Ind tt))+>          return (Ind (App fv av), tmty)+>        (_, (Ind (Bind _ (B Pi s) (Sc t)))) -> do+>          (Ind av,Ind at) <- tcfixup env lvl a (Just (Ind s))+>          checkConvSt env gamma (Ind at) (Ind s) $ "Type error: " ++ show a ++ " : " ++ show at ++ ", expected type "++show s -- ++" "++show env+>          let tt = (Bind (MN ("x",0)) (B (Let av) at) (Sc t))+>          let tt' = (normaliseEnv env gamma (Ind tt))+>          return (Ind (App fv av), (normaliseEnv env gamma (Ind tt)))+>        _ -> fail $ "Cannot apply a non function type " ++ show ft ++ " to " ++ show a+>     return (rv,rt)+>     case exp of+>        Nothing -> return (rv,rt)+>        Just expt -> do checkConvSt env gamma rt expt $ "Type error"+>                        return (rv,rt)+>  tc env lvl (RConst x) _ = tcConst x+>  tc env lvl RStar _ = return (Ind Star, Ind Star)++Pattern bindings are a special case since they may bind several names,+and we don't convert names to de Bruijn indices++>  tc env lvl (RBind n (B (Pattern p) ty) sc) exp = do+>     (gb, env) <- checkpatt gamma env lvl n p ty+>     let scexp = case exp of+>          Nothing -> Nothing+>          (Just (Ind (Bind sn sb (Sc st)))) -> Just $+>             normaliseEnv ((sn,sb):env) gamma (Ind st)+>     (Ind scv, Ind sct) <- tcfixup ((n,gb):env) lvl sc scexp+>     discharge gamma n gb (Sc scv) (Sc sct)++>  tc env lvl (RBind n b sc) exp = do+>     gb <- checkbinder gamma env lvl n b+>     let scexp = case exp of+>          Nothing -> Nothing+>          (Just (Ind (Bind sn sb (Sc st)))) -> Just $+>             normaliseEnv ((sn,sb):env) gamma (Ind st)+>          _ -> fail (show exp)+>     (Ind scv, Ind sct) <- tcfixup ((n,gb):env) lvl sc scexp+>     --discharge gamma n gb (Sc scv) (Sc sct)+>     discharge gamma n gb (pToV n scv) (pToV n sct)+>  tc env lvl l@(RLabel t comp) _ = do+>     (Ind tv, Ind tt) <- tcfixup env lvl t Nothing+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     case ttnf of+>       (Ind Star) -> do compv <- checkComp env lvl comp+>                        return (Ind (Label tv compv), Ind Star)+>       _ -> fail $ "Type of label " ++ show l ++ " must be *"+>  tc env lvl (RCall comp t) _ = do+>     compv <- checkComp env lvl comp+>     (Ind tv, Ind tt) <- tcfixup env lvl t Nothing+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     case ttnf of+>       (Ind (Label t comp)) -> return (Ind (Call compv tv), Ind t)+>       _ -> fail $ "Type of call must be a label"+>  tc env lvl (RReturn t) (Just exp) = do+>     let expnf = normaliseEnv env gamma exp+>     case expnf of+>       (Ind (Label lt comp)) -> do+>          (Ind tv, Ind tt) <- tcfixup env lvl t (Just (Ind lt))+>          checkConvSt env gamma (Ind lt) (Ind tt) $ +>             "Type error: " ++ show tt ++", expected type " ++ show lt+>          return (Ind (Return tv), Ind (Label tt comp))+>       _ -> fail $ "return " ++ show t++ " should give a label, got " ++ show expnf+>  tc env lvl (RReturn t) Nothing = fail $ "Need to know the type to return for "++show t+>  tc env lvl (RStage s) exp = do+>          (Ind sv, Ind st) <- tcStage env lvl s exp+>          return (Ind sv, Ind st)+>  tc env lvl RInfer (Just exp) = do +>                       (next, infer, bindings, errs) <- get+>                       put (next+1, infer, bindings, errs)+>                       return (Ind (P (MN ("INFER",next))), exp)+>  tc env lvl RInfer Nothing = fail "Can't infer a term for placeholder"++If we have a metavariable, we need to record the type of the expression which+will solve it. It needs to take the environment as arguments, and return+the expected type.++>  tc env lvl (RMeta n) (Just exp) = do (next, infer, bindings, errs) <- get+>                                       fail $ show (n, exp, bindings, env) ++ " -- Not implemented"+>  tc env lvl (RMeta n) Nothing = fail $ "Don't know the expected type of " ++ show n++>  tcStage env lvl (RQuote t) _ = do+>     (Ind tv, Ind tt) <- tc env (lvl+1) t Nothing+>     return (Ind (Stage (Quote tv)), Ind (Stage (Code tt)))+>  tcStage env lvl (RCode t) _ = do+>     (Ind tv, Ind tt) <- tc env lvl t Nothing+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     case ttnf of+>       (Ind Star) -> return (Ind (Stage (Code tv)), Ind Star)+>       _ -> fail $ "Type of code " ++ show t ++ " must be *"+>  tcStage env lvl (REval t) _ = do+>     -- when (lvl/=0) $ fail $ "Can't eval at level " ++ show lvl+>     (Ind tv, Ind tt) <- tc env lvl t Nothing+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     case ttnf of+>        (Ind (Stage (Code tcode))) -> +>            return (Ind (Stage (Eval tv tt)), Ind tcode)+>        _ -> fail $ "Can't eval a non-quoted term (type " ++ show ttnf ++ ")"+>  tcStage env lvl (REscape t) _ = do+>     -- when (lvl==0) $ fail $ "Can't escape at level " ++ show lvl+>     (Ind tv, Ind tt) <- tc env lvl t Nothing+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     case ttnf of+>        (Ind (Stage (Code tcode))) -> +>            return (Ind (Stage (Escape tv tt)), Ind tcode)+>        _ -> fail "Can't escape a non-quoted term"++>  checkComp env lvl (RComp n ts) = do+>     tsc <- mapM (\ t -> tcfixup env lvl t Nothing) ts+>     return (Comp n (map ( \ (Ind v, Ind t) -> v) tsc))++Insert inferred values into the term++>  fixup e tm = fixupGam gamma e tm++>  tcConst :: (Monad m, Constant c) => c -> m (Indexed Name, Indexed Name)+>  tcConst c = return (Ind (Const c), Ind (constType c))++ tcConst Star = return (Ind (Const Star), Ind (Const Star)) --- *:* is a bit dodgy...++  checkbinder :: Monad m => Gamma Name -> Env Name -> Level ->+	          Name -> Binder Raw -> m (Binder (TT Name))++-- FIXME: Should convert here rather than assert it must be *++>  checkbinder gamma env lvl n (B Lambda t) = do+>     (Ind tv,Ind tt) <- tcfixup env lvl t (Just (Ind Star))+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     case ttnf of+>       (Ind Star) -> return (B Lambda tv)+>       (Ind (P (MN ("INFER",_)))) -> return (B Lambda tv)+>       _ -> fail $ "The type of the binder " ++ show n ++ " must be *"+>  checkbinder gamma env lvl n (B Pi t) = do+>     (Ind tv,Ind tt) <- tcfixup env lvl t (Just (Ind Star))+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     case ttnf of+>       (Ind Star) -> return (B Pi tv)+>       (Ind (P (MN ("INFER",_)))) -> return (B Pi tv)+>       _ -> fail $ "The type of the binder " ++ show n ++ " must be *"++>  checkbinder gamma env lvl n (B (Let v) RInfer) = do+>     (Ind vv,Ind vt) <- tcfixup env lvl v Nothing+>     return (B (Let vv) vt)++>  checkbinder gamma env lvl n (B (Let v) t) = do+>     (Ind tv,Ind tt) <- tcfixup env lvl t (Just (Ind Star))+>     (Ind vv,Ind vt) <- tcfixup env lvl v (Just (Ind tv))+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     checkConvEnv env gamma (Ind vt) (Ind tv) $ +>        show vt ++ " and " ++ show tv ++ " are not convertible\n" ++ +>             dbg (normaliseEnv env gamma (Ind vt)) ++ "\n" +++>             dbg (normaliseEnv env gamma (Ind tv)) ++ "\n"+>     case ttnf of+>       (Ind Star) -> return (B (Let vv) tv)+>       _ -> fail $ "The type of the binder " ++ show n ++ " must be *"+>    where dbg (Ind t) = debugTT t++>  checkbinder gamma env lvl n (B Hole t) = do+>     (Ind tv,Ind tt) <- tcfixup env lvl t Nothing+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     case ttnf of+>       (Ind Star) -> return (B Hole tv)+>       _ -> fail $ "The type of the binder " ++ show n ++ " must be *"+>  checkbinder gamma env lvl n (B (Guess v) t) = do+>     (Ind tv,Ind tt) <- tcfixup env lvl t Nothing+>     (Ind vv,Ind vt) <- tcfixup env lvl v Nothing+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     checkConvEnv env gamma (Ind vt) (Ind tv) $ +>        show vt ++ " and " ++ show tv ++ " are not convertible"+>     case ttnf of+>       (Ind Star) -> return (B (Guess vv) tv)+>       _ -> fail $ "The type of the binder " ++ show n ++ " must be *"++>  checkpatt gamma env lvl n RInfer t = do+>     (Ind tv,Ind tt) <- tcfixup env lvl t Nothing+>     return ((B MatchAny tv), env)+>  checkpatt gamma env lvl n pat t = do+>     (Ind tv,Ind tt) <- tcfixup env lvl t Nothing+>     (next, infer, bindings, err) <- get+>     put (next, True, bindings, err)+>     (Ind patv,Ind patt) <- tcfixup (bindings++env) lvl pat Nothing+>     (next, _ ,bindings, err) <- get+>     put (next, infer, bindings, err)+>     let ttnf = normaliseEnv env gamma (Ind tt)+>     --checkConvEnv env gamma (Ind patt) (Ind tv) $ +>     --   show patt ++ " and " ++ show tv ++ " are not convertible"+>     case ttnf of+>       (Ind Star) -> return ((B (Pattern patv) tv), bindings++env)+>       _ -> fail $ "The type of the binder " ++ show n ++ " must be *"++Check a raw term representing a pattern. Return the pattern, and the +extended environment.++-- > checkPatt :: Monad m => Gamma Name -> Env Name -> Maybe (Pattern Name) ->+-- >              Raw -> Raw -> +-- >              m (Pattern Name, Env Name)+-- > checkPatt gam env acc (Var n) ty = trace (show n ++ ": "++ show env) $ do+-- >      (Ind tyc, _) <- check gam env ty (Just (Ind Star))+-- >      (pat, t) <- mkVarPatt (lookupi n env 0) (glookup n gam) (Ind tyc)+-- >      --checkConvEnv env gam (Ind tyc) (Ind t) $+-- >      --   show ty ++ " and " ++ show t ++ " are not convertible"+-- >      return (combinepats acc pat, (n, (B Pi tyc)):env)+-- >   where+-- >        mkVarPatt (Just (i, B _ t)) _ _ = return (PVar n, t)+-- >        mkVarPatt Nothing (Just ((DCon tag i), (Ind t))) _+-- >            = do tyname <- getTyName gam n+-- >                 return (PCon tag n tyname [], t)+-- >        mkVarPatt Nothing Nothing (Ind defty) = return (PVar n, defty)+-- >        lookupi x [] _ = Nothing+-- >        lookupi x ((n,t):xs) i | x == n = Just (i,t)+-- >        lookupi x (_:xs) i = lookupi x xs (i+1)++-- > checkPatt gam env acc (RApp f a) ty = do+-- >      (Ind tyc, _) <- trace (show ty) $ check gam env ty (Just (Ind Star))+-- >      let (RBind _ _ fscope) = ty+-- >      let (Bind nm (B _ nmt) _) = tyc+-- >      (fpat, fbindingsin) <- checkPatt gam env Nothing f ty+-- >      let fbindings = ((nm,(B Pi nmt)):fbindingsin)+-- >      (apat, abindings) <- checkPatt gam (fbindings++env) +-- >                                       (Just fpat) a fscope+-- >      return (combinepats (Just fpat) apat, fbindings++abindings)++--    where+--         mkEnv = map (\ (n,Ind t) -> (n, B Pi t))++-- > checkPatt gam env acc RInfer ty = return (combinepats acc PTerm, env)+-- > checkPatt gam env _ _ _ = fail "Invalid pattern"++> checkConvSt env g x y err = do (next, infer, bindings, err) <- get+>                                put (next, infer, bindings, (env,x,y):err)+>                                return ()++> fixupGam gamma [] tm = return tm+> fixupGam gamma ((env,x,y):xs) (Ind tm, Ind ty) = do +>      uns <- case unifyenv gamma env y x of+>                 Success x' -> return x'+>                 Failure err -> return [] -- fail err -- $ "Can't convert "++show x++" and "++show y ++ " ("++show err++")"+>      let tm' = fixupNames gamma uns tm+>      let ty' = fixupNames gamma uns ty+>      fixupGam gamma xs (Ind tm', Ind ty')++> fixupNames gam [] tm = tm+> fixupNames gam ((x,ty):xs) tm = fixupNames gam xs $ substName x ty (Sc tm)++> fixupB gam xs [] = return []+> fixupB gam xs ((n, (B b t)):bs) = do+>    bs' <- fixupB gam xs bs+>    (Ind t', _) <- fixupGam gam xs (Ind t, Ind Star)+>    return ((n,(B b t')):bs')++> combinepats Nothing x = x+> combinepats (Just (PVar n)) x = error "can't apply things to a variable"+> combinepats (Just (PCon tag n ty args)) x = PCon tag n ty (args++[x])++ discharge :: Monad m =>+              Gamma Name -> Name -> Binder (TT Name) -> +	       (Scope (TT Name)) -> (Scope (TT Name)) ->+	       m (Indexed Name, Indexed Name)++> discharge gamma n (B Lambda t) scv sct = do+>    let lt = Bind n (B Pi t) sct+>    let lv = Bind n (B Lambda t) scv+>    return (Ind lv,Ind lt)+> discharge gamma n (B Pi t) scv (Sc sct) = do+>    checkConvSt [] gamma (Ind Star) (Ind sct) $ +>       "The scope of a Pi binding must be a type"+>    let lt = Star+>    let lv = Bind n (B Pi t) scv+>    return (Ind lv,Ind lt)+> discharge gamma n (B (Let v) t) scv sct = do+>    let lt = Bind n (B (Let v) t) sct+>    let lv = Bind n (B (Let v) t) scv+>    return (Ind lv,Ind lt)+> discharge gamma n (B Hole t) scv (Sc sct) = do+>    let lt = sct -- already checked sct and t are convertible+>    let lv = Bind n (B Hole t) scv+>    -- A hole can't appear in the type of its scope, however.+>    checkNotHoley 0 sct+>    return (Ind lv,Ind lt)+> discharge gamma n (B (Guess v) t) scv (Sc sct) = do+>    let lt = sct -- already checked sct and t are convertible+>    let lv = Bind n (B (Guess v) t) scv+>    -- A hole can't appear in the type of its scope, however.+>    checkNotHoley 0 sct+>    return (Ind lv,Ind lt)+> discharge gamma n (B (Pattern v) t) scv (Sc sct) = do+>    let lt = sct -- already checked sct and t are convertible+>    let lv = Bind n (B (Pattern v) t) scv+>    -- A hole can't appear in the type of its scope, however.+>    checkNotHoley 0 sct+>    return (Ind lv,Ind lt)+> discharge gamma n (B MatchAny t) scv (Sc sct) = do+>    let lt = sct+>    let lv = Bind n (B MatchAny t) scv+>    return (Ind lv,Ind lt)++> checkNotHoley :: Monad m => Int -> TT n -> m ()+> checkNotHoley i (V v) | v == i = fail "You can't put a hole where a hole don't belong."+> checkNotHoley i (App f a) = do checkNotHoley i f+>                                checkNotHoley i a+> checkNotHoley i (Bind _ _ (Sc s)) = checkNotHoley (i+1) s+> checkNotHoley i (Proj _ _ t) = checkNotHoley i t+> checkNotHoley _ _ = return ()++> pToV :: Eq n => n -> (TT n) -> (Scope (TT n))+> pToV = pToV2 0++> pToV2 v p (P n) | p==n = Sc (V v)+>                 | otherwise = Sc (P n)+> pToV2 v p (V w) = Sc (V w)+> pToV2 v p (Con t n i) = Sc (Con t n i)+> pToV2 v p (TyCon n i) = Sc (TyCon n i)+> pToV2 v p (Elim n) = Sc (Elim n)+> pToV2 v p (Bind n b (Sc sc)) = Sc (Bind n (fmap (getSc.(pToV2 v p)) b)+>                                    (pToV2 (v+1) p sc))+>				where getSc (Sc a) = a+> pToV2 v p (App f a) = Sc $ App (getSc (pToV2 v p f))+>                               (getSc (pToV2 v p a))+>				where getSc (Sc a) = a+> pToV2 v p (Label t (Comp n ts)) = Sc $ Label (getSc (pToV2 v p t))+>                                         (Comp n (map (getSc.(pToV2 v p)) ts))+> pToV2 v p (Call (Comp n ts) t) = Sc $ Call +>                                        (Comp n (map (getSc.(pToV2 v p)) ts))+>                                        (getSc (pToV2 v p t))+> pToV2 v p (Return t) = Sc $ Return (getSc (pToV2 v p t))+> pToV2 v p (Proj n i t) = Sc $ Proj n i (getSc (pToV2 v p t))+>				where getSc (Sc a) = a+> pToV2 v p (Stage t) = Sc $ Stage (sLift (getSc.(pToV2 v p)) t)+> pToV2 v p (Const x) = Sc (Const x)+> pToV2 v p Star = Sc Star++> checkR g t = (typecheck g t):: (Result (Indexed Name, Indexed Name)) ++If we're paranoid - recheck a supposedly well-typed term. Might want to+do this after finishing a proof.++> verify :: Monad m => Gamma Name -> Indexed Name -> m ()+> verify gam tm = do (_,_) <- typecheck gam (forget tm)+>                    return ()
+ Ivor/Unify.lhs view
@@ -0,0 +1,196 @@+> {-# OPTIONS_GHC -fglasgow-exts #-}++> module Ivor.Unify where++> import Ivor.Nobby+> import Ivor.TTCore++> import Data.List++> import Debug.Trace++> type Unified = [(Name, TT Name)]++> type Subst = Name -> TT Name++Unify on named terms, but normalise using de Bruijn indices.+(I hope this doesn't get too confusing...)++> unify :: Monad m =>+>          Gamma Name -> Indexed Name -> Indexed Name -> m Unified+> unify gam x y = unifyenv gam [] (finalise x) (finalise y)++> unifyenv :: Monad m =>+>             Gamma Name -> Env Name ->+>             Indexed Name -> Indexed Name -> m Unified+> unifyenv = unifyenvErr False++> unifyenvCollect :: Monad m =>+>                    Gamma Name -> Env Name ->+>                    Indexed Name -> Indexed Name -> m Unified+> unifyenvCollect = unifyenvErr True++> unifyenvErr :: Monad m =>+>                Bool -> -- Ignore errors+>                Gamma Name -> Env Name ->+>                Indexed Name -> Indexed Name -> m Unified+> -- For the sake of readability of the results, first attempt to unify+> -- without reducing global names, and reduce if that doesn't work.+> -- (Actually, I'm not sure this helps. Probably just slows things down.)+> unifyenvErr i gam env x y = {- trace (show (x,y) ++ "\n" +++>                                    show (p (normalise (gam' gam) x)) ++ "\n" +++>                                    show (p (normalise (gam' gam) x))) $-}+>     {-case unifynferr i env (p (normalise emptyGam x))+>                      (p (normalise emptyGam y)) of+>           (Just x) -> return x+>           Nothing -> -} unifynferr i env (p (normalise (gam' gam) x))+>                                       (p (normalise (gam' gam) y))+>    where p (Ind t) = Ind (makePs t)+>          gam' g = concatGam g (envToGamHACK env)++Make the local environment something that Nobby knows about. Very hacky...++> envToGamHACK [] = emptyGam+> envToGamHACK ((n,B (Let v) ty):xs)+>     = insertGam n (G (Fun [] (Ind v)) (Ind ty) defplicit) (envToGamHACK xs)+> envToGamHACK (_:xs) = envToGamHACK xs++> unifynf :: Monad m =>+>            Env Name -> Indexed Name -> Indexed Name -> m Unified+> unifynf = unifynferr True++Collect names which do unify, and ignore errors++> unifyCollect :: Monad m =>+>            Env Name -> Indexed Name -> Indexed Name -> m Unified+> unifyCollect = unifynferr False++> sentinel = [(MN ("HACK!!",0), P (MN ("HACK!!",0)))]++> unifynferr :: Monad m =>+>               Bool -> -- Ignore errors+>               Env Name -> Indexed Name -> Indexed Name -> m Unified+> unifynferr ignore env (Ind x) (Ind y)+>                = do acc <- un env env x y []+>                     if ignore then return () else checkAcc acc+>                     return (acc \\ sentinel)+>    where un envl envr (P x) (P y) acc+>              | x == y = return acc+>              | loc x envl == loc y envr && loc x envl >=0+>                  = return acc+>              -- | ignore = trace (show (x,y)) $ return sentinel -- broken, forget acc, but move on+>          un envl envr (P x) t acc | hole envl x = return ((x,t):acc)+>          un envl envr t (P x) acc | hole envl x = return ((x,t):acc)+>          un envl envr (Bind x b@(B Hole ty) (Sc sc)) t acc+>             = un ((x,b):envl) envr sc t acc+>          un envl envr (Bind x b (Sc sc)) (Bind x' b' (Sc sc')) acc =+>              do acc' <- unb envl envr b b' acc+>                 un ((x,b):envl) ((x',b'):envr) sc sc' acc'+>                 -- combine bu scu+>          -- if unifying the functions fails because the names are different,+>          -- unifying the arguments is going to be a waste of time bec+>          un envl envr x@(App f s) y@(App f' s') acc+>              | funify (getFun f) (getFun f') = -- trace ("OK " ++ show (f,f',getFun f, getFun f')) $+>                   do acc' <- un envl envr f f' acc+>                      un envl envr s s' acc'+>              | otherwise = if ignore then return acc+>                               else fail $ "Can't unify "++show x++" and "++show y -- ++ " 5"+>             where funify (P x) (P y)+>                       | x==y = True+>                       | otherwise = hole envl x || hole envl y+>                   funify (Con _ _ _) (P x) = hole envr x+>                   funify (P x) (Con _ _ _) = hole envl x+>                   funify (TyCon _ _) (P x) = hole envr x+>                   funify (P x) (TyCon _ _) = hole envl x+>                   funify _ _ = True -- unify normally+>          un envl envr (Proj _ i t) (Proj _ i' t') acc+>             | i == i' = un envl envr t t' acc+>          un envl envr (Label t c) (Label t' c') acc = un envl envr t t' acc+>          un envl envr (Call c t) (Call c' t') acc = un envl envr t t' acc+>          un envl envr (Return t) (Return t') acc = un envl envr t t' acc+>          un envl envr (Stage x) (Stage y) acc = unst envl envr x y acc+>          un envl envr x y acc+>                     | x == y || ignore = return acc+>                     | otherwise = fail $ "Can't unify " ++ show x +++>                                          " and " ++ show y -- ++ " 1"+>          unb envl envr (B b ty) (B b' ty') acc =+>              do acc' <- unbb envl envr b b' acc+>                 un envl envr ty ty' acc'+>          unbb envl envr Lambda Lambda acc = return acc+>          unbb envl envr Pi Pi acc = return acc+>          unbb envl envr Hole Hole acc = return acc+>          unbb envl envr (Let v) (Let v') acc = un envl envr v v' acc+>          unbb envl envr (Guess v) (Guess v') acc = un envl envr v v' acc+>          unbb envl envr x y acc+>                   = if ignore then return acc+>                        else fail $ "Can't unify "++show x++" and "++show y -- ++ " 2"++>          unst envl envr (Quote x) (Quote y) acc = un envl envr x y acc+>          unst envl envr (Code x) (Code y) acc = un envl envr x y acc+>          unst envl envr (Eval x _) (Eval y _) acc = un envl envr x y acc+>          unst envl envr (Escape x _) (Escape y _) acc = un envl envr x y acc+>          unst envl envr x y acc =+>                   if ignore then return acc+>                       else fail $ "Can't unify " ++ show (Stage x) +++>                                " and " ++ show (Stage y) -- ++ " 3"++>          hole env x | (Just (B Hole ty)) <- lookup x env = True+>                     | otherwise = isInferred x+>          isInferred (MN ("INFER",_)) = True -- OK, a bit of a nasty hack.+>          isInferred _ = False++>          checkAcc [] = return ()+>          checkAcc ((n,tm):xs)+>              | (Just tm') <- lookup n xs+>                  = if (ueq tm tm')  -- Take account of names! == no good.+>                       then checkAcc xs+>                       else fail $ "Can't unify " ++ show tm +++>                                   " and " ++ show tm' -- ++ " 4"+>              | otherwise = checkAcc xs++>          loc x xs = loc' 0 x xs+>          loc' i x ((n,_):xs) | x == n = i+>                              | otherwise = loc' (i+1) x xs+>          loc' i x [] = -1++An equality test which takes account of names which should be equal.+TMP HACK! ;)++>          ueq :: TT Name -> TT Name -> Bool+>          ueq x y = case unifyenv (Gam []) [] (Ind x) (Ind y) of+>                   Just _ -> True+>                   _ -> False++Grr!++> ueq :: Gamma Name -> TT Name -> TT Name -> Bool+> ueq gam x y = case unifyenv gam [] (Ind x) (Ind y) of+>                   Just _ -> True+>                   _ -> False+++> substNames :: [(Name,TT Name)] -> TT Name -> TT Name+> substNames [] tm = tm+> substNames ((n,t):xs) tm = substNames xs (substName n t (Sc tm))++Look for a specific term (unifying with a subterm)+and replace it.++> unifySubstTerm :: Gamma Name -> TT Name -> TT Name ->+>                   Scope (TT Name) -> TT Name+> unifySubstTerm gam p tm (Sc x) = p' x where+>     p' x | ueq gam x p = tm+>     p' (App f' a) = (App (p' f') (p' a))+>     p' (Bind n b (Sc sc)) = (Bind n (fmap p' b) (Sc (p' sc)))+>      --   | n == p = (Bind n (fmap p' b) (Sc sc))+>      --   | otherwise+>     p' (Proj n i x) = Proj n i (p' x)+>     p' (Label t (Comp n cs)) = Label (p' t) (Comp n (map p' cs))+>     p' (Call (Comp n cs) t) = Call (Comp n (map p' cs)) (p' t)+>     p' (Return t) = Return (p' t)+>     p' (Stage (Quote t)) = Stage (Quote (p' t))+>     p' (Stage (Code t)) = Stage (Code (p' t))+>     p' (Stage (Eval t ty)) = Stage (Eval (p' t) (p' ty))+>     p' (Stage (Escape t ty)) = Stage (Escape (p' t) (p' ty))+>     p' x = x+
+ Ivor/ViewTerm.lhs view
@@ -0,0 +1,259 @@+> {-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}++> -- | +> -- Module      : Ivor.ViewTerm+> -- Copyright   : Edwin Brady+> -- Licence     : BSD-style (see LICENSE in the distribution)+> --+> -- Maintainer  : eb@dcs.st-and.ac.uk+> -- Stability   : experimental+> -- Portability : non-portable+> -- +> -- Exported view of terms and inductive data structures; imported +> -- implicitly by "Ivor.TT".++> module Ivor.ViewTerm(-- * Variable names+>                        Name,name,displayName,NameType(..),mkVar,+>                        -- * Terms+>                        Term(..), ViewTerm(..), apply,+>                        view, viewType, ViewConst, typeof, +>                        freeIn, namesIn, occursIn, getApp,+>                        -- * Inductive types+>                        Inductive(..)) +>    where++> import Ivor.TTCore as TTCore+> import Ivor.Gadgets+> import Ivor.State+> import Ivor.Typecheck++> import Data.Typeable+> import Data.List++> name :: String -> Name+> name = UN++> displayName :: Name -> String+> displayName (UN x) = x+> displayName (MN (x,i)) = "_" ++ x ++ "_" ++ show i++> -- | Abstract type representing a TT term and its type.+> newtype Term = Term (Indexed Name, Indexed Name)++> instance Show Term where+>     show (Term (Ind tm,Ind ty)) +>         = show (makePs tm) ++ " : " ++ show (makePs ty) ++ "\n"++> -- | Categories for names; typechecked terms will know what each variable+> -- is for. +> data NameType = Bound | Free | DataCon | TypeCon | ElimOp +>               | Unknown -- ^ Use for sending to typechecker.++> -- | Construct a term representing a variable+> mkVar :: String -- ^ Variable name+>          -> ViewTerm+> mkVar nm = Name Unknown (name nm)++> data ViewTerm +>     = Name { nametype :: NameType, var :: Name }+>     | App { fun :: ViewTerm, arg :: ViewTerm }+>     | Lambda { var :: Name, vartype :: ViewTerm, scope :: ViewTerm }+>     | Forall { var :: Name, vartype :: ViewTerm, scope :: ViewTerm }+>     | Let { var :: Name, vartype :: ViewTerm,+>             varval :: ViewTerm, scope :: ViewTerm }+>     | Label { fname :: Name, fargs :: [ViewTerm], labeltype :: ViewTerm }+>     | Call { fname :: Name, fargs :: [ViewTerm], callterm :: ViewTerm }+>     | Return { returnterm :: ViewTerm }+>     | forall c. Constant c => Constant c+>     | Star+>     | Quote { quotedterm :: ViewTerm } -- ^ Staging annotation+>     | Code { codetype :: ViewTerm } -- ^ Staging annotation+>     | Eval { evalterm :: ViewTerm } -- ^ Staging annotation+>     | Escape { escapedterm :: ViewTerm } -- ^ Staging annotation+>     | Placeholder+>     | Metavar { var :: Name }++> instance Eq ViewTerm where+>     (==) (Name _ x) (Name _ y) = x == y+>     (==) (Ivor.ViewTerm.App f a) (Ivor.ViewTerm.App f' a') = f == f' && a == a'+>     (==) (Ivor.ViewTerm.Lambda n ty sc) (Ivor.ViewTerm.Lambda n' ty' sc') = n==n' && ty==ty' && sc==sc'+>     (==) (Forall n ty sc) (Forall n' ty' sc') = n==n' && ty==ty' && sc==sc'+>     (==) (Ivor.ViewTerm.Let n v ty sc) (Ivor.ViewTerm.Let n' v' ty' sc') = n==n' && v==v' +>                                                 && ty==ty' && sc==sc'+>     (==) (Ivor.ViewTerm.Label _ _ ty) (Ivor.ViewTerm.Label _ _ ty') = ty == ty'+>     (==) (Ivor.ViewTerm.Call _ _ t) (Ivor.ViewTerm.Call _ _ t') = t == t'+>     (==) (Ivor.ViewTerm.Return t) (Ivor.ViewTerm.Return t') = t==t'+>     (==) Ivor.ViewTerm.Star Ivor.ViewTerm.Star = True+>     (==) Placeholder Placeholder = True+>     (==) (Metavar x) (Metavar y) = x == y+>     (==) (Constant x) (Constant y) = case cast x of+>                                        Just x' -> x' == y+>                                        Nothing -> False+>     (==) (Ivor.ViewTerm.Quote t) (Ivor.ViewTerm.Quote t') = t==t'+>     (==) (Ivor.ViewTerm.Code t) (Ivor.ViewTerm.Code t') = t==t'+>     (==) (Ivor.ViewTerm.Eval t) (Ivor.ViewTerm.Eval t') = t==t'+>     (==) (Ivor.ViewTerm.Escape t) (Ivor.ViewTerm.Escape t') = t==t'+>     (==) _ _ = False++> -- | Haskell types which can be used as constants+> class (Typeable c, Show c, Eq c) => ViewConst c where+>     typeof :: c -> Name++> instance ViewConst c => Constant c where+>     constType x = TyCon (typeof x) 0++> -- | Make an application of a function to several arguments+> apply :: ViewTerm -> [ViewTerm] -> ViewTerm+> apply f [] = f+> apply f (x:xs) = Ivor.ViewTerm.apply (Ivor.ViewTerm.App f x) xs++> data Inductive+>     = Inductive { typecon :: Name, +>                   parameters :: [(Name,ViewTerm)],+>                   indices :: [(Name,ViewTerm)],+>                   contype :: ViewTerm,+>                   constructors :: [(Name,ViewTerm)] }++> instance Forget ViewTerm Raw where+>     forget (Ivor.ViewTerm.App f a) = RApp (forget f) (forget a)+>     forget (Ivor.ViewTerm.Lambda v ty sc) = RBind v +>                                            (B TTCore.Lambda (forget ty)) +>                                            (forget sc)+>     forget (Forall v ty sc) = RBind v (B Pi (forget ty)) (forget sc)+>     forget (Ivor.ViewTerm.Let v ty val sc) = RBind v (B (TTCore.Let (forget val))+>                                                  (forget ty)) (forget sc)+>     forget (Ivor.ViewTerm.Label n args ty) +>         = RLabel (forget ty) (RComp n (map forget args))+>     forget (Ivor.ViewTerm.Call n args ty) +>         = RCall (RComp n (map forget args)) (forget ty)+>     forget (Ivor.ViewTerm.Return ty) = RReturn (forget ty)+>     forget (Constant c) = RConst c+>     forget (Ivor.ViewTerm.Star) = TTCore.RStar+>     forget Placeholder = RInfer+>     forget (Metavar x) = RMeta x+>     forget (Ivor.ViewTerm.Quote t) = RStage (RQuote (forget t))+>     forget (Ivor.ViewTerm.Code t) = RStage (RCode (forget t))+>     forget (Ivor.ViewTerm.Eval t) = RStage (REval (forget t))+>     forget (Ivor.ViewTerm.Escape t) = RStage (REscape (forget t))+>     forget x = Var (var x)++> instance Show ViewTerm where+>     show = show.forget++> instance Forget Inductive String where+>     forget (Inductive n ps inds cty cons) =+>         show n++" "++showbind ps++" : "++showbind inds++show (forget cty)+>                  ++ " = "+++>                showcons cons+>       where showbind [] = ""+>             showbind ((x,ty):xs) = "("++show x++":"++show (forget ty)++")"+>                                    ++ showbind xs+>             showcons [] = ""+>             showcons [x] = showcon x+>             showcons (x:xs) = showcon x ++ " | " ++ showcons xs+>             showcon (x,ty) = show x ++ " : " ++ show (forget ty)++> instance Show Inductive where+>     show = forget++> -- |Get a pattern matchable representation of a term.+> view :: Term -> ViewTerm+> view (Term (Ind tm,_)) = vt (Ind (makePs tm))++> -- |Get a pattern matchable representation of a term's type.+> viewType :: Term -> ViewTerm+> viewType (Term (_,Ind ty)) = vt (Ind (makePs ty))++> vt :: Indexed Name -> ViewTerm+> vt (Ind tm) = vtaux [] tm where+>     vtaux ctxt (P n) = Name Free n+>     vtaux ctxt (V i) = Name Bound (traceIndex ctxt i "ViewTerm vt")+>     vtaux ctxt (Con _ n _) = Name DataCon n+>     vtaux ctxt (TyCon n _) = Name TypeCon n+>     vtaux ctxt (Elim n) = Name ElimOp n+>     vtaux ctxt (TTCore.App f a) = Ivor.ViewTerm.App (vtaux ctxt f) (vtaux ctxt a)+>     vtaux ctxt (Bind n (B TTCore.Lambda ty) (Sc sc)) =+>         Ivor.ViewTerm.Lambda n (vtaux ctxt ty) (vtaux (n:ctxt) sc)+>     vtaux ctxt (Bind n (B Pi ty) (Sc sc)) =+>         Forall n (vtaux ctxt ty) (vtaux (n:ctxt) sc)+>     vtaux ctxt (Bind n (B (TTCore.Let val) ty) (Sc sc)) =+>         Ivor.ViewTerm.Let n (vtaux ctxt ty) (vtaux ctxt val) (vtaux (n:ctxt) sc)+>     vtaux ctxt (Const c) = Constant c+>     vtaux ctxt TTCore.Star = Ivor.ViewTerm.Star+>     vtaux ctxt (TTCore.Label ty (Comp n ts)) =+>         Ivor.ViewTerm.Label n (fmap (vtaux ctxt) ts) (vtaux ctxt ty)+>     vtaux ctxt (TTCore.Call (Comp n ts) ty) =+>         Ivor.ViewTerm.Call n (fmap (vtaux ctxt) ts) (vtaux ctxt ty)+>     vtaux ctxt (TTCore.Return ty) = Ivor.ViewTerm.Return (vtaux ctxt ty)+>     vtaux ctxt (Stage (TTCore.Quote tm)) +>         = Ivor.ViewTerm.Quote (vtaux ctxt tm)+>     vtaux ctxt (Stage (TTCore.Code tm)) +>         = Ivor.ViewTerm.Code (vtaux ctxt tm)+>     vtaux ctxt (Stage (TTCore.Eval tm _)) +>         = Ivor.ViewTerm.Eval (vtaux ctxt tm)+>     vtaux ctxt (Stage (TTCore.Escape tm _)) +>         = Ivor.ViewTerm.Escape (vtaux ctxt tm)+>     vtaux _ _ = error "Can't happen vtaux"++> -- | Return whether the name occurs free in the term.+> freeIn :: Name -> ViewTerm -> Bool+> freeIn n t = fi n t where+>    fi n (Ivor.ViewTerm.Name _ x) | x == n = True+>                    | otherwise = False+>    fi n (Ivor.ViewTerm.App f a) = fi n f || fi n a+>    fi n (Ivor.ViewTerm.Lambda x ty sc) +>        | x == n = False+>        | otherwise = fi n ty || fi n sc+>    fi n (Forall x ty sc) | x == n = False+>                          | otherwise = fi n ty || fi n sc+>    fi n (Ivor.ViewTerm.Let x v ty sc) +>        | x == n = False+>        | otherwise = fi n v || fi n ty || fi n sc+>    fi n (Ivor.ViewTerm.Label _ _ t) = fi n t+>    fi n (Ivor.ViewTerm.Call _ _ t) = fi n t+>    fi n (Ivor.ViewTerm.Return t) = fi n t+>    fi n (Ivor.ViewTerm.Quote t) = fi n t+>    fi n (Ivor.ViewTerm.Code t) = fi n t+>    fi n (Ivor.ViewTerm.Eval t) = fi n t+>    fi n (Ivor.ViewTerm.Escape t) = fi n t+>    fi n _ = False++> -- | Return the names occurring free in a term+> namesIn :: ViewTerm -> [Name]+> namesIn t = nub $ fi [] t where+>    fi ns (Ivor.ViewTerm.Name _ x) | x `elem` ns = []+>                                   | otherwise = [x]+>    fi ns (Ivor.ViewTerm.App f a) = fi ns f ++ fi ns a+>    fi ns (Ivor.ViewTerm.Lambda x ty sc) = fi (x:ns) sc+>    fi ns (Forall x ty sc) = fi (x:ns) sc+>    fi ns (Ivor.ViewTerm.Let x v ty sc) = fi (x:ns) sc+>    fi ns (Ivor.ViewTerm.Label _ _ t) = fi ns t+>    fi ns (Ivor.ViewTerm.Call _ _ t) = fi ns t+>    fi ns (Ivor.ViewTerm.Return t) = fi ns t+>    fi ns (Ivor.ViewTerm.Quote t) = fi ns t+>    fi ns (Ivor.ViewTerm.Code t) = fi ns t+>    fi ns (Ivor.ViewTerm.Eval t) = fi ns t+>    fi ns (Ivor.ViewTerm.Escape t) = fi ns t+>    fi ns _ = []++> -- | Return whether a subterm occurs in a (first order) term.+> occursIn :: ViewTerm -> ViewTerm -> Bool+> occursIn n t = fi n t where+>    fi n (Ivor.ViewTerm.App f a) = fi n f || fi n a+>    fi n (Ivor.ViewTerm.Lambda x ty sc) = False -- higher order+>    fi n (Forall x ty sc) = False+>    fi n (Ivor.ViewTerm.Let x v ty sc)  = False+>    fi n (Ivor.ViewTerm.Label _ _ t) = fi n t+>    fi n (Ivor.ViewTerm.Call _ _ t) = fi n t+>    fi n (Ivor.ViewTerm.Return t) = fi n t+>    fi n (Ivor.ViewTerm.Code t) = fi n t+>    fi n (Ivor.ViewTerm.Eval t) = fi n t+>    fi n (Ivor.ViewTerm.Escape t) = fi n t+>    fi n x = n == x++> -- | Get the function from an application. If no application, returns the+> -- entire term.+> getApp :: ViewTerm -> ViewTerm+> getApp (Ivor.ViewTerm.App f a) = getApp f+> getApp x = x+
+ Jones/Main.lhs view
@@ -0,0 +1,13 @@+> module Main where++Jones the Steam.+Simple program for starting up an interactive shell with Ivor library.++> import Ivor.TT+> import Ivor.Shell++> main :: IO ()+> main = do let shell = addModulePath (newShell emptyContext) +>                          (prefix ++ "/lib/ivor")+>           ctxt <- runShell "> " shell+>           putStrLn "Finished"
+ LICENSE view
@@ -0,0 +1,32 @@+Copyright (c) 2006 Edwin Brady+    School of Computer Science, University of St Andrews+All rights reserved.++This code is derived from software written by Edwin Brady+(eb@dcs.st-and.ac.uk).++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:+1. Redistributions of source code must retain the above copyright+   notice, this list of conditions and the following disclaimer.+2. Redistributions in binary form must reproduce the above copyright+   notice, this list of conditions and the following disclaimer in the+   documentation and/or other materials provided with the distribution.+3. None of the names of the copyright holders may be used to endorse+   or promote products derived from this software without specific+   prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR+PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.++*** End of disclaimer. ***
+ Setup.lhs view
@@ -0,0 +1,4 @@+> import Distribution.Simple++> main = defaultMain+
+ TODO view
@@ -0,0 +1,48 @@+Short term things to do:++* Allow holes in pattern matching definitions+* Need an easier way of updating a context with an input file+   (currently have to create a shell, then load, then create a new+   shell if you want to modify the context further)+* Improve error messages!+* Recursive functions shouldn't reduce at type level.+* Either better than Monad m? Define an Error type.+* Fix naming bug --- terms of form t1 -> t2 automatically give t1 the+  name X, which can clash. Particularly a problem in data type declarations.+* Current naive proof state representation is far too slow. Come up+  with something better.+* Keep track of level in proof state.+* Keep track of binding level in context, and check at point of use.+* Allow dump of global context to disk, for fast reloading.+* Syntax for equality.+* Elimination with a motive.+* Unit tests - at least check nat.tt, vect.tt, JM equality,+  primitives, simple staging, compiler.+* More readable high level language for function definition. Really+  just has to use tactic engine to translate simple case expressions into+  D-case calls.+* Separate API into several files for clarity.+* Allow call <fn args> _ in raw terms; i.e. allow the typechecker to+  spot recursive calls, rather than needing a tactic to do so.+* Finish compiler by:+  - Finding a method of exporting primitive types+  - Implement compilation of D-Case++Things which could be done to the library, in no particular order+(other than the order I thought of them in...):++* A higher level dependently typed language might be useful (e.g. like+  Coq's language). If not useful, at least fun :).+* Namespace management.+* Some useful error messages from the Parsec parsers would be nice.+* Proper type universes, of some form.+* Generate DRec and DNoConfusion as well as DElim/DCase.+* Build in Sigma types? (At least a nicer syntax?)+* Infix operators, especially = would be nice.++Tactics:++* Injectivity.+* Discriminate.+* Inversion.+
+ docs/HCAR.tex view
@@ -0,0 +1,56 @@+\documentclass{article}++\usepackage{hcar}+\usepackage{url}++\begin{document}++\begin{hcarentry}{Ivor}+\report{Edwin Brady}+\status{Active Development}+\makeheader++Ivor is a tactic-based theorem proving engine with a Haskell API. Unlike+other systems such as Coq and Agda, the tactic engine is primarily+intended to be used by programs, rather than a human operator. To this+end, the API provides a collection of primitive tactics and+combinators for building new tactics. This allows easy construction of+domain specific tactics, while keeping the core type theory small and+independently checkable.++The primary aim of the library is to support research into generative+programming and resource bounded computation in Hume+(\url{http://www.hume-lang.org/}). In this setting, we have developed a+dependently typed framework for representing program execution cost,+and used the Ivor library to implement domain specific tactics for+constructing programs within this framework. However the library is+more widely applicable, some potential uses being:++\begin{itemize}+\item A core language for a richly typed functional language.+\item The underlying implementation for a theorem prover (see first order+  logic theorem prover example at +  \url{http://www.dcs.st-and.ac.uk/~eb/Ivor}).+\item An implementation framework for a domain specific language requiring+  strong correctness properties.+\end{itemize}++Ivor features a dependent type theory similar to Luo's ECC with+definitions, with additional (experimental) multi-stage programming+support. Optionally, it can be extended with heterogenous equality,+primitive types and operations, new parser rules and user defined+tactics. By default, all programs in the type theory terminate, but in+the spirit of flexibilty, the library can be configured to allow+general recursion.++The library is in active development, although at an early+stage. Future plans include development of more basic tactics (for+basic properties such as injectivity and disjointness of constructors,+and elimination with a motive), a compiler (with optimisations) and a+larger collection of standard definitions.++\FurtherReading+  \url{http://www.dcs.st-and.ac.uk/~eb/Ivor}+\end{hcarentry}++\end{document}
+ docs/Makefile view
@@ -0,0 +1,22 @@+all: humett.pdf++SOURCES = humett.tex dtp.bib macros.ltx library.ltx local.ltx \+          intro.tex tt.tex interface.tex shell.tex tactics.tex \+          combinators.tex conclusion.tex++humett.pdf: $(SOURCES)+	pdflatex humett+	-bibtex humett+	-pdflatex humett++humett.ps: humett.dvi+	dvips -o humett.ps humett++humett.dvi: $(SOURCES)+	-latex humett+	-bibtex humett+	-latex humett+	-latex humett++clean:+	rm -f *.dvi *.pdf *.aux *.bbl *.blg *.log
+ docs/combinators.tex view
@@ -0,0 +1,1 @@+\section{Building New Tactics}
+ docs/conclusion.tex view
@@ -0,0 +1,1 @@+\section{Conclusion}
+ docs/dtp.bib view
@@ -0,0 +1,114 @@+@phdthesis{ brady-thesis,+    author = {Edwin Brady},+    title = {Practical Implementation of a Dependently Typed Functional Programming Language},+    year = 2005,+    school = {University of Durham}+}++@article{view-left,+   journal = {Journal of Functional Programming},+   number = {1},+   volume = {14},+   title = {The View From The Left},+   year = {2004},+   author = {Conor McBride and James McKinna},+   pages = {69--111}+}++@misc{epigram-afp,+    author = {Conor McBride},+    title = {Epigram: Practical Programming with Dependent Types},+    year = {2004},+    howpublished = {Lecture Notes, International Summer School on Advanced Functional Programming}+}++@misc{coq-manual,+   howpublished = {\verb+http://coq.inria.fr/+},+   title = {The {Coq} Proof Assistant --- Reference Manual},+   year = {2004},+   author = {{Coq Development Team}}+}++@inproceedings{extraction-coq,+   title = {A New Extraction for {Coq}},+   year = {2002},+   booktitle = {Types for proofs and programs},+   editor = {Herman Geuvers and Freek Wiedijk},+   publisher = {Springer},+   author = {Pierre Letouzey},+   series = {LNCS}+}++@techreport{lego-manual,+   title = {\textsc{Lego} Proof Development System: User's Manual},+   year = {1992},+   institution = {Department of Computer Science, University of Edinburgh},+   author = {Zhaohui Luo and Robert Pollack}+}++@inproceedings{cayenne,+    author = "Lennart Augustsson",+    title = "Cayenne - a Language with Dependent Types",+    booktitle = "International Conference on Functional Programming",+    pages = "239--250",+    year = "1998",+    url = "citeseer.nj.nec.com/augustsson98cayenne.html" +}++@book{luo94,+   title = {Computation and Reasoning -- A Type Theory for Computer Science},+   year = {1994},+   publisher = {OUP},+   author = {Zhaohui Luo},+   series = {International Series of Monographs on Computer Science}+}++@phdthesis{goguen-thesis,+   school = {University of Edinburgh},+   title = {A Typed Operational Semantics for Type Theory},+   year = {1994},+   author = {Healfdene Goguen}+}++@phdthesis{mcbride-thesis,+   month = {May},+   school = {University of Edinburgh},+   title = {Dependently Typed Functional Programs and their         proofs},+   year = {2000},+   author = {Conor McBride}+}++@misc{mckinnabrady-phase,+   title = {Phase Distinctions in the Compilation of {Epigram}},+   year = 2005,+   author = {James McKinna and Edwin Brady},+   note = {Draft}+}++@article{pugh-omega,+   title =  "The {Omega} {Test}: a fast and practical integer programming algorithm for dependence analysis", +   author = "William Pugh", +   journal = "Communication of the ACM", +   year = 1992, +   pages = {102--114}+}+++@Article{RegionTypes,+  refkey =       "C1753",+  title =        "Region-Based Memory Management",+  author =       "M. Tofte and J.-P. Talpin",+  pages =        "109--176",+  journal =      "Information and Computation",+  month =        "1~" # feb,+  year =         "1997",+  volume =       "132",+  number =       "2"+}++@phdthesis{ pedro-thesis,+    author = {Pedro Vasconcelos},+    title = {Space Cost Modelling for Concurrent Resource Sensitive Systems},+    year = 2006,+    school = {University of St Andrews}+}
+ docs/hcar.sty view
@@ -0,0 +1,182 @@+\ProvidesPackage{hcar}++\newif\ifhcarfinal+\hcarfinalfalse+\DeclareOption{final}{\hcarfinaltrue}+\ProcessOptions++\RequirePackage{keyval}+\RequirePackage{color}+\RequirePackage{array}++\ifhcarfinal+  \RequirePackage[T1]{fontenc}+  \RequirePackage{lmodern}+  \RequirePackage{tabularx}+  \RequirePackage{booktabs}+  \RequirePackage{framed}+  \RequirePackage[obeyspaces,T1]{url}+  \RequirePackage+    [bookmarks=true,colorlinks=true,+     urlcolor=urlcolor,+     linkcolor=linkcolor,+     breaklinks=true,+     pdftitle={Haskell Communities and Activities Report}]%+    {hyperref}+\else+  \RequirePackage[obeyspaces]{url}+\fi+\urlstyle{sf}++\definecolor{urlcolor}{rgb}{0.1,0.3,0}+\definecolor{linkcolor}{rgb}{0.3,0,0}+\definecolor{shadecolor}{rgb}{0.9,0.95,1}%{0.98,1.0,0.95}+\definecolor{framecolor}{gray}{0.9}+\definecolor{oldgray}{gray}{0.7}++\newcommand{\FurtherReading}{\subsubsection*{Further reading}}+\newcommand{\FuturePlans}{\subsubsection*{Future plans}}+\newcommand{\Separate}{\smallskip\noindent}+\newcommand{\FinalNote}{\smallskip\noindent}++\newcommand{\urlpart}{\begingroup\urlstyle{sf}\Url}+\newcommand{\email}[1]{\href{mailto:\EMailRepl{#1}{ at }}{$\langle$\urlpart{#1}$\rangle$}}+\newcommand{\cref}[1]{($\rightarrow\,$\ref{#1})}++\ifhcarfinal+  \let\hcarshaded=\shaded+  \let\endhcarshaded=\endshaded+\else+  \newsavebox{\shadedbox}+  \newlength{\shadedboxwidth}+  \def\hcarshaded+    {\begingroup+     \setlength{\shadedboxwidth}{\linewidth}%+     \addtolength{\shadedboxwidth}{-2\fboxsep}%+     \begin{lrbox}{\shadedbox}%+     \begin{minipage}{\shadedboxwidth}\ignorespaces}+  \def\endhcarshaded+    {\end{minipage}%+     \end{lrbox}%+     \noindent+     \colorbox{shadecolor}{\usebox{\shadedbox}}%+     \endgroup}+\fi++\ifhcarfinal+  \newenvironment{hcartabularx}+    {\tabularx{\linewidth}{l>{\raggedleft}X}}+    {\endtabularx}+\else+  \newenvironment{hcartabularx}+    {\begin{tabular}{@{}m{.3\linewidth}@{}>{\raggedleft}p{.7\linewidth}@{}}}+    {\end{tabular}}+\fi++\ifhcarfinal+  \let\hcartoprule=\toprule+  \let\hcarbottomrule=\bottomrule+\else+  \let\hcartoprule=\hline+  \let\hcarbottomrule=\hline+\fi++\define@key{hcarentry}{chapter}[]{\let\level\chapter}+\define@key{hcarentry}{section}[]{\let\level\section}+\define@key{hcarentry}{subsection}[]{\let\level\subsection}+\define@key{hcarentry}{subsubsection}[]{\let\level\subsubsection}+\define@key{hcarentry}{level}{\let\level=#1}+%\define@key{hcarentry}{label}{\def\entrylabel{\label{#1}}}+\define@key{hcarentry}{new}[]%+  {\let\startnew=\hcarshaded\let\stopnew=\endhcarshaded+   \def\startupdated{\let\orig@addv\addvspace\let\addvspace\@gobble}%+   \def\stopupdated{\let\addvspace\orig@addv}}+\define@key{hcarentry}{old}[]{\def\normalcolor{\color{oldgray}}\color{oldgray}}%+\define@key{hcarentry}{updated}[]%+  {\def\startupdated+    {\leavevmode\let\orig@addv\addvspace\let\addvspace\@gobble\hcarshaded}%+   \def\stopupdated{\endhcarshaded\let\addvspace\orig@addv}}++\def\@makeheadererror{\PackageError{hcar}{hcarentry without header}{}}++\newenvironment{hcarentry}[2][]%+{\let\level\subsection+ \let\startupdated=\empty\let\stopupdated=\empty+ \let\startnew=\empty\let\stopnew=\empty+%\let\entrylabel=\empty+ \global\let\@makeheaderwarning\@makeheadererror+ \setkeys{hcarentry}{#1}%+ \startnew\startupdated+ \level{#2}%+ % test:+ \global\let\@currentlabel\@currentlabel+%\stopupdated+ \let\report@\empty+ \let\groupleaders@\empty+ \let\members@\empty+ \let\contributors@\empty+ \let\participants@\empty+ \let\developers@\empty+ \let\maintainer@\empty+ \let\status@\empty+ \let\release@\empty+ \let\portability@\empty+ \let\entry@\empty}%+{\stopnew\@makeheaderwarning}%++\renewcommand{\labelitemi}{$\circ$}+\settowidth{\leftmargini}{\labelitemi}+\addtolength{\leftmargini}{\labelsep}++\newcommand*\MakeKey[2]%+  {\expandafter\def\csname #1\endcsname##1%+     {\expandafter\def\csname #1@\endcsname{\Key@{#2}{##1}}\ignorespaces}}+\MakeKey{report}{Report by:}+\MakeKey{status}{Status:}+\MakeKey{groupleaders}{Group leaders:}+\MakeKey{members}{Members:}+\MakeKey{contributors}{Contributors:}+\MakeKey{participants}{Participants:}+\MakeKey{developers}{Developers:}+\MakeKey{maintainer}{Maintainer:}+\MakeKey{release}{Current release:}+\MakeKey{portability}{Portability:}+\MakeKey{entry}{Entry:}++\newcommand\Key@[2]{#1 & #2\tabularnewline}++\newcommand\makeheader+{\smallskip+ \begingroup+ \sffamily+ \small+ \noindent+ \let\ohrule\hrule+ \def\hrule{\color{framecolor}\ohrule}%+ \begin{hcartabularx}+ \hline+ \report@+ \groupleaders@+ \members@+ \participants@+ \developers@+ \contributors@+ \maintainer@+ \status@+ \release@+ \portability@+ \hcarbottomrule+ \end{hcartabularx}+ \endgroup+ \stopupdated+ \global\let\@makeheaderwarning\empty+ \@afterindentfalse+ \@xsect\smallskipamount}++% columns/linebreaks, interchanged+\newcommand\NCi{&\let\NX\NCii}%+\newcommand\NCii{&\let\NX\NL}%+\newcommand\NL{\\\let\NX\NCi}%+\let\NX\NCi+\newcommand\hcareditor[1]{&#1 (ed.)&\\}+\newcommand\hcarauthor[1]{#1\NX}%
+ docs/humett.tex view
@@ -0,0 +1,39 @@+\documentclass{article}++\input{macros.ltx}+\input{library.ltx}+\input{local.ltx}++\NatPackage++\begin{document}++\title{\prover{} --- A Type Theory Based Theorem Proving Library}+\author{Edwin Brady}++\maketitle++% Introduction+\input{intro.tex}++% The type theory+\input{tt.tex}++% The interface+\input{interface.tex}++% The shell+\input{shell.tex}++% Primitive tactics+\input{tactics.tex}++% Making new tactics; combinators+\input{combinators.tex}++\input{conclusion}++\bibliographystyle{alpha}+\bibliography{dtp}++\end{document}
+ docs/interface.tex view
@@ -0,0 +1,1 @@+\section{The API}
+ docs/intro.tex view
@@ -0,0 +1,1 @@+\section{Introduction}
+ docs/library.ltx view
@@ -0,0 +1,325 @@+%%%%%%%%%%%%%%% library file for datatypes etc.++%%% Identifiers++\newcommand{\va}{\VV{a}}+\newcommand{\vb}{\VV{b}}+\newcommand{\vc}{\VV{c}}+\newcommand{\vd}{\VV{d}}+\newcommand{\ve}{\VV{e}}+\newcommand{\vf}{\VV{f}}+\newcommand{\vg}{\VV{g}}+\newcommand{\vh}{\VV{h}}+\newcommand{\vi}{\VV{i}}+\newcommand{\vj}{\VV{j}}+\newcommand{\vk}{\VV{k}}+\newcommand{\vl}{\VV{l}}+\newcommand{\vm}{\VV{m}}+\newcommand{\vn}{\VV{n}}+\newcommand{\vo}{\VV{o}}+\newcommand{\vp}{\VV{p}}+\newcommand{\vq}{\VV{q}}+\newcommand{\vr}{\VV{r}}+\newcommand{\vs}{\VV{s}}+\newcommand{\vt}{\VV{t}}+\newcommand{\vu}{\VV{u}}+\newcommand{\vv}{\VV{v}}+\newcommand{\vw}{\VV{w}}+\newcommand{\vx}{\VV{x}}+\newcommand{\vy}{\VV{y}}+\newcommand{\vz}{\VV{z}}+\newcommand{\vA}{\VV{A}}+\newcommand{\vB}{\VV{B}}+\newcommand{\vC}{\VV{C}}+\newcommand{\vD}{\VV{D}}+\newcommand{\vE}{\VV{E}}+\newcommand{\vF}{\VV{F}}+\newcommand{\vG}{\VV{G}}+\newcommand{\vH}{\VV{H}}+\newcommand{\vI}{\VV{I}}+\newcommand{\vJ}{\VV{J}}+\newcommand{\vK}{\VV{K}}+\newcommand{\vL}{\VV{L}}+\newcommand{\vM}{\VV{M}}+\newcommand{\vN}{\VV{N}}+\newcommand{\vO}{\VV{O}}+\newcommand{\vP}{\VV{P}}+\newcommand{\vQ}{\VV{Q}}+\newcommand{\vR}{\VV{R}}+\newcommand{\vS}{\VV{S}}+\newcommand{\vT}{\VV{T}}+\newcommand{\vU}{\VV{U}}+\newcommand{\vV}{\VV{V}}+\newcommand{\vW}{\VV{W}}+\newcommand{\vX}{\VV{X}}+\newcommand{\vY}{\VV{Y}}+\newcommand{\vZ}{\VV{Z}}+\newcommand{\vas}{\VV{as}}+\newcommand{\vbs}{\VV{bs}}+\newcommand{\vcs}{\VV{cs}}+\newcommand{\vds}{\VV{ds}}+\newcommand{\ves}{\VV{es}}+\newcommand{\vfs}{\VV{fs}}+\newcommand{\vgs}{\VV{gs}}+\newcommand{\vhs}{\VV{hs}}+\newcommand{\vis}{\VV{is}}+\newcommand{\vjs}{\VV{js}}+\newcommand{\vks}{\VV{ks}}+\newcommand{\vls}{\VV{ls}}+\newcommand{\vms}{\VV{ms}}+\newcommand{\vns}{\VV{ns}}+\newcommand{\vos}{\VV{os}}+\newcommand{\vps}{\VV{ps}}+\newcommand{\vqs}{\VV{qs}}+\newcommand{\vrs}{\VV{rs}}+%\newcommand{\vss}{\VV{ss}}+\newcommand{\vts}{\VV{ts}}+\newcommand{\vus}{\VV{us}}+\newcommand{\vvs}{\VV{vs}}+\newcommand{\vws}{\VV{ws}}+\newcommand{\vxs}{\VV{xs}}+\newcommand{\vys}{\VV{ys}}+\newcommand{\vzs}{\VV{zs}}++%%% Telescope Identifiers++\newcommand{\ta}{\vec{\VV{a}}}+\newcommand{\tb}{\vec{\VV{b}}}+\newcommand{\tc}{\vec{\VV{c}}}+\newcommand{\td}{\vec{\VV{d}}}+\newcommand{\te}{\vec{\VV{e}}}+\newcommand{\tf}{\vec{\VV{f}}}+\newcommand{\tg}{\vec{\VV{g}}}+%\newcommand{\th}{\vec{\VV{h}}}+\newcommand{\ti}{\vec{\VV{i}}}+\newcommand{\tj}{\vec{\VV{j}}}+\newcommand{\tk}{\vec{\VV{k}}}+\newcommand{\tl}{\vec{\VV{l}}}+\newcommand{\tm}{\vec{\VV{m}}}+\newcommand{\tn}{\vec{\VV{n}}}+%\newcommand{\to}{\vec{\VV{o}}}+\newcommand{\tp}{\vec{\VV{p}}}+\newcommand{\tq}{\vec{\VV{q}}}+\newcommand{\tr}{\vec{\VV{r}}}+\newcommand{\tts}{\vec{\VV{s}}}+\newcommand{\ttt}{\vec{\VV{t}}}+\newcommand{\tu}{\vec{\VV{u}}}+%\newcommand{\tv}{\vec{\VV{v}}}+\newcommand{\tw}{\vec{\VV{w}}}+\newcommand{\tx}{\vec{\VV{x}}}+\newcommand{\ty}{\vec{\VV{y}}}+\newcommand{\tz}{\vec{\VV{z}}}+\newcommand{\tA}{\vec{\VV{A}}}+\newcommand{\tB}{\vec{\VV{B}}}+\newcommand{\tC}{\vec{\VV{C}}}+\newcommand{\tD}{\vec{\VV{D}}}+\newcommand{\tE}{\vec{\VV{E}}}+\newcommand{\tF}{\vec{\VV{F}}}+\newcommand{\tG}{\vec{\VV{G}}}+\newcommand{\tH}{\vec{\VV{H}}}+\newcommand{\tI}{\vec{\VV{I}}}+\newcommand{\tJ}{\vec{\VV{J}}}+\newcommand{\tK}{\vec{\VV{K}}}+\newcommand{\tL}{\vec{\VV{L}}}+\newcommand{\tM}{\vec{\VV{M}}}+\newcommand{\tN}{\vec{\VV{N}}}+\newcommand{\tO}{\vec{\VV{O}}}+\newcommand{\tP}{\vec{\VV{P}}}+\newcommand{\tQ}{\vec{\VV{Q}}}+\newcommand{\tR}{\vec{\VV{R}}}+\newcommand{\tS}{\vec{\VV{S}}}+\newcommand{\tT}{\vec{\VV{T}}}+\newcommand{\tU}{\vec{\VV{U}}}+\newcommand{\tV}{\vec{\VV{V}}}+\newcommand{\tW}{\vec{\VV{W}}}+\newcommand{\tX}{\vec{\VV{X}}}+\newcommand{\tY}{\vec{\VV{Y}}}+\newcommand{\tZ}{\vec{\VV{Z}}}++++%%% Nat++\newcommand{\NatPackage}{+  \newcommand{\Nat}{\TC{\mathbb{N}}}+  \newcommand{\Z}{\DC{0}}+  \newcommand{\suc}{\DC{s}}+  \newcommand{\NatDecl}{+    \Data \hg+    \Axiom{\Nat\Hab\Type} \hg+    \Where \hg+    \Axiom{\Z\Hab\Nat} \hg+    \Rule{\vn\Hab\Nat}+         {\suc\:\vn\Hab\Nat}+}}++%%% Bool++\newcommand{\BoolPackage}{+  \newcommand{\Bool}{\TC{Bool}}+  \newcommand{\true}{\DC{true}}+  \newcommand{\false}{\DC{false}}+  \newcommand{\BoolDecl}{+    \Data \hg+    \Axiom{\Bool\Hab\Type} \hg+    \Where \hg+    \Axiom{\true\Hab\Bool} \hg+    \Axiom{\false\Hab\Bool}+}}++%%% So++\newcommand{\SoPackage}{+  \newcommand{\So}{\TC{So}}+  \newcommand{\oh}{\DC{oh}}+  \newcommand{\SoDecl}{+    \Data \hg+    \Rule{\vb\Hab\Bool}+         {\So\:\vb\Hab\Type} \hg+    \Where \hg+    \Axiom{\oh\Hab\So\:\true}+}}++%%% Unit++\newcommand{\UnitPackage}{+  \newcommand{\Unit}{\TC{Unit}}+  \newcommand{\void}{\DC{void}}+  \newcommand{\UnitDecl}{+    \Data \hg+    \Axiom{\Unit\Hab\Type} \hg+    \Where \hg+    \Axiom{\void\Hab\Unit}+}}++%%% Maybe++\newcommand{\MaybePackage}{+  \newcommand{\Maybe}{\TC{Maybe}}+  \newcommand{\yes}{\DC{yes}}+  \newcommand{\no}{\DC{no}}+  \newcommand{\MaybeDecl}{+    \Data \hg+    \Rule{\vA\Hab\Type}+         {\Maybe\:\vA\Hab\Type} \hg+    \Where \hg+    \Rule{\va \Hab \vA}+         {\yes\:\va\Hab\Maybe\:\vA} \hg+    \Axiom{\no\Hab\Maybe\:\vA}+}}++%%% Cross++\newcommand{\pr}[2]{(#1\DC{,}#2)}  %grrrr+\newcommand{\CrossPackage}{+  \newcommand{\Cross}{\times}+  \newcommand{\CrossDecl}{+    \Data \hg+    \Rule{\vA,\vB\Hab\Type}+         {\vA\Cross\vB\Hab\Type} \hg+    \Where \hg+    \Rule{\va \Hab \vA \hg \vb\Hab\vB}+         {\pr{\va}{\vb}\Hab\vA\Cross\vB}+}}++%%% Fin++\newcommand{\FinPackage}{+  \newcommand{\Fin}{\TC{Fin}}+  \newcommand{\fz}{\DC{f0}}+  \newcommand{\fs}{\DC{fs}}+  \newcommand{\FinDecl}{+    \AR{+    \Data \hg+    \Rule{\vn\Hab\Nat}+         {\Fin\:\vn\Hab\Type} \hg \\+    \Where \hg+    \begin{array}[t]{c}+    \Axiom{\fz\Hab\Fin\:(\suc\:\vn)} \hg+    \Rule{\vi\Hab\Fin\:\vn}+         {\fs\:\vi\Hab\Fin\:(\suc\:\vn)}+    \end{array}+    }+}}++%%% Vect++\newcommand{\VectPackage}{+  \newcommand{\Vect}{\TC{Vect}}+  \newcommand{\vnil}{\varepsilon}+  \newcommand{\vcons}{\,\dcolon\,}+  \newcommand{\vsnoc}{\,\dcolon\,}+  \newcommand{\VectConsDecl}{+    \Data \hg+    \Rule{\vA \Hab \Type \hg \vn\Hab\Nat}+         {\Vect\:\vA\:\vn\Hab\Type} \hg+    \Where \hg \begin{array}[t]{c}+    \Axiom{\vnil \Hab \Vect\:\vA\:\Z} \\+    \Rule{\vx\Hab\vA \hg \vxs\Hab \Vect\:\vA\:\vn }+         {\vx\vcons\vxs\Hab\Vect\:\vA\:(\suc\vn)}+    \end{array}+}+  \newcommand{\VectSnocDecl}{+    \Data \hg+    \Rule{\vA \Hab \Type \hg \vn\Hab\Nat}+         {\Vect\:\vA\:\vn\Hab\Type} \hg+    \Where \hg \begin{array}[t]{c}+    \Axiom{\vnil \Hab \Vect\:\vA\:\Z} \\+    \Rule{\vxs\Hab \Vect\:\vA\:\vn \hg \vx\Hab\vA}+         {\vxs\vsnoc\vx\Hab\Vect\:\vA\:(\suc\vn)}+    \end{array}+}+}++%%% Compare++%Data Compare : (x:nat)(y:nat)Type+%  = lt : (x:nat)(y:nat)(Compare x (plus (S y) x))+%  | eq : (x:nat)(Compare x x)+%  | gt : (x:nat)(y:nat)(Compare (plus (S x) y) y);+++\newcommand{\ComparePackage}{+  \newcommand{\Compare}{\TC{Compare}}+  \newcommand{\ltComp}{\DC{lt}}+  \newcommand{\eqComp}{\DC{eq}}+  \newcommand{\gtComp}{\DC{gt}}+  \newcommand{\CompareDecl}{+    \Data \hg+    \Rule{\vm\Hab\Nat\hg\vn\Hab\Nat}+         {\Compare\:\vm\:\vn\Hab\Type} \\+    \Where \hg\begin{array}[t]{c}+    \Rule{\vx\Hab\Nat\hg\vy\Hab\Nat}+         {\ltComp_{\vx}\:\vy\Hab\Compare\:\vx\:(\FN{plus}\:\vx\:(\suc\:\vy))} \\+    \Rule{\vx\Hab\Nat}+         {\eqComp_{\vx}\Hab\Compare\:\vx\:\vx}\\+    \Rule{\vx\Hab\Nat\hg\vy\Hab\Nat}+         {\gtComp_{\vy}\:\vx\Hab\Compare\:(\FN{plus}\:\vy\:(\suc\:\vx))\:\vy} \\+    \end{array}	 +  }++%Data CompareM : Type+%  = ltM : (ydiff:nat)CompareM+%  | eqM : CompareM+%  | gtM : (xdiff:nat)CompareM;++  \newcommand{\CompareM}{\TC{Compare^-}}+  \newcommand{\ltCompM}{\DC{lt^-}}+  \newcommand{\eqCompM}{\DC{eq^-}}+  \newcommand{\gtCompM}{\DC{gt^-}}+  \newcommand{\CompareMDecl}{++     \Data \hg+     \Axiom{\CompareM\Hab\Type} \\+     \Where \hg\begin{array}[t]{c}+     \Rule{\vy\Hab\Nat}+          {\ltCompM\:\vy\Hab\CompareM} \\+     \Axiom{\eqCompM\Hab\CompareM}\\+     \Rule{\vx\Hab\Nat}+          {\gtCompM\:\vx\Hab\CompareM} \\+     \end{array}	+  }+  \newcommand{\CompareRec}{\FN{CompareRec}}+  \newcommand{\CompareRecM}{\FN{CompareRec^-}}++}
+ docs/local.ltx view
@@ -0,0 +1,1 @@+\newcommand{\prover}{\textsc{HumeTT}}
+ docs/macros.ltx view
@@ -0,0 +1,950 @@+%\usepackage{amstex}+\usepackage{amssymb}+\usepackage{latexsym}+\usepackage{eepic}+++%%%%%%%%% INFERENCE RULES++\newlength{\rulevgap}+\setlength{\rulevgap}{0.05in}+\newlength{\ruleheight}+\newlength{\ruledepth}+\newsavebox{\rulebox}+\newlength{\GapLength}+\newcommand{\gap}[1]{\settowidth{\GapLength}{#1} \hspace*{\GapLength}}+\newcommand{\dotstep}[2]{\begin{tabular}[b]{@{}c@{}}+                         #1\\$\vdots$\\#2+                         \end{tabular}}+\newlength{\fracwid}+\newcommand{\dotfrac}[2]{\settowidth{\fracwid}{$\frac{#1}{#2}$}+                         \addtolength{\fracwid}{0.1in}+                         \begin{tabular}[b]{@{}c@{}}+                         $#1$\\+                         \parbox[c][0.02in][t]{\fracwid}{\dotfill} \\+                         $#2$\\+                         \end{tabular}}+\newcommand{\Rule}[2]{\savebox{\rulebox}[\width][b]                         %+                              {\( \frac{\raisebox{0in} {\( #1 \)}}       %+                                       {\raisebox{-0.03in}{\( #2 \)}} \)}   %+                      \settoheight{\ruleheight}{\usebox{\rulebox}}          %+                      \addtolength{\ruleheight}{\rulevgap}                  %+                      \settodepth{\ruledepth}{\usebox{\rulebox}}            %+                      \addtolength{\ruledepth}{\rulevgap}                   %+                      \raisebox{0in}[\ruleheight][\ruledepth]               %+                               {\usebox{\rulebox}}}+\newcommand{\Case}[2]{\savebox{\rulebox}[\width][b]                         %+                              {\( \dotfrac{\raisebox{0in} {\( #1 \)}}       %+                                       {\raisebox{-0.03in}{\( #2 \)}} \)}   %+                      \settoheight{\ruleheight}{\usebox{\rulebox}}          %+                      \addtolength{\ruleheight}{\rulevgap}                  %+                      \settodepth{\ruledepth}{\usebox{\rulebox}}            %+                      \addtolength{\ruledepth}{\rulevgap}                   %+                      \raisebox{0in}[\ruleheight][\ruledepth]               %+                               {\usebox{\rulebox}}}+\newcommand{\Axiom}[1]{\savebox{\rulebox}[\width][b]                        %+                               {$\frac{}{\raisebox{-0.03in}{$#1$}}$}        %+                      \settoheight{\ruleheight}{\usebox{\rulebox}}          %+                      \addtolength{\ruleheight}{\rulevgap}                  %+                      \settodepth{\ruledepth}{\usebox{\rulebox}}            %+                      \addtolength{\ruledepth}{\rulevgap}                   %+                      \raisebox{0in}[\ruleheight][\ruledepth]               %+                               {\usebox{\rulebox}}}+\newcommand{\RuleSide}[3]{\gap{$#2$} \hspace*{0.1in}               %+                            \Rule{#1}{#3}                          %+                          \hspace*{0.1in}$#2$}+\newcommand{\AxiomSide}[2]{\gap{$#1$} \hspace*{0.1in}              %+                             \Axiom{#2}                            %+                           \hspace*{0.1in}$#1$}+\newcommand{\RULE}[1]{\textbf{#1}}+\newcommand{\hg}{\hspace{0.2in}}++\newcommand{\ProofState}+                      [2]{\parbox{10cm}{\AR{\hg\AR{#1}\\\Axiom{\hg#2\hg}}}}++%%%%%%%%%%%% TRISTUFF++\newcommand{\btr}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+\blacken\path(57,192)(57,12)(12,102)+	(57,192)(57,192)+\path(57,192)(57,12)(12,102)+	(57,192)(57,192)+\end{picture}+}++\newcommand{\btl}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+\blacken\path(12,192)(12,12)(57,102)+	(12,192)(12,192)+\path(12,192)(12,12)(57,102)+	(12,192)(12,192)+\end{picture}+}++\newcommand{\wtr}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+%\blacken\path(57,192)(57,12)(12,102)+%	(57,192)(57,192)+\path(57,192)(57,12)(12,102)+	(57,192)(57,192)+\end{picture}+}++\newcommand{\wtl}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+%\blacken\path(12,192)(12,12)(57,102)+%	(12,192)(12,192)+\path(12,192)(12,12)(57,102)+	(12,192)(12,192)+\end{picture}+}++++%%%%%%%%%%%% FONTS++\newcommand{\TC}[1]{\mathsf{#1}}+\newcommand{\DC}[1]{\mathsf{#1}}+\newcommand{\VV}[1]{\mathit{#1}}+\newcommand{\FN}[1]{\mathbf{#1}}+\newcommand{\HFN}[1]{\mathtt{#1}}+\newcommand{\RW}[1]{\underline{\textrm{#1}}}+\newcommand{\MO}[1]{\mbox{\textsc{#1}}}++\newcommand{\HF}[1]{\mathtt{#1}}++\newcommand{\MV}[1]{\nhole\mathit{#1}}+\newcommand{\Lang}[1]{\mathsf{#1}}+\newcommand{\Name}[1]{\mathit{#1}}++\newcommand{\demph}[1]{\textbf{#1}}+\newcommand{\remph}[1]{\emph{#1}}++%%%% Keywords for meta operations+\newcommand{\IF}{\;\RW{if}\;\;}+\newcommand{\THEN}{\RW{then}}+\newcommand{\ELSE}{\RW{else}}+\newcommand{\AND}{\RW{and}}+\newcommand{\Otherwise}{\RW{otherwise}}+\newcommand{\Do}{\RW{do}}+\newcommand{\Return}{\RW{return}}++\newcommand{\CASE}{\RW{case}}+\newcommand{\LET}{\RW{let}}+\newcommand{\IN}{\RW{in}}+\newcommand{\of}{\RW{of}}++\newcommand{\CLASS}{\mathtt{class}}+\newcommand{\INSTANCE}{\mathtt{instance}}++%%%%%%%%%%%% GROUPING++\newcommand{\G}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(2,10)(2,-10)+\end{picture}+}++\newcommand{\E}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(2,10)(2,-2)(4,-2)+\end{picture}+}++%\newcommand{\C}{+%\setlength{\unitlength}{1pt}+%\begin{picture}(4,10)(0,0)+%\path(4,8)(2,8)(2,-2)(4,-2)+%\end{picture}+%}++\newcommand{\M}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(2,10)(2,-2)(6,-2)+\end{picture}+}++\newcommand{\F}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(4,8)(2,8)(2,-6)+\end{picture}+}++\newcommand{\K}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(0,8)(4,8)+\end{picture}+}++\newcommand{\J}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(0,-2)(4,-2)+\end{picture}+}++\newcommand{\W}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\end{picture}+}++++%%%%%%%%%%%% GUBBINS++\newcommand{\mathskip}{\medskip}++\newcommand{\fbx}[1]{\fbox{$#1$}}+\newcommand{\stk}[1]{\begin{array}{c}#1\end{array}}+%\newcommand{\DM}[1]{\hg\mbox{$#1$}}+\newcommand{\DM}[1]{\mathskip\par\(#1\)\mathskip}+\newcommand{\mbx}[1]{\mathskip\par\noindent\(#1\)\mathskip}+\newcommand{\AR}[1]{\begin{array}[t]{@{}l}#1\end{array}}+\newcommand{\ARt}[1]{\begin{array}[t]{@{}l@{}cl}#1\end{array}}+\newcommand{\ARc}[1]{\begin{array}{@{}l}#1\end{array}}+\newcommand{\EA}[1]{\begin{array}[t]{r@{}c@{}l}#1\end{array}}+\newcommand{\A}{@{\:}c}+%\newcommand{\R}{@{\:}r}+\newcommand{\CA}{c}+\newcommand{\LA}{l}+\newcommand{\PAc}[2]{\begin{array}{l#1@{}r@{}l}#2\end{array}}+\newcommand{\PA}[2]{\begin{array}[t]{l@{\:}l#1@{}r@{\:}l}#2\end{array}}+\newcommand{\DTREE}[3]{\begin{array}[t]{l#1@{}r@{\:}l#2}#3\end{array}}+\newcommand{\IDTREE}[2]{%+  \begin{array}[t]{l@{\:}c@{\:}l@{\:}r@{\:}l#1}#2\end{array}}+\newcommand{\IA}[2]+   {\begin{array}[t]{l@{\:}r@{\:}c@{\:}l@{\:}#1@{\:}r@{\:}l}#2\end{array}}+\newcommand{\IAc}[2]+   {\begin{array}[c]{r@{\:}c@{\:}l@{\:}#1@{}r@{}l}#2\end{array}}+\newcommand{\CS}[1]{\left\lfloor\begin{array}{@{}l}#1\end{array}\right.}+\newcommand{\BY}[3]{\multicolumn{2}{l}{\;\RW{by}\; #1} \\ %+    \multicolumn{#2}{l}{\CS{#3}} }+\newcommand{\WITH}[3]{\multicolumn{2}{l}{\;\RW{with}\; #1} \\ %+    \multicolumn{#2}{l}{\CS{#3}} }+\newcommand{\WithBy}{\RW{with-by}}+\newcommand{\Wb}[1]{\WithBy& #1}+\newcommand{\By}[1]{\multicolumn{2}{l}{\Leftarrow #1}}+\newcommand{\andby}{\Leftarrow}+\newcommand{\MyWith}[1]{\multicolumn{2}{l}{|\;#1}}+\newcommand{\Byr}[1]{\;\RW{by}\; #1}++\newcommand{\Bar}{|}+\newcommand{\Bart}{\settowidth{\GapLength}{$\Bar$}%+                   \raisebox{6pt}[0pt][0pt]{$\Bar$}%+                   \hspace*{-1\GapLength}%+                   \Bar}+\newcommand{\With}[1]{\Bar & #1}+\newcommand{\Witt}[1]{\Bart & #1}++\newcommand{\B}{@{\:}r@{\:}c}+\newcommand{\Ret}[1]{\multicolumn{2}{l}{\cq #1}}+\newcommand{\MRet}[2]{\multicolumn{#1}{l}{\cq #2}}+\newcommand{\HRet}[1]{\multicolumn{2}{l}{\hq #1}}+\newcommand{\MHRet}[2]{\multicolumn{#1}{l}{\hq #2}}+\newcommand{\IRet}[1]{\multicolumn{2}{l}{\iq #1}}+\newcommand{\IMRet}[2]{\multicolumn{#1}{l}{\iq #2}}+\newcommand{\MoRet}[1]{\multicolumn{2}{l}{\mq #1}}+\newcommand{\MMoRet}[2]{\multicolumn{#1}{l}{\mq #2}}+\newcommand{\Data}{\RW{data}}+\newcommand{\Where}{\RW{where}}+\newcommand{\Let}{\RW{let}}+\newcommand{\Fact}{\RW{fact}}+\newcommand{\Rec}[1]{#1\textbf{-Rec}}+\newcommand{\Memo}[1]{#1\textbf{-Memo}}+\newcommand{\Elim}[1]{#1\textbf{-Elim}}+\newcommand{\Cases}[1]{#1\textbf{-Case}}+\newcommand{\View}[1]{#1\textbf{-View}}+\newcommand{\As}[2]{#1 \:\RW{as}\: #2}+\newcommand{\nhole}{\Box}+\newcommand{\turq}{\:\vdash_?\:}+\newcommand{\split}{\;\lhd\;}+\newcommand{\CType}[2]{\{#1 \split\; #2\}}+\newcommand{\CC}[2]{(#1)\:#2}+\newcommand{\UP}[2]{#1 | \{#2\}}+\newcommand{\Ured}{\:\Downarrow\:}+\newcommand{\gdd}{\prec}+\newcommand{\HC}[1]{\left<#1\right>}+\newcommand{\HT}[2]{\left<#1 \hab #2\right>}++\newcommand{\view}{\RW{view}}+\newcommand{\ecase}{\RW{case}}+\newcommand{\rec}{\RW{rec}}++\newcommand{\If}{\mathsf{if}}+\newcommand{\Then}{\mathsf{then}}+\newcommand{\Else}{\mathsf{else}}+\newcommand{\elim}{\RW{elim}}++\newcommand{\Payload}{\mathsf{type}}+\newcommand{\Any}{\mathsf{Some}}++\newcommand{\lbl}[2]{\langle #1 \Hab #2 \rangle}+\newcommand{\call}[2]{\RW{call}\:\langle#1\rangle\:#2}+\newcommand{\return}[1]{\RW{return}\:#1}++\newcommand{\Remark}[1]{\noindent\textbf{Remark:} #1}++\newcommand{\DBOX}[2]{\fbox{\parbox{#1}{\textbf{Definition:}#2}}}++\newcommand{\FIG}[3]{\begin{figure}[h]\DM{#1}\caption{#2}\label{#3}\end{figure}}+\newcommand{\FFIG}[3]{\begin{figure}[h]\begin{center}\DM{#1}\end{center}\caption{#2}\label{#3}\end{figure}}+\newcommand{\FFIGTC}[3]{\begin{figure*}[t]\begin{center}\DM{#1}\end{center}\caption{#2}\label{#3}\end{figure*}}+\newcommand{\VFIG}[3]{\begin{figure}[h]\begin{boxedverbatim}#1\end{boxedverbatim}\caption{#2}\label{#3}\end{figure}}+\newcommand{\PFIG}[3]{\begin{figure}[p]\begin{center}\fbox{\DM{#1}}\end{center}\caption{#2}\label{#3}\end{figure}}+\newcommand{\CFIG}[3]{\begin{figure}[h]\begin{center}\DM{#1}\end{center}\caption{#2}\label{#3}\end{figure}}++\newcommand{\TFIG}[4]{\begin{figure}[h]\begin{center}\begin{tabular}{#1}#2\end{tabular}\end{center}\caption{#3}\label{#4}\end{figure}}+\newcommand{\TFIGTC}[4]{\begin{figure*}[t]\begin{center}\begin{tabular}{#1}#2\end{tabular}\end{center}\caption{#3}\label{#4}\end{figure*}}++\newcommand{\RESFIG}[3]{+\TFIG{|l|c|c|c|c|c|c|c|c|}{+\hline+    & \multicolumn{4}{c|}{\Naive{} compilation} &+          \multicolumn{4}{|c|}{Optimised compilation} \\+\cline{2-9}+\raisebox{1.5ex}[0pt]{Program} & Instrs & Thunks & Cells &+Accesses & Instructions & Thunks & Cells & Accesses \\+%\raisebox{1.5ex}[0pt]{Program} & I & T & C & M & I & T & C & M \\+\hline+#1+\hline+}{#2}{#3}}++\newcommand{\NEWRESFIG}[3]{+\TFIG{|l|l|c|c|c|c|}{+\hline+%    & \multicolumn{4}{c|}{\Naive{} compilation} &+%          \multicolumn{4}{|c|}{Optimised compilation} \\+%\cline{2-9}+Program & Version & Instructions & Thunks & Memory Accesses & Cells \\+%\raisebox{1.5ex}[0pt]{Program} & I & T & C & M & I & T & C & M \\+\hline+#1+}{#2}{#3}}++\newcommand{\NEWRESFIGTC}[3]{+\TFIGTC{|l|l|c|c|c|c|}{+\hline+%    & \multicolumn{4}{c|}{\Naive{} compilation} &+%          \multicolumn{4}{|c|}{Optimised compilation} \\+%\cline{2-9}+Program & Version & Instructions & Thunks & Memory Accesses & Cells \\+%\raisebox{1.5ex}[0pt]{Program} & I & T & C & M & I & T & C & M \\+\hline+#1+}{#2}{#3}}++\newcommand{\RESLINE}[9]{+& \Naive{} & #2 & #3 & #5 & #4 \\+#1+& Optimised & #6 & #7 & #9 & #8 \\+}+\newcommand{\RESCHANGE}[4]{+& Change & \textbf{#1} & \textbf{#2} & \textbf{#4} & \textbf{#3} \\+\hline+}+\newcommand{\RESCHANGEa}[5]{+#5 & Change & \textbf{#1} & \textbf{#2} & \textbf{#4} & \textbf{#3} \\+\hline+}++%%%%%%%%%%%% PUNCTUATION++\newcommand{\pad}[2]{#1#2#1}++\newcommand{\hab}{\pad{\,}{:}}+\newcommand{\Hab}{\pad{\;}{:}}+\newcommand{\HHab}{\pad{\;}{::}}++%%%%%%%%%%%% TYPE++\newcommand{\Type}{\star}+++%%%%%%%%%%%%% ARROWS++\newcommand{\To}{\pad{\:}{\rightarrow}}+%\newcommand{\car}{\vartriangleright}++%%%%%%%%%%%%% QUANTIFIERS++\newcommand{\lam}[2]{\lambda#1\pad{\!}{:}#2}+\newcommand{\all}[2]{\forall#1\pad{\!}{:}#2}+\newcommand{\remlam}[2]{\lambda\{#1\pad{\!}{:}#2\}}+\newcommand{\remall}[2]{\forall\{#1\pad{\!}{:}#2\}}+\newcommand{\allpi}[2]{\Pi#1\pad{\!}{:}#2}+\newcommand{\ali}[2]{\forall#1|#2}+\newcommand{\exi}[2]{\exists#1\pad{\!}{:}#2}+\newcommand{\wit}[2]{\ang{#1,#2}}+\newcommand{\X}{\times}+\newcommand{\sig}[2]{\Sigma#1\pad{\!}{:}#2}++\newcommand{\SC}{.\:}++\newcommand{\letbind}[3]{\mathsf{let}\:#1{:}#2\:=\:#3\:\mathsf{in}}+\newcommand{\ifthen}[3]{\mathsf{if}\:#1\:\mathsf{then}\:#2\:\mathsf{else}\:#3}++%%%%%%%%%%%%% EQUALITIES++\newcommand{\cq}{\pad{\:}{\mapsto}}+\newcommand{\xq}{\pad{}{\doteq}}+\newcommand{\pq}{\pad{\:}{=}}+\newcommand{\dq}{\pad{\:}{:=}}+\newcommand{\iq}{\pad{\:}{\leadsto}}+\newcommand{\mq}{\Longrightarrow}+\newcommand{\retq}{\Rightarrow}+\newcommand{\hq}{\pad{\:}{=}}+\newcommand{\defq}{\mapsto}++\newcommand{\refl}{\TC{refl}}+++++%%%%%%%%%%%%% CATSTUFF++\newlength{\Lwibrs}+\newlength{\Lwobrs}+\newsavebox{\Bwibrs}+\newsavebox{\Bwobrs}+\newcommand{\Db}[5]{%+  \savebox{\Bwobrs}[\width][b]{$#5$}%+  \savebox{\Bwibrs}[\width][b]{$\left#2\usebox{\Bwobrs}\right#3$}%+  \settowidth{\Lwobrs}{\usebox{\Bwobrs}}%+  \settowidth{\Lwibrs}{\usebox{\Bwibrs}}%+  \addtolength{\Lwibrs}{-\Lwobrs}%+  \left#1\pad{\hspace*{-0.25\Lwibrs}}{\usebox{\Bwibrs}}\right#4}+\newcommand{\LDb}[3]{%+  \savebox{\Bwobrs}[\width][b]{$#3$}%+  \savebox{\Bwibrs}[\width][b]{$\left#2\usebox{\Bwobrs}\right.$}%+  \settowidth{\Lwobrs}{\usebox{\Bwobrs}}%+  \settowidth{\Lwibrs}{\usebox{\Bwibrs}}%+  \addtolength{\Lwibrs}{-\Lwobrs}%+  \left#1\hspace*{-0.4\Lwibrs}\usebox{\Bwibrs}\right.}+\newcommand{\RDb}[3]{%+  \savebox{\Bwobrs}[\width][b]{$#3$}%+  \savebox{\Bwibrs}[\width][b]{$\left.\usebox{\Bwobrs}\right#1$}%+  \settowidth{\Lwobrs}{\usebox{\Bwobrs}}%+  \settowidth{\Lwibrs}{\usebox{\Bwibrs}}%+  \addtolength{\Lwibrs}{-\Lwobrs}%+  \left.\usebox{\Bwibrs}\hspace*{-0.4\Lwibrs}\right#2}+\newcommand{\Sc}{\Db{[}{[}{]}{]}}+\newcommand{\Mo}{\Db{|}{>}{<}{|}}+\newcommand{\MoL}{\LDb{|}{>}}+\newcommand{\MoR}{\RDb{<}{|}}++\newcommand{\car}{\mbox{$-\!\triangleright$}}+\newcommand{\io}[1]{\iota_{#1}}+\newcommand{\cc}{\diamond}+++%%%%%%%%%%%%% FNS++\newcommand{\Wk}{\Uparrow}++%%%%%%%%%%%%% Transformation++\newcommand{\Transform}[3]{\textsc{Trans}\:_{\Name{#1}}+   \interp{#2}\:\mq\:#3}+%\:[\:#2\:\Longrightarrow\:#3\:]}+\newcommand{\Morphism}[2]{\textsc{Morphism}\:#1\:\Longrightarrow\:#2}+\newcommand{\MI}[1]{\begin{array}{ll} #1 \end{array}\\}+\newcommand{\MorphItem}[2]{& #1 \:\Longrightarrow\: #2}++%%%%%%%%%%%%% Stuff++% Motive and methods++\newcommand{\motive}{\vP}+\newcommand{\meth}[1]{\vm_{#1}}++% Tuples+\newcommand{\tuple}[1]{\langle#1\rangle}+\newcommand{\Tuple}[1]{\mathsf{Tuple}}+\newcommand{\proj}{\mathsf{proj}}+\newcommand{\app}{\mathrm{+\!+}}++% Commenting out+\newcommand{\ig}[1]{[#1]}+\newcommand{\rem}[1]{\{\!#1\!\}}+\newcommand{\igc}[1]{[#1]}+\newcommand{\remc}[1]{\{\!#1\!\}}+++\newcommand{\ind}{\hspace*{0.1cm}}++% Content free type+\newcommand{\CF}{\TC{CF}}+\newcommand{\cf}{\DC{cf}}++% Error token+\newcommand{\error}{\DC{error}}+\newcommand{\fail}{\perp}++% Constructor stripping+\newcommand{\conarg}[2]{#1!#2}++\newcommand{\Vect}{\TC{Vect}}+\newcommand{\VectM}{\TC{Vect^-}}+\newcommand{\Vnil}{\DC{\epsilon}}+\newcommand{\Vcons}{\DC{::}}++\newcommand{\Vsnoc}{\DC{::}}++\newcommand{\VnilM}{\DC{\epsilon^-}}+\newcommand{\VconsM}{\DC{::^-}}++\newcommand{\Vnilcase}{\VV{vNilCase}}+\newcommand{\Vconscase}{\VV{vConsCase}}++\newcommand{\DSigma}{\TC{Sigma}}+\newcommand{\Exists}{\DC{Exists}}++\newcommand{\ListPair}[2]{\sig{#1}{\List\:\vA}.#2 = \FN{length}\:#1}+\newcommand{\lpNilDef}{\lpNil{\FN{refl}\:\Z}}+\newcommand{\lpNil}[1]{(\nil\:\vA,#1)}+\newcommand{\lpConsDef}[3]{\lpCons{#1}{(\FN{fst\:#2})}{\FN{resp}\:(\FN{snd}\:#2)}}+\newcommand{\lpCons}[3]{(\cons\:#1\:#2,#3)}+\newcommand{\lp}[2]{(#1, #2)}++\newcommand{\VnilTop}{\DC{vNil}^\ast}+\newcommand{\VconsTop}{\DC{vCons}^\ast}++\newcommand{\VnilBot}{\DC{\epsilon}^-}+\newcommand{\VconsBot}{\DC{::}^-}++\newcommand{\VectTop}{\TC{Vect}^\ast}+\newcommand{\VectBot}{\TC{Vect}^-}++\newcommand{\VectDrop}{\FN{vectDropIdx}}+\newcommand{\VectRebuild}{\FN{vectRebuild}}++\newcommand{\Prop}{\TC{Prop}}+\newcommand{\Set}{\TC{Set}}+\newcommand{\CoqType}{\TC{Type}}++\newcommand{\List}{\TC{List}}+\newcommand{\nil}{\DC{nil}}+\newcommand{\cons}{\DC{cons}}++\newcommand{\Zip}{\TC{Tsil}}+\newcommand{\zip}{\FN{tsil}}+\newcommand{\zipcons}{\FN{tsilcons}}+\newcommand{\snoc}{\DC{Snoc}}+\newcommand{\lin}{\DC{Empty}}++\newcommand{\BigInt}{\TC{BigInt}}+\newcommand{\False}{\TC{False}}+\newcommand{\Unit}{\TC{True}}+\newcommand{\UnitI}{\DC{()}}++\newcommand{\genType}{\TC{X}}+\newcommand{\genIndicesDec}{\tb\Hab\tB}+\newcommand{\genIndices}{\tb}+\newcommand{\genConArgsDec}[1]{\vec{\VV{a_#1}}\Hab\vec{\VV{A_#1}}}+\newcommand{\genConArgs}[1]{\vec{\VV{a_#1}}}+\newcommand{\genConIndicesDec}[1]{\vec{\VV{b_#1}}\Hab\vec{\VV{B_#1}}}+\newcommand{\genConIndices}[1]{\vec{\VV{b_#1}}}+\newcommand{\genCon}[1]{\DC{x}_#1}++\newcommand{\genTypeTop}{\TC{X^\ast}}+\newcommand{\genTypeBot}{\TC{X^-}}++\newcommand{\genTypeDrop}{\FN{XDropIdx}}+\newcommand{\genTypeRebuild}{\FN{XRebuild}}++\newcommand{\HTerm}{\texttt{Term}}+\newcommand{\Term}{\TC{Term}}+\newcommand{\Var}{\DC{var}}+\newcommand{\Lam}{\DC{lam}}+\newcommand{\App}{\DC{app}}+\newcommand{\TermM}{\TC{Term^-}}+\newcommand{\VarM}{\DC{var^-}}+\newcommand{\LamM}{\DC{lam^-}}+\newcommand{\AppM}{\DC{app^-}}+\newcommand{\Env}{\TC{Env}}+\newcommand{\SType}{\TC{STy}}+\newcommand{\farrow}{\Rightarrow}+\newcommand{\lookup}{\FN{lookup}}++\newcommand{\source}{\Lang{TT}}+\newcommand{\target}{\Lang{ExTT}}+\newcommand{\runtime}{\Lang{RunTT}}++\newcommand{\lt}{\TC{<}}+\newcommand{\ltO}{\DC{ltO}}+\newcommand{\ltS}{\DC{ltS}}++\newcommand{\interp}[1]{\llbracket #1 \rrbracket}+\newcommand{\inferrable}[2]{\FN{inferrable}(#1,#2)}+\newcommand{\mkPat}{\FN{mkPat}}++\newcommand{\FinM}{\TC{Fin^-}}+\newcommand{\fzM}{\DC{f0^-}}+\newcommand{\fsM}{\DC{fs^-}}++\newcommand{\concat}{\mathrm{++}}++%\newcommand{\bottom}{\perp}++% Reductions++\newcommand{\reduces}{\rhd}+\newcommand{\translation}{\Rightarrow}+%\newcommand{\reducesn}[1]{\reduces\hspace*{-0.15cm}_{#1}}+%\newcommand{\reducesto}{\reduces\hspace*{-0.15cm}^{*}}+\newcommand{\reducesn}[1]{\reduces_{#1}}+\newcommand{\reducesto}{\reduces^{*}}++% Equality++\newcommand{\Refl}{\DC{refl}}+\newcommand{\leZ}{\DC{O_{\le}}}+\newcommand{\leS}{\DC{S_{\le}}}++% Random elimination things++\newcommand{\lte}{\TC{\leq}}+\newcommand{\lten}{\DC{leN}}+\newcommand{\lteO}{\DC{leO}}+\newcommand{\lteS}{\DC{leS}}++\newcommand{\ltelim}{\Elim{\lt}}+\newcommand{\leelim}{\Elim{\lte}}++\newcommand{\dD}{\TC{D}}+\newcommand{\delim}{\Elim{\TC{D}}}+\newcommand{\drec}{\Rec{\TC{D}}}+\newcommand{\dcase}{\Cases{\TC{D}}}+\newcommand{\dview}{\View{\TC{D}}}+\newcommand{\dmemo}{\Memo{\TC{D}}}+\newcommand{\natrec}{\Rec{\Nat}}+\newcommand{\natmemo}{\Memo{\Nat}}+\newcommand{\natmemogen}{\Nat\textbf{-MemoGen}}+\newcommand{\natelim}{\Elim{\Nat}}+\newcommand{\boolcase}{\Cases{\Bool}}+\newcommand{\vectrec}{\Rec{\Vect}}+\newcommand{\vectelim}{\Elim{\Vect}}+\newcommand{\listrec}{\Rec{\List}}+\newcommand{\listelim}{\Elim{\List}}+\newcommand{\finrec}{\Rec{\Fin}}+\newcommand{\finelim}{\Elim{\Fin}}+\newcommand{\natcase}{\Cases{\Nat}}+\newcommand{\vectcase}{\Cases{\Vect}}+\newcommand{\natdoublerec}{\Nat\textbf{-double-elim}}+\newcommand{\eqelim}{=\textbf{-elim}}+\newcommand{\falsecase}{\Cases{\False}}++% Code+\newcommand{\Haskell}[1]{\begin{quotation}\begin{verbatim}#1\end{verbatim}\end{quotation}}++% Quicksort++\newcommand{\QSView}{\TC{QuickSort}}+\newcommand{\qsempty}{\DC{empty}}+\newcommand{\partition}{\DC{partition}}+\newcommand{\qsview}{\FN{mkQuickSort}}++% More gubbins++\newcommand{\converts}{\simeq}+\newcommand{\cumul}{\preceq}+\newcommand{\whnf}{\Downarrow}+\newcommand{\elem}{\in}+\newcommand{\proves}{\vdash}+\newcommand{\biimplies}{\Longleftrightarrow}++\newcommand{\lc}{\lambda_{\mathsf{AC}}}+\newcommand{\zed}{\mathbb{Z}}++% Haskell keywords++\newcommand{\hdata}{\mathtt{data}}+\newcommand{\newtype}{\mathtt{newtype}}+%\newcommand{\htype}{\mathtt{type}}++\newcommand{\HTC}[1]{\mathtt{#1}}+\newcommand{\HDC}[1]{\mathtt{#1}}++% Nobby++\newcommand{\Value}{\HTC{Value}}+\newcommand{\VGamma}{\HTC{Env}}+\newcommand{\Ctxt}{\HTC{Ctxt}}+\newcommand{\Defs}{\HTC{Defs}}+\newcommand{\ECtxt}{\HTC{ECtxt}}+\newcommand{\TCtxt}{\HTC{TCtxt}}+\newcommand{\VG}{\HDC{Env}}+\newcommand{\Model}{\HTC{Model}}+\newcommand{\Const}{\HTC{Const}}+\newcommand{\Normal}{\HTC{Normal}}+\newcommand{\Scope}{\HTC{Scope}}+\newcommand{\Kripke}{\HTC{Kripke}}+\newcommand{\Weakening}{\HTC{Weakening}}+\newcommand{\Ready}{\HTC{Ready}}+\newcommand{\Blocked}{\HTC{Blocked}}+\newcommand{\Spine}{\HTC{Spine}}++\newcommand{\BV}{\HDC{BV}}+\newcommand{\BCon}{\HDC{BCon}}+\newcommand{\BTyCon}{\HDC{BTyCon}}+\newcommand{\RCon}{\HDC{RCon}}+\newcommand{\RTyCon}{\HDC{RTyCon}}+\newcommand{\BElim}{\HDC{BElim}}+\newcommand{\DV}{\HDC{V}}+\newcommand{\DP}{\HDC{P}}++\newcommand{\MR}{\HDC{R}}+\newcommand{\MB}{\HDC{B}}+\newcommand{\DSc}{\HDC{Sc}}+\newcommand{\DKr}{\HDC{Kr}}+\newcommand{\DWk}{\HDC{Wk}}+\newcommand{\DSnoc}{\HDC{;}}+\newcommand{\DType}{\HDC{Type}}+\newcommand{\DName}{\HDC{Name}}+\newcommand{\DInt}{\HDC{Int}}+\newcommand{\DString}{\HDC{String}}+\newcommand{\DElim}{\HDC{Elim}}+\newcommand{\Empty}{\HDC{\emptyset}}++\newcommand{\ConCode}{\HTC{ConCode}}+\newcommand{\ElimRule}{\HTC{ElimRule}}++\newcommand{\DConst}{\HDC{Const}}+\newcommand{\DCon}{\HDC{Con}}+\newcommand{\DTyCon}{\HDC{TyCon}}+\newcommand{\RConst}{\HDC{RConst}}+\newcommand{\RLam}{\HDC{RLam}}+\newcommand{\RPi}{\HDC{RPi}}+\newcommand{\DLam}{\HDC{Lam}}+\newcommand{\DLet}{\HDC{Let}}+\newcommand{\DPi}{\HDC{Pi}}+\newcommand{\DApp}{\HDC{App}}++\newcommand{\TMaybe}{\HTC{Maybe}}+\newcommand{\DNothing}{\HDC{Nothing}}+\newcommand{\DJust}{\HDC{Just}}+++% G-machine and heap++\newcommand{\PUSH}{\mathsf{PUSH}}+\newcommand{\PUSHNAME}{\mathsf{PUSHNAME}}+\newcommand{\POP}{\mathsf{DISCARD}}+\newcommand{\PUSHFUN}{\mathsf{PUSHFUN}}+\newcommand{\APPLY}{\mathsf{MKAP}}+\newcommand{\EVAL}{\mathsf{EVAL}}+\newcommand{\GCON}{\mathsf{MKCON}}+\newcommand{\GTUP}{\mathsf{MKTUP}}+\newcommand{\GTYPE}{\mathsf{MKTYPE}}+\newcommand{\UPDATE}{\mathsf{UPDATE}}+\newcommand{\RET}{\mathsf{RET}}+\newcommand{\UNWIND}{\mathsf{UNWIND}}+\newcommand{\CASEJUMP}{\mathsf{CASEJUMP}}+\newcommand{\LABEL}{\mathsf{LABEL}}+\newcommand{\MOVE}{\mathsf{MOVE}}+\newcommand{\JUMP}{\mathsf{JUMP}}+\newcommand{\SPLIT}{\mathsf{SPLIT}}+\newcommand{\SQUEEZE}{\mathsf{SQUEEZE}}+\newcommand{\JFUN}{\mathsf{JFUN}}+\newcommand{\PROJ}{\mathsf{PROJ}}+\newcommand{\ERROR}{\mathsf{ERROR}}+\newcommand{\SLIDE}{\mathsf{SLIDE}}+\newcommand{\ALLOC}{\mathsf{ALLOC}}++\newcommand{\PUSHBIG}{\mathsf{PUSHBIG}}+\newcommand{\PUSHBASIC}{\mathsf{PUSHBASIC}}+\newcommand{\PUSHINT}{\mathsf{PUSHINT}}+\newcommand{\PUSHBOOL}{\mathsf{PUSHBOOL}}+\newcommand{\GET}{\mathsf{GET}}+\newcommand{\MKINT}{\mathsf{MKINT}}+\newcommand{\MKBOOL}{\mathsf{MKBOOL}}+\newcommand{\ADD}{\mathsf{ADD}}+\newcommand{\SUB}{\mathsf{SUB}}+\newcommand{\MULT}{\mathsf{MULT}}+\newcommand{\LT}{\mathsf{LT}}+\newcommand{\EQ}{\mathsf{EQ}}+\newcommand{\GT}{\mathsf{GT}}+\newcommand{\JTRUE}{\mathsf{JTRUE}}++\newcommand{\APP}{\mathsf{APP}}+\newcommand{\FUN}{\mathsf{FUN}}+\newcommand{\CON}{\mathsf{CON}}+\newcommand{\TYCON}{\mathsf{TYCON}}+\newcommand{\TUP}{\mathsf{TUP}}+\newcommand{\TYPE}{\mathsf{TYPE}}+\newcommand{\INT}{\mathsf{INT}}+\newcommand{\BIGINT}{\mathsf{BIGINT}}+\newcommand{\BOOL}{\mathsf{BOOL}}+\newcommand{\HOLE}{\mathsf{HOLE}}++% G machine translation scheme++\newcommand{\sinterp}[1]{\mathcal{S}\interp{#1}}+\newcommand{\sinterpm}[1]{\mathcal{S}\AR{\interp{#1}}}+\newcommand{\einterp}[3]{\mathcal{E}\interp{#1}\:#2\:#3}+\newcommand{\cinterp}[3]{\mathcal{C}\interp{#1}\:#2\:#3}+\newcommand{\binterp}[3]{\mathcal{B}\interp{#1}\:#2\:#3}+\newcommand{\rinterp}[3]{\mathcal{R}\interp{#1}\:#2\:#3}+\newcommand{\iinterp}[3]{\mathcal{I}\interp{#1}\:#2\:#3}+\newcommand{\len}[1]{\MO{length}(#1)}++\newcommand{\casecomp}[2]{\mathcal{I}(#1,\left\{\ARc{#2}\right\})}+\newcommand{\casecompA}[3]{\mathcal{I}(#1,\left\{\ARc{#2}\right\}[#3])}+\newcommand{\ischeme}{\mathcal{I}}++% tail call markup++\newcommand{\tailcall}{\mathsf{tail}}++% Trees++\newcommand{\Tree}{\TC{Tree}}+\newcommand{\Leaf}{\DC{Leaf}}+\newcommand{\Node}{\DC{Node}}+\newcommand{\treecase}{\Cases{\Tree}}++% Languages++\newcommand{\Coq}{\textsc{Coq}}+\newcommand{\Lego}{\textsc{Lego}}+\newcommand{\Oleg}{\textsc{Oleg}}+\newcommand{\Alf}{\textsc{Alf}}+\newcommand{\Epigram}{\textsc{Epigram}}+\newcommand{\SystemF}{System $\mathcal{F}$}+\newcommand{\Iswim}{\textsc{Iswim}}+\newcommand{\Cynthia}{\textit{C$^Y$\hspace*{-0.1cm}NTHIA}}++% Accessibility++\newcommand{\Acc}{\TC{Acc}}+\newcommand{\acc}{\DC{acc}}+\newcommand{\qsAcc}{\TC{qsAcc}}+\newcommand{\qsNil}{\DC{qsNil}}+\newcommand{\qsCons}{\DC{qsCons}}+\newcommand{\allQsAcc}{\FN{allQsAcc}}++% Lazy shortcuts++\newcommand{\naive}{na\"{\i}ve}+\newcommand{\Naive}{Na\"{\i}ve}++% Conor's bits++\newcommand{\remem}[1]{\left|#1\right|}+\newcommand{\idsb}{\MO{id}}+\newcommand{\ang}[1]{\langle#1\rangle}++\newcommand{\vePm}[1]{\vP #1 \vm_{\Vnil} #1 \vm_{\Vcons}}%+\newcommand{\vcrhs}{\vm_{\Vcons}\:\vk\:\va\:\vv\:%+                     (\vectelim\:\vA\:\vk\:\vv\:\vePm{\:})}%++\newcommand{\igV}[2]{#1^{\ig{#2}}}+\newcommand{\remV}[2]{#1^{\rem{#2}}}++\newcommand{\FIXME}[1]{[\textbf{FIXME}: #1]}+%\newcommand{\FIXME}[1]{\wibble}++% More gubbins++\newcommand{\Between}{\TC{between}}+\newcommand{\bZ}{\DC{bO}}+\newcommand{\bZZS}{\DC{bOOs}}+\newcommand{\bZSS}{\DC{b0ss}}+\newcommand{\bSSS}{\DC{bsss}}+\newcommand{\betelim}{\Elim{\Between}}+\newcommand{\betrhs}[1]{\motive#1\meth{\bZ}#1\meth{\bZZS}#1\meth{\bZSS}#1\meth{\bSSS}}+++\newcommand{\valenv}{\TC{ValEnv}}+\newcommand{\vempty}{\DC{empty}}+\newcommand{\vextend}{\DC{extend}}++\newcommand{\EpiVal}{\TC{Epigram}}+\newcommand{\unsafeCoerce}{\HF{unsafeCoerce\mbox{\texttt{\#}}}}++\newcommand{\qq}{\mbox{\texttt{"}}}+\newcommand{\impossible}{\RW{Impossible}}++\newcommand{\Real}{\mathbb{R}}++\newcommand{\DoubleRec}{\TC{DoubleElim}}+\newcommand{\DoubleOn}{\DC{Double_{\Z\vn}}}+\newcommand{\DoubleSO}{\DC{Double_{\suc\Z}}}+\newcommand{\DoubleSS}{\DC{Double_{\suc\suc}}}++\newcommand{\doublerec}{\textbf{double-elim}}++\newcommand{\set}{\TC{DList}}+\newcommand{\setuser}{\TC{DListTop}}+\newcommand{\setempty}{\emptyset}+\newcommand{\setinsert}{\DC{insert}}+++%%%% Type systems++\newcommand{\stlc}{\lambda\hspace*{-0.15cm}\to}+\newcommand{\plc}{\lambda2}+\newcommand{\dlc}{\lambda{}P}++\newcommand{\EC}{\mathcal{E}}++%%%% reductions++\newcommand{\betared}{\iq\hspace*{-0.15cm}_{\beta}}+\newcommand{\deltared}{\iq\hspace*{-0.15cm}_{\delta}}+\newcommand{\gammared}{\iq\hspace*{-0.15cm}_{\gamma}}+\newcommand{\etared}{\iq\hspace*{-0.15cm}_{\eta}}+\newcommand{\iotared}{\iq\hspace*{-0.15cm}_{\iota}}+\newcommand{\rhored}{\iq\hspace*{-0.15cm}_{\rho}}++%%%% ExTT rules++\newcommand{\exconverts}{\stackrel{\mathsf{Ex}}{\converts}}+\newcommand{\excumul}{\stackrel{\mathsf{Ex}}{\cumul}}+\newcommand{\exequiv}{\stackrel{\mathsf{Ex}}{\equiv}}+\newcommand{\exreduces}{\stackrel{\mathsf{Ex}}\reduces}+\newcommand{\exreducesto}{\stackrel{\mathsf{Ex}}{\reducesto}}+\newcommand{\exreducesn}[1]{\exreduces_{#1}}++\newcommand{\ttequiv}{\stackrel{\mathsf{TT}}{\equiv}}+\newcommand{\ttreduces}{\stackrel{\mathsf{TT}}\reduces}+\newcommand{\ttreducesn}[1]{\ttreduces_{#1}}++%%% Type synthesis++\newcommand{\hastype}{\Longrightarrow}+\newcommand{\whnfs}{\twoheadrightarrow}+\newcommand{\conv}{\converts}++\newcommand{\exhastype}{\stackrel{\mathsf{Ex}}{\hastype}}+\newcommand{\exwhnfs}{\stackrel{\mathsf{Ex}}{\whnfs}}+\newcommand{\exconv}{\stackrel{\mathsf{Ex}}{\conv}}+\newcommand{\exproves}{\stackrel{\mathsf{Ex}}{\proves}}++\newcommand{\tthastype}{\stackrel{\mathsf{TT}}{\hastype}}+\newcommand{\ttwhnfs}{\stackrel{\mathsf{TT}}{\whnfs}}+\newcommand{\ttconv}{\stackrel{\mathsf{TT}}{\conv}}+\newcommand{\ttproves}{\stackrel{\mathsf{TT}}{\proves}}++%%% Lightning++\newcommand{\light}[1]{\lightning^{#1}}+\newcommand{\LHab}[1]{\pad{\;}{:^{#1}}}+\newcommand{\llam}[3]{\lambda#1\pad{\!}{:}^{#2}#3}+\newcommand{\lall}[3]{\forall#1\pad{\!}{:}^{#2}#3}+\newcommand{\lapp}[3]{#1(#2)^{#3}}+\newcommand{\larg}[2]{(#1)^{#2}}++\newcommand{\RName}[1]{\hspace*{0.1in}\mathsf{#1}}
+ docs/shell.tex view
@@ -0,0 +1,1 @@+\section{The Shell}
+ docs/tactics.tex view
@@ -0,0 +1,1 @@+\section{Primitive Tactics}
+ docs/tt.tex view
@@ -0,0 +1,1 @@+\section{$\source$ --- The Core Type Theory}
+ emacs/ivor-mode.el view
@@ -0,0 +1,214 @@+(eval-when-compile+  (require 'comint))++(defvar ivor-mode-map+   (let ((map (make-sparse-keymap)))+     (define-key map "\C-j" 'newline-and-indent)+     (define-key map "\C-n" 'ivor-send-to-shell)+     (define-key map "\C-c\C-n" 'ivor-send-all-to-shell)+     (define-key map "\C-c\C-s" 'ivor-start)+     (define-key map "\C-c\C-d" 'ivor-stop)+     (define-key map "\C-c\C-r" 'ivor-restart)+     (define-key map "\C-c\C-u" 'ivor-undo)+     map)+   "Keymap for `ivor-mode'.")++(add-to-list 'auto-mode-alist '("\\.tt\\'" . ivor-mode))++(defvar ivor-mode-syntax-table+   (let ((st (make-syntax-table)))+     (modify-syntax-entry ?{ ". 1" st)+     (modify-syntax-entry ?} ". 4" st)+     (modify-syntax-entry ?- ". 1b2b3" st)+     (modify-syntax-entry ?\n "> b" st)+     st)+   "Syntax table for `ivor-mode'.")++;;;(regexp-opt '("Data" "Rec" "Qed" "Freeze" "Thaw" "Eval" "Check" "Load"+;;;           "Suspend" "Resume" "Compile" "Repl" "Equality" "Drop"+;;;           "Primitives" "Forget" "Let" "Axiom" "Focus" "Declare" "Where"+;;;           "Plugin"))++;;;(regexp-opt '("attack" "claim" "local" "refine" "solve" "fill" "return"+;;;           "quote" "call" "abandon" "rename" "intro" "intros" "arg"+;;;           "equiv" "generalise" "dependent" "replace" "axiomatise"+;;;           "compute" "unfold" "trivial" "by" "induction" "case"+;;;           "auto" "left" "right" "split" "exists" "decide"))++(defconst ivor-font-lock-keywords+  (list '("\\<\\(Axiom\\|C\\(?:heck\\|ompile\\)\\|D\\(?:ata\\|eclare\\|rop\\)\\|E\\(?:quality\\|val\\)\\|F\\(?:o\\(?:cus\\|rget\\)\\|reeze\\)\\|L\\(?:et\\|oad\\)\\|Primitives\\|Qed\\|Re\\(?:c\\|pl\\|sume\\)\\|Suspend\\|Thaw\\|Plugin\\|Where\\)\\>"+ . font-lock-keyword-face)+        '("a\\(?:bandon\\|rg\\|ttack\\|uto\\|xiomatise\\)\\|by\\|c\\(?:a\\(?:ll\\|se\\)\\|laim\\|ompute\\)\\|de\\(?:cide\\|pendent\\)\\|e\\(?:quiv\\|xists\\)\\|fill\\|generalise\\|in\\(?:duction\\|tros?\\)\\|l\\(?:eft\\|ocal\\)\\|quote\\|r\\(?:e\\(?:fine\\|name\\|place\\|turn\\)\\|ight\\)\\|s\\(?:olve\\|plit\\)\\|trivial\\|unfold" . font-lock-builtin-face)+        '("<\\([^:]*\\):[^>]*>" . (1 font-lock-string-face keep t))+        '("<\\([^>:]*\\)>" . (1 font-lock-string-face keep t))+        '("^\\([a-zA-Z0-9\\'\\_]+\\)\\s-*:" . (1 font-lock-function-name-face keep t))+        '("^\\([a-zA-Z0-9\\'\\_]+\\)\\s-*=" . (1 font-lock-function-name-face keep t))+        '("Rec\\s-+\\([a-zA-Z0-9\\'\\_]+\\)\\s-*:" . (1 font-lock-function-name-face t t))+        '("\\b\\([a-zA-Z0-9\\'\\_]+\\)\\s-*:" . (1 font-lock-variable-name-face keep t))+        '("\\b\\([a-zA-Z0-9\\'\\_]+\\)\\s-*," . (1 font-lock-variable-name-face keep t))+  )+  "Highlighting for Ivor mode")++;;;(defvar tt-font-lock-keywords+;;;   '(("Data" (1 font-lock-keyword-face)))+;;;   "Keyword highlighting specification for `ivor-mode'.")+++;;(defvar tt-imenu-generic-expression+;;   ...)++;;(defvar tt-outline-regexp+;;   ...)++ ;;;###autoload+(define-derived-mode ivor-mode fundamental-mode "Ivor"+   "A major mode for editing Ivor files."+   (set (make-local-variable 'comment-start) "-- ")+   (set (make-local-variable 'comment-start-skip) "#+\\s-*")+   (set (make-local-variable 'font-lock-defaults)+        '(ivor-font-lock-keywords))+   (set (make-local-variable 'indent-line-function) 'ivor-indent-line)+;;   (set (make-local-variable 'imenu-generic-expression)+;;      ivor-imenu-generic-expression)+;;   (set (make-local-variable 'outline-regexp) ivor-outline-regexp)+   )++;;; Indentation+;; 1. Qed line is indented to 0+;; 2. After 'Data' indent each line 4 until a semicolon, or 2 if the line+;;    begins with '|' or '='+++(defun ivor-indent-line ()+   "Indent current line of Ivor code."+   (interactive)+   (let ((savep (> (current-column) (current-indentation)))+         (indent (condition-case nil (max (ivor-calculate-indentation) 0)+                   (error 0))))+     (if savep+         (save-excursion (indent-line-to indent))+       (indent-line-to indent))))++(defun ivor-calculate-indentation ()+   "Return the column to which the current line should be indented."+   ;; Default is the indentation of the previous line+  (cond+   ((ivor-isQed) 0)+   ((ivor-first-is "[ \\t]*|") (ivor-under-eq))+   ((ivor-eq-no-semi) 4)+   ((ivor-first-is "[ \\t]*=") 2)+   (t (ivor-get-previous-indentation))+  )+)++(defun ivor-isQed ()+  (save-excursion+    (beginning-of-line)+    (looking-at "Qed")))++(defun ivor-eq-no-semi ()+  (save-excursion+    (forward-line -1)+    (beginning-of-line)+    (looking-at ".*=[^;]*$")))++(defun ivor-under-eq ()+  "Indent to under the = sign on the previous line, or 4 spaces if none"+  (save-excursion+    (forward-line -1)+    (beginning-of-line)+    (let ((this-line (thing-at-point 'line)))+      (let ((eq-point (string-match "=" this-line)))+        (progn (if (eq eq-point nil)+                   2+                 eq-point))))))++(defun ivor-first-is (str)+  (save-excursion+    (beginning-of-line)+    (looking-at str)))++(defun ivor-get-previous-indentation ()+  "Return the indentation of the previous line"+  (save-excursion+    (forward-line -1)+    (current-indentation)))++(defun ivor-send-to-shell ()+  "Read the current line and send it to the shell process, if any"+  (interactive)+  (progn (save-excursion+           (beginning-of-line)+           (let* ((this-line (thing-at-point 'line))+                  (chomped (substring this-line 0 (- (length this-line) 1))))+             (progn (set-buffer (get-buffer "*Ivor*"))+                    (insert chomped)+                    (comint-send-input))))+         (forward-line 1)+         (beginning-of-line)+         )+)++(defun ivor-send-all-to-shell ()+  "Send the buffer up to the current point to the shell process"+  (interactive)+  (let ((contents (buffer-substring 1 (point))))+        (progn (set-buffer (get-buffer "*Ivor*"))+               (insert contents)+               (comint-send-input))))++(defvar ivor-shell-exec "jones")+(defvar ivor-shell-sep ";")++(defun set-ivor-shell (executable)+  "Set the Ivor shell executable"+  (interactive "sShell executable: ")+  (setq ivor-shell-exec executable))++(defun set-ivor-sep (sep)+  "Set the Ivor shell command separator"+  (interactive "sShell separator: ")+  (setq ivor-shell-sep sep))++(defun ivor-start ()+  "Start a shell with Ivor in it"+  (interactive)+  (when (not (bufferp (get-buffer "*Ivor*")))+    (progn (shell "*Ivor*")+           (set-buffer (get-buffer "*Ivor*"))+           (insert ivor-shell-exec)+           (comint-send-input))))++(defun ivor-stop ()+  "Stop the Ivor process"+  (interactive)+  (let ((dir (file-name-directory buffer-file-name)))+    (save-current-buffer+      (progn (set-buffer (get-buffer "*Ivor*"))+             (insert (concat "Drop" ivor-shell-sep))+             (comint-send-input))))+  (goto-char (point-min)))++(defun ivor-restart ()+  "Restart the Ivor process"+  (interactive)+  (let ((dir (file-name-directory buffer-file-name)))+    (save-current-buffer+      (progn (set-buffer (get-buffer "*Ivor*"))+             (insert (concat "Drop" ivor-shell-sep))+             (comint-send-input)+             (insert (concat "cd " dir "; " ivor-shell-exec))+             (comint-send-input))))+  (goto-char (point-min)))++(defun ivor-undo-proof ()+  "Send undo command in a proof state."+  (interactive)+  (let ((dir (file-name-directory buffer-file-name)))+    (save-current-buffer+      (progn (set-buffer (get-buffer "*Ivor*"))+             (insert "Undo;")+             (comint-send-input))))+  (goto-char (point-min)))++(provide 'ivor)
+ examplett/Nat.hs view
@@ -0,0 +1,156 @@+{-# OPTIONS_GHC -fglasgow-exts #-} ++module Nat where++import GHC.Base++coerce :: a -> b+coerce = unsafeCoerce#++data Type = Type+data Val = Val++class Project x where+    project :: forall val. Int -> x -> val++data TT_Nat = TT_O | forall arg. TT_S arg ++instance Project TT_Nat where+    project 0 (TT_S  a0) = ((coerce a0)::val)++++fn_NatElim :: val -> val -> val -> val -> val+fn_NatElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (case ((coerce v0)::TT_Nat) of { TT_O  -> v2 ; TT_S _  -> (((coerce v3)::val->val->val) ((coerce (project 0((coerce v0)::TT_Nat)))::val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val) ((coerce (project 0((coerce v0)::TT_Nat)))::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce v3)::val) ))::val) ) ; })))))++data TT_True = TT_II +fn_TrueElim :: val -> val -> val -> val+fn_TrueElim = (\v0 -> (\v1 -> (\v2 -> (case ((coerce v0)::TT_True) of { TT_II  -> v2 ; }))))++data TT_False = TT_False+fn_FalseElim :: val -> val -> val+fn_FalseElim = (\v0 -> (\v1 -> error "Impossible"))++data TT_Ex = forall arg. TT_ex_intro arg arg arg arg ++instance Project TT_Ex where+    project 3 (TT_ex_intro  a0 a1 a2 a3) = ((coerce a3)::val)+    project 2 (TT_ex_intro  a0 a1 a2 a3) = ((coerce a2)::val)+    project 1 (TT_ex_intro  a0 a1 a2 a3) = ((coerce a1)::val)+    project 0 (TT_ex_intro  a0 a1 a2 a3) = ((coerce a0)::val)++++fn_ExElim :: val -> val -> val -> val -> val -> val+fn_ExElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (case ((coerce v2)::TT_Ex) of { TT_ex_intro _ _ _ _  -> (((coerce v4)::val->val->val) ((coerce (project 2((coerce v2)::TT_Ex)))::val) ((coerce (project 3((coerce v2)::TT_Ex)))::val) ) ; }))))))++data TT_Or = forall arg. TT_or_intro_l arg arg arg | forall arg. TT_or_intro_r arg arg arg ++instance Project TT_Or where+    project 2 (TT_or_intro_l  a0 a1 a2) = ((coerce a2)::val)+    project 1 (TT_or_intro_l  a0 a1 a2) = ((coerce a1)::val)+    project 0 (TT_or_intro_l  a0 a1 a2) = ((coerce a0)::val)+++    project 2 (TT_or_intro_r  a0 a1 a2) = ((coerce a2)::val)+    project 1 (TT_or_intro_r  a0 a1 a2) = ((coerce a1)::val)+    project 0 (TT_or_intro_r  a0 a1 a2) = ((coerce a0)::val)++++fn_OrElim :: val -> val -> val -> val -> val -> val -> val+fn_OrElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (case ((coerce v2)::TT_Or) of { TT_or_intro_l _ _ _  -> (((coerce v4)::val->val) ((coerce (project 2((coerce v2)::TT_Or)))::val) ) ; TT_or_intro_r _ _ _  -> (((coerce v5)::val->val) ((coerce (project 2((coerce v2)::TT_Or)))::val) ) ; })))))))++data TT_And = forall arg. TT_and_intro arg arg arg arg ++instance Project TT_And where+    project 3 (TT_and_intro  a0 a1 a2 a3) = ((coerce a3)::val)+    project 2 (TT_and_intro  a0 a1 a2 a3) = ((coerce a2)::val)+    project 1 (TT_and_intro  a0 a1 a2 a3) = ((coerce a1)::val)+    project 0 (TT_and_intro  a0 a1 a2 a3) = ((coerce a0)::val)++++fn_AndElim :: val -> val -> val -> val -> val -> val+fn_AndElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (case ((coerce v2)::TT_And) of { TT_and_intro _ _ _ _  -> (((coerce v4)::val->val->val) ((coerce (project 2((coerce v2)::TT_And)))::val) ((coerce (project 3((coerce v2)::TT_And)))::val) ) ; }))))))++data TT_Eq = forall arg. TT_refl arg arg ++instance Project TT_Eq where+    project 1 (TT_refl  a0 a1) = ((coerce a1)::val)+    project 0 (TT_refl  a0 a1) = ((coerce a0)::val)++++fn_EqElim :: val -> val -> val -> val -> val -> val -> val+fn_EqElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (case ((coerce v3)::TT_Eq) of { TT_refl _ _  -> v5 ; })))))))++fn_plus_eq_fst_sym :: val -> val -> val -> val -> val+fn_plus_eq_fst_sym = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_repl)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v0)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v0)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v0)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v0)::val) ))::val) ((coerce (((coerce fn_plus_comm)::val->val->val) ((coerce v0)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (\v3 -> ((coerce Type)::val)))::val) ((coerce (((coerce fn_repl)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plus_comm)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (\v3 -> ((coerce Type)::val)))::val) ((coerce (((coerce fn_plus_eq_fst)::val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ))))++fn_plus_eq_fst :: val -> val -> val -> val -> val+fn_plus_eq_fst = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v2)::val) ((coerce (\v3 -> ((coerce Type)::val)))::val) ((coerce (\v3 -> v3))::val) ((coerce (\v3 -> (\v4 -> (\v5 -> (((coerce v4)::val->val) ((coerce (((coerce fn_s_injective)::val->val->val->val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v3)::val) ((coerce (\v6 -> ((coerce Type)::val)))::val) ((coerce (\v6 -> v6))::val) ((coerce (\v6 -> (\v7 -> (\v8 -> (coerce (TT_S ((coerce (((coerce v7)::val->val) ((coerce v8)::val) ))::val) )::val)))))::val) ((coerce v0)::val) ))::val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v3)::val) ((coerce (\v6 -> ((coerce Type)::val)))::val) ((coerce (\v6 -> v6))::val) ((coerce (\v6 -> (\v7 -> (\v8 -> (coerce (TT_S ((coerce (((coerce v7)::val->val) ((coerce v8)::val) ))::val) )::val)))))::val) ((coerce v1)::val) ))::val) ((coerce v5)::val) ))::val) )))))::val) ))))++fn_plus_assoc :: val -> val -> val -> val+fn_plus_assoc = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v3 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce v1)::val) ))::val) ((coerce v2)::val) ))::val) )))::val) ((coerce (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v1)::val) ((coerce (\v3 -> ((coerce Type)::val)))::val) ((coerce (\v3 -> v3))::val) ((coerce (\v3 -> (\v4 -> (\v5 -> (coerce (TT_S ((coerce (((coerce v4)::val->val) ((coerce v5)::val) ))::val) )::val)))))::val) ((coerce v2)::val) ))::val) )::val))::val) ((coerce (\v3 -> (\v4 -> (((coerce fn_repl)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce v1)::val) ))::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce v1)::val) ))::val) ((coerce v2)::val) ))::val) ((coerce v4)::val) ))::val) ((coerce (\v5 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce v5)::val) )::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (coerce (TT_S ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce v1)::val) ))::val) )::val))::val) ((coerce v2)::val) ))::val) )))::val) ((coerce (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v3)::val) ((coerce (\v5 -> ((coerce Type)::val)))::val) ((coerce (\v5 -> v5))::val) ((coerce (\v5 -> (\v6 -> (\v7 -> (coerce (TT_S ((coerce (((coerce v6)::val->val) ((coerce v7)::val) ))::val) )::val)))))::val) ((coerce v1)::val) ))::val) ((coerce (\v5 -> ((coerce Type)::val)))::val) ((coerce (\v5 -> v5))::val) ((coerce (\v5 -> (\v6 -> (\v7 -> (coerce (TT_S ((coerce (((coerce v6)::val->val) ((coerce v7)::val) ))::val) )::val)))))::val) ((coerce v2)::val) ))::val) )::val))::val) )::val))::val) ))))::val) ))))++fn_plus_comm :: val -> val -> val+fn_plus_comm = (\v0 -> (\v1 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v2 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) )))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_O )::val))::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (coerce (TT_O )::val))::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plusnO)::val->val) ((coerce v1)::val) ))::val) ))::val) ((coerce (\v2 -> (\v3 -> (((coerce fn_repl)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce v3)::val) ))::val) ((coerce (\v4 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce v4)::val) )::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_S ((coerce v2)::val) )::val))::val) ))::val) )))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_S ((coerce v2)::val) )::val))::val) ))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) )::val))::val) ((coerce (((coerce fn_plusnSm)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ))))::val) )))++fn_plusnSm :: val -> val -> val+fn_plusnSm = (\v0 -> (\v1 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v2 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) )::val))::val) )))::val) ((coerce (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) )::val))::val) ((coerce (\v2 -> (\v3 -> (((coerce fn_eq_resp_S)::val->val->val->val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v2)::val) ((coerce (\v4 -> ((coerce Type)::val)))::val) ((coerce (\v4 -> v4))::val) ((coerce (\v4 -> (\v5 -> (\v6 -> (coerce (TT_S ((coerce (((coerce v5)::val->val) ((coerce v6)::val) ))::val) )::val)))))::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v2)::val) ((coerce (\v4 -> ((coerce Type)::val)))::val) ((coerce (\v4 -> v4))::val) ((coerce (\v4 -> (\v5 -> (\v6 -> (coerce (TT_S ((coerce (((coerce v5)::val->val) ((coerce v6)::val) ))::val) )::val)))))::val) ((coerce v1)::val) ))::val) )::val))::val) ((coerce v3)::val) ))))::val) )))++fn_plusnO :: val -> val+fn_plusnO = (\v0 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v1 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_O )::val))::val) ))::val) ((coerce v1)::val) )))::val) ((coerce (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_O )::val))::val) )::val))::val) ((coerce (\v1 -> (\v2 -> (((coerce fn_eq_resp_S)::val->val->val->val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_O )::val))::val) ))::val) ((coerce v1)::val) ((coerce v2)::val) ))))::val) ))++fn_discriminate_Nat :: val -> val -> val -> val+fn_discriminate_Nat = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_FalseElim)::val->val->val) ((coerce (((coerce fn_notO_S)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce (\v3 -> v0))::val) ))))++fn_notn_S :: val -> val -> val+fn_notn_S = (\v0 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v1 -> (((coerce fn_not)::val->val) ((coerce (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce v1)::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ))::val) )))::val) ((coerce (((coerce fn_notO_S)::val->val) ((coerce (coerce (TT_O )::val))::val) ))::val) ((coerce (\v1 -> (\v2 -> (\v3 -> (((coerce v2)::val->val) ((coerce (((coerce fn_s_injective)::val->val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ((coerce v3)::val) ))::val) )))))::val) ))++fn_notO_S :: val -> val -> val+fn_notO_S = (\v0 -> (\v1 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_O )::val))::val) ((coerce (coerce (TT_S ((coerce v0)::val) )::val))::val) ((coerce v1)::val) ((coerce (\v2 -> (\v3 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v2)::val) ((coerce (\v4 -> ((coerce Type)::val)))::val) ((coerce ((coerce Type)::val))::val) ((coerce (\v4 -> (\v5 -> ((coerce Type)::val))))::val) ))))::val) ((coerce (coerce (TT_II )::val))::val) )))++fn_s_injective :: val -> val -> val -> val+fn_s_injective = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_eq_resp_f)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce ((coerce Type)::val))::val) ((coerce (\v3 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v3)::val) ((coerce (\v4 -> ((coerce Type)::val)))::val) ((coerce v0)::val) ((coerce (\v4 -> (\v5 -> v4)))::val) )))::val) ((coerce (coerce (TT_S ((coerce v0)::val) )::val))::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ((coerce v2)::val) ))))++fn_eq_resp_S :: val -> val -> val -> val+fn_eq_resp_S = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_eq_resp_f)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce ((coerce Type)::val))::val) ((coerce (\v3 -> (coerce (TT_S ((coerce v3)::val) )::val)))::val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ))))++fn_simplifyS :: val -> val -> val+fn_simplifyS = (\v0 -> (\v1 -> (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v0)::val) ((coerce (\v2 -> ((coerce Type)::val)))::val) ((coerce (\v2 -> v2))::val) ((coerce (\v2 -> (\v3 -> (\v4 -> (coerce (TT_S ((coerce (((coerce v3)::val->val) ((coerce v4)::val) ))::val) )::val)))))::val) ((coerce v1)::val) ))::val) )::val))::val) )::val)))++fn_simplifyO :: val -> val+fn_simplifyO = (\v0 -> (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce v0)::val) )::val))++fn_plus :: val -> val -> val+fn_plus = (\v0 -> (\v1 -> (((coerce fn_plus_AP_)::val->val->val) ((coerce v0)::val) ((coerce v1)::val) )))++fn_plus_AP_ :: val -> val -> val+fn_plus_AP_ = (\v0 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v1 -> ((coerce Type)::val)))::val) ((coerce (\v1 -> v1))::val) ((coerce (\v1 -> (\v2 -> (\v3 -> (coerce (TT_S ((coerce (((coerce v2)::val->val) ((coerce v3)::val) ))::val) )::val)))))::val) ))++fn_or_commutes :: val -> val -> val -> val+fn_or_commutes = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_OrElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce (\v3 -> (((coerce ((coerce Type)::val))::val->val->val) ((coerce v1)::val) ((coerce v0)::val) )))::val) ((coerce (\v3 -> (coerce (TT_or_intro_r ((coerce v1)::val) ((coerce v0)::val) ((coerce v3)::val) )::val)))::val) ((coerce (\v3 -> (coerce (TT_or_intro_l ((coerce v1)::val) ((coerce v0)::val) ((coerce v3)::val) )::val)))::val) ))))++fn_and_commutes :: val -> val -> val -> val+fn_and_commutes = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_AndElim)::val->val->val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce (\v3 -> (((coerce ((coerce Type)::val))::val->val->val) ((coerce v1)::val) ((coerce v0)::val) )))::val) ((coerce (\v3 -> (\v4 -> (coerce (TT_and_intro ((coerce v1)::val) ((coerce v0)::val) ((coerce v4)::val) ((coerce v3)::val) )::val))))::val) ))))++fn_notElim :: val -> val -> val -> val+fn_notElim = (\v0 -> (\v1 -> (\v2 -> (((coerce v1)::val->val) ((coerce v2)::val) ))))++fn_not :: val -> val+fn_not = (\v0 -> ((coerce Type)::val))++fn_eq_resp_f :: val -> val -> val -> val -> val -> val -> val+fn_eq_resp_f = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v3)::val) ((coerce v4)::val) ((coerce v5)::val) ((coerce (\v6 -> (\v7 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce v1)::val) ((coerce (((coerce v2)::val->val) ((coerce v3)::val) ))::val) ((coerce (((coerce v2)::val->val) ((coerce v6)::val) ))::val) ))))::val) ((coerce (coerce (TT_refl ((coerce v1)::val) ((coerce (((coerce v2)::val->val) ((coerce v3)::val) ))::val) )::val))::val) )))))))++fn_sym :: val -> val -> val -> val -> val+fn_sym = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce v3)::val) ((coerce (\v4 -> (\v5 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce v0)::val) ((coerce v4)::val) ((coerce v1)::val) ))))::val) ((coerce (coerce (TT_refl ((coerce v0)::val) ((coerce v1)::val) )::val))::val) )))))++fn_trans :: val -> val -> val -> val -> val -> val -> val+fn_trans = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v2)::val) ((coerce v3)::val) ((coerce v5)::val) ((coerce (\v6 -> (\v7 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v6)::val) ))))::val) ((coerce v4)::val) )))))))++fn_repl :: val -> val -> val -> val -> val -> val -> val+fn_repl = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce v3)::val) ((coerce (\v6 -> (\v7 -> (((coerce v4)::val->val) ((coerce v6)::val) ))))::val) ((coerce v5)::val) )))))))+
+ examplett/Test.hs view
@@ -0,0 +1,166 @@+{-# OPTIONS_GHC -fglasgow-exts #-} ++module Test where++import GHC.Base++coerce :: a -> b+coerce = unsafeCoerce#++data Type = Type+data Val = Val++class Project x where+    project :: forall val. Int -> x -> val++data TT_Nat = TT_O | forall arg. TT_S arg ++instance Project TT_Nat where+++    project 0 (TT_S  a0) = ((coerce a0)::val)++++fn_NatElim :: val -> val -> val -> val -> val+fn_NatElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (case ((coerce v0)::TT_Nat) of { TT_O  -> v2 ; TT_S _  -> (((coerce v3)::val->val->val) ((coerce (project 0((coerce v0)::TT_Nat)))::val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val) ((coerce (project 0((coerce v0)::TT_Nat)))::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce v3)::val) ))::val) ) ; })))))++data TT_True = TT_II ++instance Project TT_True where++++fn_TrueElim :: val -> val -> val -> val+fn_TrueElim = (\v0 -> (\v1 -> (\v2 -> (case ((coerce v0)::TT_True) of { TT_II  -> v2 ; }))))++data TT_False = TT_False++instance Project TT_False where++fn_FalseElim :: val -> val -> val+fn_FalseElim = (\v0 -> (\v1 -> error "Impossible"))++data TT_Ex = forall arg. TT_ex_intro arg arg arg arg ++instance Project TT_Ex where+    project 3 (TT_ex_intro  a0 a1 a2 a3) = ((coerce a3)::val)+    project 2 (TT_ex_intro  a0 a1 a2 a3) = ((coerce a2)::val)+    project 1 (TT_ex_intro  a0 a1 a2 a3) = ((coerce a1)::val)+    project 0 (TT_ex_intro  a0 a1 a2 a3) = ((coerce a0)::val)++++fn_ExElim :: val -> val -> val -> val -> val -> val+fn_ExElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (case ((coerce v2)::TT_Ex) of { TT_ex_intro _ _ _ _  -> (((coerce v4)::val->val->val) ((coerce (project 2((coerce v2)::TT_Ex)))::val) ((coerce (project 3((coerce v2)::TT_Ex)))::val) ) ; }))))))++data TT_Or = forall arg. TT_or_intro_l arg arg arg | forall arg. TT_or_intro_r arg arg arg ++instance Project TT_Or where+    project 2 (TT_or_intro_l  a0 a1 a2) = ((coerce a2)::val)+    project 1 (TT_or_intro_l  a0 a1 a2) = ((coerce a1)::val)+    project 0 (TT_or_intro_l  a0 a1 a2) = ((coerce a0)::val)+++    project 2 (TT_or_intro_r  a0 a1 a2) = ((coerce a2)::val)+    project 1 (TT_or_intro_r  a0 a1 a2) = ((coerce a1)::val)+    project 0 (TT_or_intro_r  a0 a1 a2) = ((coerce a0)::val)++++fn_OrElim :: val -> val -> val -> val -> val -> val -> val+fn_OrElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (case ((coerce v2)::TT_Or) of { TT_or_intro_l _ _ _  -> (((coerce v4)::val->val) ((coerce (project 2((coerce v2)::TT_Or)))::val) ) ; TT_or_intro_r _ _ _  -> (((coerce v5)::val->val) ((coerce (project 2((coerce v2)::TT_Or)))::val) ) ; })))))))++data TT_And = forall arg. TT_and_intro arg arg arg arg ++instance Project TT_And where+    project 3 (TT_and_intro  a0 a1 a2 a3) = ((coerce a3)::val)+    project 2 (TT_and_intro  a0 a1 a2 a3) = ((coerce a2)::val)+    project 1 (TT_and_intro  a0 a1 a2 a3) = ((coerce a1)::val)+    project 0 (TT_and_intro  a0 a1 a2 a3) = ((coerce a0)::val)++++fn_AndElim :: val -> val -> val -> val -> val -> val+fn_AndElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (case ((coerce v2)::TT_And) of { TT_and_intro _ _ _ _  -> (((coerce v4)::val->val->val) ((coerce (project 2((coerce v2)::TT_And)))::val) ((coerce (project 3((coerce v2)::TT_And)))::val) ) ; }))))))++data TT_Eq = forall arg. TT_refl arg arg ++instance Project TT_Eq where+    project 1 (TT_refl  a0 a1) = ((coerce a1)::val)+    project 0 (TT_refl  a0 a1) = ((coerce a0)::val)++++fn_EqElim :: val -> val -> val -> val -> val -> val -> val+fn_EqElim = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (case ((coerce v3)::TT_Eq) of { TT_refl _ _  -> v5 ; })))))))++fn_plus_eq_fst_sym :: val -> val -> val -> val -> val+fn_plus_eq_fst_sym = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_repl)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v0)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v0)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v0)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v0)::val) ))::val) ((coerce (((coerce fn_plus_comm)::val->val->val) ((coerce v0)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (\v3 -> ((coerce Type)::val)))::val) ((coerce (((coerce fn_repl)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plus_comm)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (\v3 -> ((coerce Type)::val)))::val) ((coerce (((coerce fn_plus_eq_fst)::val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ))))++fn_plus_eq_fst :: val -> val -> val -> val -> val+fn_plus_eq_fst = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v2)::val) ((coerce (\v3 -> ((coerce Type)::val)))::val) ((coerce (\v3 -> v3))::val) ((coerce (\v3 -> (\v4 -> (\v5 -> (((coerce v4)::val->val) ((coerce (((coerce fn_s_injective)::val->val->val->val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v3)::val) ((coerce (\v6 -> ((coerce Type)::val)))::val) ((coerce (\v6 -> v6))::val) ((coerce (\v6 -> (\v7 -> (\v8 -> (coerce (TT_S ((coerce (((coerce v7)::val->val) ((coerce v8)::val) ))::val) )::val)))))::val) ((coerce v0)::val) ))::val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v3)::val) ((coerce (\v6 -> ((coerce Type)::val)))::val) ((coerce (\v6 -> v6))::val) ((coerce (\v6 -> (\v7 -> (\v8 -> (coerce (TT_S ((coerce (((coerce v7)::val->val) ((coerce v8)::val) ))::val) )::val)))))::val) ((coerce v1)::val) ))::val) ((coerce v5)::val) ))::val) )))))::val) ))))++fn_plus_assoc :: val -> val -> val -> val+fn_plus_assoc = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v3 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce v1)::val) ))::val) ((coerce v2)::val) ))::val) )))::val) ((coerce (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v1)::val) ((coerce (\v3 -> ((coerce Type)::val)))::val) ((coerce (\v3 -> v3))::val) ((coerce (\v3 -> (\v4 -> (\v5 -> (coerce (TT_S ((coerce (((coerce v4)::val->val) ((coerce v5)::val) ))::val) )::val)))))::val) ((coerce v2)::val) ))::val) )::val))::val) ((coerce (\v3 -> (\v4 -> (((coerce fn_repl)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce v1)::val) ))::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce v1)::val) ))::val) ((coerce v2)::val) ))::val) ((coerce v4)::val) ))::val) ((coerce (\v5 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce v5)::val) )::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (coerce (TT_S ((coerce (((coerce fn_plus)::val->val->val) ((coerce v3)::val) ((coerce v1)::val) ))::val) )::val))::val) ((coerce v2)::val) ))::val) )))::val) ((coerce (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v3)::val) ((coerce (\v5 -> ((coerce Type)::val)))::val) ((coerce (\v5 -> v5))::val) ((coerce (\v5 -> (\v6 -> (\v7 -> (coerce (TT_S ((coerce (((coerce v6)::val->val) ((coerce v7)::val) ))::val) )::val)))))::val) ((coerce v1)::val) ))::val) ((coerce (\v5 -> ((coerce Type)::val)))::val) ((coerce (\v5 -> v5))::val) ((coerce (\v5 -> (\v6 -> (\v7 -> (coerce (TT_S ((coerce (((coerce v6)::val->val) ((coerce v7)::val) ))::val) )::val)))))::val) ((coerce v2)::val) ))::val) )::val))::val) )::val))::val) ))))::val) ))))++fn_plus_comm :: val -> val -> val+fn_plus_comm = (\v0 -> (\v1 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v2 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) )))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_O )::val))::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce (coerce (TT_O )::val))::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plusnO)::val->val) ((coerce v1)::val) ))::val) ))::val) ((coerce (\v2 -> (\v3 -> (((coerce fn_repl)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce v3)::val) ))::val) ((coerce (\v4 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce v4)::val) )::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_S ((coerce v2)::val) )::val))::val) ))::val) )))::val) ((coerce (((coerce fn_sym)::val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_S ((coerce v2)::val) )::val))::val) ))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) )::val))::val) ((coerce (((coerce fn_plusnSm)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ))::val) ))))::val) )))++fn_plusnSm :: val -> val -> val+fn_plusnSm = (\v0 -> (\v1 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v2 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_plus)::val->val->val) ((coerce v2)::val) ((coerce v1)::val) ))::val) )::val))::val) )))::val) ((coerce (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) )::val))::val) ((coerce (\v2 -> (\v3 -> (((coerce fn_eq_resp_S)::val->val->val->val) ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v2)::val) ((coerce (\v4 -> ((coerce Type)::val)))::val) ((coerce (\v4 -> v4))::val) ((coerce (\v4 -> (\v5 -> (\v6 -> (coerce (TT_S ((coerce (((coerce v5)::val->val) ((coerce v6)::val) ))::val) )::val)))))::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v2)::val) ((coerce (\v4 -> ((coerce Type)::val)))::val) ((coerce (\v4 -> v4))::val) ((coerce (\v4 -> (\v5 -> (\v6 -> (coerce (TT_S ((coerce (((coerce v5)::val->val) ((coerce v6)::val) ))::val) )::val)))))::val) ((coerce v1)::val) ))::val) )::val))::val) ((coerce v3)::val) ))))::val) )))++fn_plusnO :: val -> val+fn_plusnO = (\v0 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v1 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_O )::val))::val) ))::val) ((coerce v1)::val) )))::val) ((coerce (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_O )::val))::val) )::val))::val) ((coerce (\v1 -> (\v2 -> (((coerce fn_eq_resp_S)::val->val->val->val) ((coerce (((coerce fn_plus)::val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_O )::val))::val) ))::val) ((coerce v1)::val) ((coerce v2)::val) ))))::val) ))++fn_discriminate_Nat :: val -> val -> val -> val+fn_discriminate_Nat = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_FalseElim)::val->val->val) ((coerce (((coerce fn_notO_S)::val->val->val) ((coerce v1)::val) ((coerce v2)::val) ))::val) ((coerce (\v3 -> v0))::val) ))))++fn_notn_S :: val -> val -> val+fn_notn_S = (\v0 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v1 -> (((coerce fn_not)::val->val) ((coerce (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce v1)::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ))::val) )))::val) ((coerce (((coerce fn_notO_S)::val->val) ((coerce (coerce (TT_O )::val))::val) ))::val) ((coerce (\v1 -> (\v2 -> (\v3 -> (((coerce v2)::val->val) ((coerce (((coerce fn_s_injective)::val->val->val->val) ((coerce v1)::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ((coerce v3)::val) ))::val) )))))::val) ))++fn_notO_S :: val -> val -> val+fn_notO_S = (\v0 -> (\v1 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_O )::val))::val) ((coerce (coerce (TT_S ((coerce v0)::val) )::val))::val) ((coerce v1)::val) ((coerce (\v2 -> (\v3 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v2)::val) ((coerce (\v4 -> ((coerce Type)::val)))::val) ((coerce ((coerce Type)::val))::val) ((coerce (\v4 -> (\v5 -> ((coerce Type)::val))))::val) ))))::val) ((coerce (coerce (TT_II )::val))::val) )))++fn_s_injective :: val -> val -> val -> val+fn_s_injective = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_eq_resp_f)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce ((coerce Type)::val))::val) ((coerce (\v3 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v3)::val) ((coerce (\v4 -> ((coerce Type)::val)))::val) ((coerce v0)::val) ((coerce (\v4 -> (\v5 -> v4)))::val) )))::val) ((coerce (coerce (TT_S ((coerce v0)::val) )::val))::val) ((coerce (coerce (TT_S ((coerce v1)::val) )::val))::val) ((coerce v2)::val) ))))++fn_eq_resp_S :: val -> val -> val -> val+fn_eq_resp_S = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_eq_resp_f)::val->val->val->val->val->val->val) ((coerce ((coerce Type)::val))::val) ((coerce ((coerce Type)::val))::val) ((coerce (\v3 -> (coerce (TT_S ((coerce v3)::val) )::val)))::val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ))))++fn_simplifyS :: val -> val -> val+fn_simplifyS = (\v0 -> (\v1 -> (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce (coerce (TT_S ((coerce (((coerce fn_NatElim)::val->val->val->val->val->val) ((coerce v0)::val) ((coerce (\v2 -> ((coerce Type)::val)))::val) ((coerce (\v2 -> v2))::val) ((coerce (\v2 -> (\v3 -> (\v4 -> (coerce (TT_S ((coerce (((coerce v3)::val->val) ((coerce v4)::val) ))::val) )::val)))))::val) ((coerce v1)::val) ))::val) )::val))::val) )::val)))++fn_simplifyO :: val -> val+fn_simplifyO = (\v0 -> (coerce (TT_refl ((coerce ((coerce Type)::val))::val) ((coerce v0)::val) )::val))++fn_plus :: val -> val -> val+fn_plus = (\v0 -> (\v1 -> (((coerce fn_plus_AP_)::val->val->val) ((coerce v0)::val) ((coerce v1)::val) )))++fn_plus_AP_ :: val -> val -> val+fn_plus_AP_ = (\v0 -> (((coerce fn_NatElim)::val->val->val->val->val) ((coerce v0)::val) ((coerce (\v1 -> ((coerce Type)::val)))::val) ((coerce (\v1 -> v1))::val) ((coerce (\v1 -> (\v2 -> (\v3 -> (coerce (TT_S ((coerce (((coerce v2)::val->val) ((coerce v3)::val) ))::val) )::val)))))::val) ))++fn_or_commutes :: val -> val -> val -> val+fn_or_commutes = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_OrElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce (\v3 -> (((coerce ((coerce Type)::val))::val->val->val) ((coerce v1)::val) ((coerce v0)::val) )))::val) ((coerce (\v3 -> (coerce (TT_or_intro_r ((coerce v1)::val) ((coerce v0)::val) ((coerce v3)::val) )::val)))::val) ((coerce (\v3 -> (coerce (TT_or_intro_l ((coerce v1)::val) ((coerce v0)::val) ((coerce v3)::val) )::val)))::val) ))))++fn_and_commutes :: val -> val -> val -> val+fn_and_commutes = (\v0 -> (\v1 -> (\v2 -> (((coerce fn_AndElim)::val->val->val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce (\v3 -> (((coerce ((coerce Type)::val))::val->val->val) ((coerce v1)::val) ((coerce v0)::val) )))::val) ((coerce (\v3 -> (\v4 -> (coerce (TT_and_intro ((coerce v1)::val) ((coerce v0)::val) ((coerce v4)::val) ((coerce v3)::val) )::val))))::val) ))))++fn_notElim :: val -> val -> val -> val+fn_notElim = (\v0 -> (\v1 -> (\v2 -> (((coerce v1)::val->val) ((coerce v2)::val) ))))++fn_not :: val -> val+fn_not = (\v0 -> ((coerce Type)::val))++fn_eq_resp_f :: val -> val -> val -> val -> val -> val -> val+fn_eq_resp_f = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v3)::val) ((coerce v4)::val) ((coerce v5)::val) ((coerce (\v6 -> (\v7 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce v1)::val) ((coerce (((coerce v2)::val->val) ((coerce v3)::val) ))::val) ((coerce (((coerce v2)::val->val) ((coerce v6)::val) ))::val) ))))::val) ((coerce (coerce (TT_refl ((coerce v1)::val) ((coerce (((coerce v2)::val->val) ((coerce v3)::val) ))::val) )::val))::val) )))))))++fn_sym :: val -> val -> val -> val -> val+fn_sym = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce v3)::val) ((coerce (\v4 -> (\v5 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce v0)::val) ((coerce v4)::val) ((coerce v1)::val) ))))::val) ((coerce (coerce (TT_refl ((coerce v0)::val) ((coerce v1)::val) )::val))::val) )))))++fn_trans :: val -> val -> val -> val -> val -> val -> val+fn_trans = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v2)::val) ((coerce v3)::val) ((coerce v5)::val) ((coerce (\v6 -> (\v7 -> (((coerce ((coerce Type)::val))::val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v6)::val) ))))::val) ((coerce v4)::val) )))))))++fn_repl :: val -> val -> val -> val -> val -> val -> val+fn_repl = (\v0 -> (\v1 -> (\v2 -> (\v3 -> (\v4 -> (\v5 -> (((coerce fn_EqElim)::val->val->val->val->val->val->val) ((coerce v0)::val) ((coerce v1)::val) ((coerce v2)::val) ((coerce v3)::val) ((coerce (\v6 -> (\v7 -> (((coerce v4)::val->val) ((coerce v6)::val) ))))::val) ((coerce v5)::val) )))))))+
+ examplett/ack.tt view
@@ -0,0 +1,35 @@+Load "nat.tt";++Primitives;++natToInt : (x:Nat)Int;+intros;+induction x;+fill 0;+intros;+fill addInt 1 k_IH;+Qed;++ack:(x,y:Nat)<ack x y: Nat>;+intro x;+induction x;+intros;+return;+fill (S y);+intros;+induction y0;+return;+call ack k (S O);+intros;+refine k_IH;+fill call <ack (S k) k0> k_IH0;+Qed;++runack = [x,y:Int](natToInt (call <ack (intToNat x) (intToNat y)>+            (ack (intToNat x) (intToNat y))));++Eval runack 2 6; {- 15 -}+Eval runack 3 4; {- 125 -}+Eval runack 3 5; {- 253 -}++Eval runack 4 4; {- no chance -}
+ examplett/eq.tt view
@@ -0,0 +1,31 @@+Data Eq (A:*)(a:A) : (b:A)* where refl : Eq A a a;++repl : (A:*)(a:A)(b:A)(q:Eq _ a b)(P:(a:A)*)(p:P a)(P b);+intros;+induction q;+fill p;+Qed;+Freeze repl;++trans : (A:*)(a:A)(b:A)(c:A)(p:Eq _ a b)(q:Eq _ b c)(Eq _ a c);+intros;+induction q;+fill p;+Qed;+Freeze trans;++sym : (A:*)(a:A)(b:A)(p:Eq _ a b)(Eq _ b a);+intros;+induction p;+refine refl;+Qed;+Freeze sym;++Repl Eq repl sym;++eq_resp_f:(A,B:*)(f:(a:A)B)(x:A)(y:A)(q:Eq _ x y)(Eq _ (f x) (f y));+intros;+induction q;+refine refl;+Qed;+Freeze eq_resp_f;
+ examplett/fin.tt view
@@ -0,0 +1,16 @@+Load "lt.tt";++Data Fin : (n:Nat)* where+      fz : (k:Nat)(Fin (S k))+    | fs : (k:Nat)(i:Fin k)(Fin (S k));++mkFin : (m,n:Nat)(p:Lt m n)(Fin n);+intros;+induction p;+intros;+refine fz;+intros;+refine fs;+fill p_IH;+Qed;+
+ examplett/general.tt view
@@ -0,0 +1,32 @@+Data Nat:* = O:Nat | S:(k:Nat)Nat;++General Y;++genplus:(m:Nat)(n:Nat)Nat;+by Y;+intro PLUS m n;+induction m;+fill n;+intros;+fill S (PLUS k n);+Qed;++undefined:(A:*)A;+by Y;+intro UNDEF A;+refine UNDEF;+Qed;+Freeze undefined;++Data List (A:*) : * = nil:List A | cons:(x:A)(xs:List A)List A;++head:(A:*)(xs:List A)A;+intros;+induction xs;+refine undefined;+intros;+refine x;+Qed;++Eval head _ (cons _ O (nil Nat));+Eval head _ (nil Nat);
+ examplett/interp.tt view
@@ -0,0 +1,2 @@+Load "nat.tt";+
+ examplett/jmeq.tt view
@@ -0,0 +1,173 @@+Equality Eq refl;++repl : (A:*)(x:A)(y:A)(q:Eq _ _ x y)(P:(m:A)*)(p:P x)(P y);+intros;+by EqElim _ _ _ q;+fill p;+Qed;+Freeze repl;++trans : (A:*)(a:A)(b:A)(c:A)(p:Eq _ _ a b)(q:Eq _ _ b c)(Eq _ _ a c);+intros;+by EqElim _ _ _ q;+fill p;+Qed;+Freeze trans;++sym : (A:*)(a:A)(b:A)(p:Eq _ _ a b)(Eq _ _ b a);+intros;+by EqElim _ _ _ p;+refine refl;+Qed;+Freeze sym;++Repl Eq repl sym;++eq_resp_f:(A,B:*)(f:(a:A)B)(x:A)(y:A)(q:Eq _ _ x y)(Eq _ _ (f x) (f y));+intros;+by EqElim _ _ _ q;+refine refl;+Qed;+Freeze eq_resp_f;++Data Nat:* = O:Nat | S:(k:Nat)Nat;++plus' : (m:Nat)(n:Nat)<plus' m n : Nat>;+intro m;+induction m;+intros;+fill return n;+intros;+fill return (S (call <plus' k n0> (k_IH n0)));+Qed;++plus = [m:Nat][n:Nat](call <plus' m n> (plus' m n));++simplifyO:(n:Nat)(Eq _ _ (plus O n) n);+intros;+refine refl;+Qed;++simplifyS:(m,n:Nat)(Eq _ _ (plus (S m) n) (S (plus m n)));+intros;+refine refl;+Qed;++eq_resp_S:(n:Nat)(m:Nat)(q:Eq _ _ n m)(Eq _ _ (S n) (S m));+intros;+fill (eq_resp_f _ _ S n m q);+Qed;+Freeze eq_resp_S;++s_injective:(n:Nat)(m:Nat)(q:Eq _ _ (S n) (S m))(Eq _ _ n m);+intros;+local unS:(m:Nat)Nat;+intros;+induction m0;+fill n;+intros;+fill k;+fill eq_resp_f _ _ unS _ _ q;+Qed;+Freeze s_injective;++notO_S:(k:Nat)(not (Eq _ _ O (S k)));+intros;+equiv (q:Eq _ _ O (S k))False;+intros;+local dmotive : (x:Nat)(q:Eq _ _ O x)*;+intros;+induction x;+fill True;+intros;+fill False;+fill EqElim _ _ _ q dmotive II;+Qed;+Freeze notO_S;++notn_S:(n:Nat)(not (Eq _ n (S n)));+intro;+induction n;+fill notO_S O;+intros;+equiv (q:Eq _ (S k) (S (S k)))False;+intros;+claim q:Eq _ k (S k);+fill k_IH q0;+refine s_injective;+fill q;+Qed;+Freeze notn_S;++discriminate_Nat:(A:*)(k:Nat)(q:Eq _ O (S k))A;+intros;+local false:False;+fill notO_S k q;+induction false;+Qed;+Freeze discriminate_Nat;++plusnO:(n:Nat)(Eq _ _ (plus n O) n);+intro;+induction n;+refine refl;+intros;+equiv Eq _ _ (S (plus k O)) (S k);+refine eq_resp_S;+fill k_IH;+Qed;+Freeze plusnO;++plusnSm:(n:Nat)(m:Nat)(Eq _ _ (plus n (S m)) (S (plus n m)));+intros;+induction n;+refine refl;+intros;+refine eq_resp_S;+fill k_IH;+Qed;+Freeze plusnSm;++plus_comm:(n:Nat)(m:Nat)(Eq _ _ (plus n m) (plus m n));+intros;+induction n;+refine sym;+refine plusnO;+intros;+equiv Eq _ _ (S (plus k m)) (plus m (S k));+replace k_IH;+refine sym;+refine plusnSm;+Qed;+Freeze plus_comm;++plus_assoc:(m,n,p:Nat)(Eq _ _ (plus m (plus n p)) (plus (plus m n) p));+intros;+induction m;+refine refl;+intros;+equiv Eq _ _ (S (plus k (plus n p))) (plus (S (plus k n)) p);+replace k_IH;+refine refl;+Qed;+Freeze plus_assoc;++plus_eq_fst : (m,n,p:Nat)(q:Eq _ _ (plus p m) (plus p n))(Eq _ _ m n);+intro m n p;+induction p;+intros;+fill q;+intros;+refine k_IH;+refine s_injective;+refine q0;+Qed;+Freeze plus_eq_fst;++plus_eq_fst_sym : (m,n,p:Nat)(q:Eq _ _ (plus m p) (plus n p))(Eq _ _ m n);+intro m n p;+replace plus_comm m p;+replace plus_comm n p;+fill plus_eq_fst m n p;+Qed;+Freeze plus_eq_fst_sym;
+ examplett/logic.tt view
@@ -0,0 +1,54 @@+Data And (A:*)(B:*) : * where and_intro : (a:A)(b:B)(And A B);++Data Or (A:*)(B:*) : * where+       or_intro_l : (a:A)(Or A B)+     | or_intro_r : (b:B)(Or A B);++Data Ex (A:*)(P:(a:A)*) : * where ex_intro : (x:A)(p:P x)(Ex A P);++Data False : * where ;++Data True : * where II : True ;++not = [A:*](a:A)False;++notElim = [A:*][p:not A][pp:A](p pp);++Axiom classical:(P:*)(Or P (not P));++and_commutes : (A:*)(B:*)(p:And A B)(And B A);+intros;+induction p;+intros;+split;+trivial;+trivial;+Qed;+Freeze and_commutes;++or_commutes : (A:*)(B:*)(p:Or A B)(Or B A);+intros;+induction p;+intros;+right;+trivial;+intros;+left;+trivial;+Qed;+Freeze or_commutes;++implies : ((a:*)(Or a (not a)))->+          (A:*)(B:*)(A -> B) -> (Or (not A) B);+intros;+case (X A);+intros;+right;+refine X0;+trivial;+intros;+left;+trivial;+Qed;++
+ examplett/lt.tt view
@@ -0,0 +1,26 @@+Load "nat.tt";++Data Lt : (m,n:Nat)* where+    ltO : (m:Nat)Lt O (S m)+  | ltS : (m,n:Nat)(p:Lt m n)Lt (S m) (S n);++LtmSn : (m,n:Nat)(p:Lt m n)(Lt m (S n));+intros;+induction p;+intros;+refine ltO;+intros;+refine ltS;+fill p_IH;+Qed;++Ltmplus : (m,n,i:Nat)(p:Lt m n)(Lt m (plus n i));+intros;+induction p;+intros;+refine ltO;+intro m2 n1;+intros;+refine ltS;+fill p_IH;+Qed;
+ examplett/nat.tt view
@@ -0,0 +1,229 @@+Load "eq.tt";+Load "logic.tt";++Data Nat:* where +   O:Nat + | S:(k:Nat)Nat;++plus : Nat -> Nat -> Nat;+intro m;+induction m;+intros;+fill X0;+intros;+fill S (k_IH X1);+Qed;++mult : (m:Nat) -> (n:Nat) -> Nat;+intro m;+induction m;+intros;+fill O;+intros;+fill (plus n0 (k_IH n0));+Qed;++simplifyO:(n:Nat)(Eq _ (plus O n) n);+intros;+refine refl;+Qed;++simplifyS:(m,n:Nat)(Eq _ (plus (S m) n) (S (plus m n)));+intros;+refine refl;+Qed;++eq_resp_S:(n:Nat)(m:Nat)(q:Eq _ n m)(Eq _ (S n) (S m));+intros;+fill (eq_resp_f _ _ S n m q);+Qed;+Freeze eq_resp_S;++s_injective:(n:Nat)(m:Nat)(q:Eq _ (S n) (S m))(Eq _ n m);+intros;+local unS:(m:Nat)Nat;+intros;+induction m0;+fill n;+intros;+fill k;+fill eq_resp_f _ _ unS _ _ q;+Qed;+Freeze s_injective;++notO_S:(k:Nat)(not (Eq _ O (S k)));+intros;+compute;+intro q;+local dmotive : (x:Nat)(q:Eq _ O x)*;+intros;+induction x;+fill True;+intros;+fill False;+fill EqElim _ _ _ q dmotive II;+Qed;+Freeze notO_S;++notn_S:(n:Nat)(not (Eq _ n (S n)));+intro;+induction n;+fill notO_S O;+intros;+unfold not;+intros;+claim q:Eq _ k (S k);+fill k_IH q;+refine s_injective;+fill a;+Qed;+Freeze notn_S;++discriminate_Nat:(A:*)(k:Nat)(q:Eq _ O (S k))A;+intros;+local false:False;+fill notO_S k q;+induction false;+Qed;+Freeze discriminate_Nat;++plusnO:(n:Nat)(Eq _ (plus n O) n);+intro;+induction n;+refine refl;+intros;+equiv Eq _ (S (plus k O)) (S k);+refine eq_resp_S;+fill k_IH;+Qed;+Freeze plusnO;++plusnSm:(n:Nat)(m:Nat)(Eq _ (plus n (S m)) (S (plus n m)));+intros;+induction n;+refine refl;+intros;+refine eq_resp_S;+fill k_IH;+Qed;+Freeze plusnSm;++plus_comm:(n:Nat)(m:Nat)(Eq _ (plus n m) (plus m n));+intros;+induction n;+refine sym;+refine plusnO;+intros;+equiv Eq _ (S (plus k m)) (plus m (S k));+replace k_IH;+refine sym;+refine plusnSm;+Qed;+Freeze plus_comm;++plus_assoc:(m,n,p:Nat)(Eq _ (plus m (plus n p)) (plus (plus m n) p));+intros;+induction m;+refine refl;+intros;+equiv Eq _ (S (plus k (plus n p))) (plus (S (plus k n)) p);+replace k_IH;+refine refl;+Qed;+Freeze plus_assoc;++plus_eq_fst : (m,n,p:Nat)(q:Eq _ (plus p m) (plus p n))(Eq _ m n);+intro m n p;+induction p;+intros;+fill q;+intros;+refine k_IH;+refine s_injective;+refine q0;+Qed;+Freeze plus_eq_fst;++plus_eq_fst_sym : (m,n,p:Nat)(q:Eq _ (plus m p) (plus n p))(Eq _ m n);+intro m n p;+replace plus_comm m p;+replace plus_comm n p;+fill plus_eq_fst m n p;+Qed;+Freeze plus_eq_fst_sym;++multnO:(n:Nat)(Eq _ (mult n O) O);+intro;+induction n;+refine refl;+intros;+equiv Eq _ (plus O (mult k O)) O;+replace k_IH;+refine refl;+Qed;+Freeze multnO;++multnSm:(n:Nat)(m:Nat)(Eq _ (mult n (S m)) (plus n (mult n m)));+intro;+induction n;+intros;+refine refl;+intros;+equiv Eq _ (S (plus m0 (mult k (S m0))))+             (S (plus k (plus m0 (mult k m0))));+refine eq_resp_S;+replace (k_IH m0);+generalise mult k m0;+intros;+replace (plus_comm m0 x);+replace (plus_assoc k x m0);+replace (plus_comm m0 (plus k x));+refine refl;+Qed;+Freeze multnSm;++mult_comm : (m,n:Nat) -> (Eq _ (mult m n) (mult n m));+intro m;+induction m;+intros;+replace (multnO n);+refine refl;+intros;+replace (multnSm n0 k);+replace sym (k_IH n0);+refine refl;+Qed;+Freeze mult_comm;++mult_distrib:(m,n,p:Nat)(Eq _ (plus (mult m p) (mult n p))+                              (mult (plus m n) p));+intros;+induction m;+refine refl;+intros;+equiv Eq _ (plus (plus p (mult k p)) (mult n p))+           (plus p (mult (plus k n) p));+replace sym k_IH;+generalise mult k p;+generalise mult n p;+intro x y;+replace plus_assoc p y x;+refine refl;+Qed;++mult_assoc:(m,n,p:Nat)(Eq _ (mult m (mult n p)) (mult (mult m n) p));+intro m;+induction m;+intros;+compute;+refine refl;+intros;+equiv Eq _ (plus (mult n0 p0) (mult k (mult n0 p0)))+           (mult (plus n0 (mult k n0)) p0);+replace k_IH n0 p0;+generalise mult k n0;+intros;+replace mult_distrib n0 x p0;+refine refl;+Qed;+
+ examplett/natsimpl.tt view
@@ -0,0 +1,65 @@+Data Nat:* = O:Nat | S:(k:Nat)Nat;++plus : (m:Nat)(n:Nat)Nat;+intro m;+induction m;+intros;+fill n;+intros;+refine S;+fill k_IH n0; +Qed;++adderType : (m:Nat)(n:Nat)*;+intros;+induction m;+fill Nat;+intros;+fill (n:Nat)k_IH;+Qed;++adder: (m:Nat)(n:Nat)(adderType m n);+intro m;+induction m;+intros;+fill n;+intros;+compute;+intros;+fill k_IH (plus n0 n1);+Qed;++mult:(m:Nat)(n:Nat)Nat;+intros;+induction m;+fill O;+intros;+fill (plus n k_IH);+Qed;++fact:(m:Nat)Nat;+intros;+induction m;+fill (S O);+intros;+fill (mult (S k) k_IH);+Qed;+++testval = fact (S (S (S (S (S (S (S (S (S O)))))))));++Data Vect (A:*):(n:Nat)* +    = vnil:Vect A O+    | vcons:(k:Nat)(x:A)(xs:Vect A k)Vect A (S k);++vectsum : (k:Nat)(v:Vect Nat k)Nat;+intros;+induction v;+fill O;+intros;+fill (plus x xs_IH);+Qed;++testvect2 = vcons _ _ (S O) (vcons _ _ (S (S (S O))) (vnil Nat));+testval2 = vectsum _ testvect2;+
+ examplett/partial.tt view
@@ -0,0 +1,53 @@+{- Uustalu, Altenkirch and Capretta's Partiality monad -}++Data Partial (A:*) : * = {- codata -}+    Now : (a:A)Partial A+  | Later : (p:Partial A)Partial A;++Declare never:(A:*)Partial A;+never = [A:*](Later _ (never A));++returnD = [A:*][a:A]Now _ a;++{- corecursive -}+Rec bindD : (A,B:*)(d:Partial A)(k:(a:A)(Partial B))Partial B;+intros;+case d;+intros;+fill k a;+intros;+fill Later _ (bindD _ _ p k);+Qed;++{- corecursive -}+Rec lfpAux : (A,B:*)(k:(a0:A)(Partial B))+   (f:(fk:(a1:A)Partial B)(fa:A)Partial B)(a:A)Partial B;+intros;+case f k a;+intros;+fill Now _ a0;+intros;+fill Later _ (lfpAux _ _ (f k) f a);+Qed;++lfp = [A,B:*][f:(k:(a:A)Partial B)((a:A)Partial B)][a:A]+        (lfpAux _ _ ([x:A]never B) f a);++Load "nat.tt";++fact : (x:Nat)Partial Nat;+intros;+refine lfp Nat;+intro factfn arg;+case arg;+refine returnD;+fill (S O);+intros;+case (factfn k);+intros;+refine returnD;+fill (mult a (S k));+intros;+fill p;+fill x;+Qed;
+ examplett/plus.tt view
@@ -0,0 +1,37 @@+Datatype Nat {+   TyCon Nat : *,+   Con O : Nat,+   Con S : (n:Nat)Nat,+   Elim natElim : (n:Nat)(P:(n:Nat)*)+                  (mz:(P O))+		  (ms:(k:Nat)(ih:(P n))(P (S k)))+		  (P n),+   Scheme O,P,mz,ms -> mz+   Scheme (S k),P,mz,ms -> ms k (natElim k P mz ms)+};++plus : (m:Nat)(n:Nat)Nat;+intro;+intro;+claim A:*;+claim mzero:A;+claim msuc:(k:Nat)(ih:A)A;+try natElim m ([n:Nat]A) mzero msuc;+mzero.try n;+solve;+msuc.focus;+attack M;+intro;+intro;+try (S ih);+solve;+M.cut;+msuc.solve;+msuc.cut;+H.solve;+H.cut;+mzero.cut;+plus.tidy;+solve;+Lift;+
+ examplett/staged.tt view
@@ -0,0 +1,41 @@+Load "nat.tt";++code = {'(plus (S (S O)) (S (S O)))};++plusQ = [a:Nat][b:Nat]{'plus a b};++Check code;+Eval code;++Eval  !code;++test = [a:Nat]{'[b:Nat]~(plusQ a b)};++test2 = {'[A:*][x:{{A}}]~(!{'x})};++++Eval test (S (S (S O)));+Eval !(test (S (S (S O)))) (S (S (S O)));++code2 = {'plus ~code ~code};+code3 = {'{'plus ~code ~code}};+code4 = [x:{{Nat}}]{'plus ~x ~x};++Eval code4 {'(plus (S O) (S O))};+Eval !(code4 {'(plus (S O) (S O))});++plusST : (m,n:{{Nat}}){{Nat}};+intros;+induction !m;+fill n;+intros;+fill {'S ~k_IH};+Qed;++val = code4 {'(plus (S O) (S O))};++Eval plusST val val;+Eval !(plusST val val);++Eval plusST;
+ examplett/stageplus.tt view
@@ -0,0 +1,39 @@+Load "nat.tt";++-- plusST = lam m,n:{{Nat}}.+--    case !m of+--       O -> n+--       S k -> {'S ~(plusST ~k n)}++plusST:(m,n:{{Nat}}){{Nat}};+intros;+induction !m;+fill n;+intros;+fill {'S ~k_IH};+Qed;++quote4 = {'plus (S (S O)) (S (S O))};++quote8 = plusST quote4 quote4;++Eval quote8;+Eval !quote8;++quotefoo = [m:Nat][n:Nat]{'plus (S (S O)) (([p:Nat](plus m p)) n)};++mult:(m,n:Nat)Nat;+intros;+induction m;+refine O;+intros;+refine (plus n k_IH);+Qed;++power:(m,x:Nat)Nat;+induction m;+fill (S O);+intros;+fill (mult x k_IH);+Qed;+
+ examplett/test.c view
@@ -0,0 +1,2576 @@+#include "closure.h"+#include <stdio.h>++#define FTAG_EVM_testval2 104+VAL _EVM_testval2();+#define FTAG_EVM_testvect2 103+VAL _EVM_testvect2();+#define FTAG_EVM_vectsum 100+VAL _EVM_vectsum(VAL v0,VAL v1);+#define FTAG_EVMSC_1_vectsum 101+VAL _EVMSC_1_vectsum(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_0_vectsum 102+VAL _EVMSC_0_vectsum(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVM_testvect 99+VAL _EVM_testvect();+#define FTAG_EVM_vtail 98+VAL _EVM_vtail(VAL v0,VAL v1,VAL v2);+#define FTAG_EVM_vtailAux 93+VAL _EVM_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_2_vtailAux 94+VAL _EVMSC_2_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7,VAL v8);+#define FTAG_EVMSC_3_vtailAux 95+VAL _EVMSC_3_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7,VAL v8,VAL v9);+#define FTAG_EVMSC_1_vtailAux 96+VAL _EVMSC_1_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVMSC_0_vtailAux 97+VAL _EVMSC_0_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVM_FinElim 92+VAL _EVM_FinElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVM_VectElim 91+VAL _EVM_VectElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVM_plus_eq_fst_sym 88+VAL _EVM_plus_eq_fst_sym(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_1_plus_eq_fst_sym 89+VAL _EVMSC_1_plus_eq_fst_sym(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_0_plus_eq_fst_sym 90+VAL _EVMSC_0_plus_eq_fst_sym(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVM_plus_eq_fst 78+VAL _EVM_plus_eq_fst(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_2_plus_eq_fst 79+VAL _EVMSC_2_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_8_plus_eq_fst 80+VAL _EVMSC_8_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7,VAL v8);+#define FTAG_EVMSC_7_plus_eq_fst 81+VAL _EVMSC_7_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6);+#define FTAG_EVMSC_6_plus_eq_fst 82+VAL _EVMSC_6_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6);+#define FTAG_EVMSC_5_plus_eq_fst 83+VAL _EVMSC_5_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7,VAL v8);+#define FTAG_EVMSC_4_plus_eq_fst 84+VAL _EVMSC_4_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6);+#define FTAG_EVMSC_3_plus_eq_fst 85+VAL _EVMSC_3_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6);+#define FTAG_EVMSC_1_plus_eq_fst 86+VAL _EVMSC_1_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_0_plus_eq_fst 87+VAL _EVMSC_0_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVM_plus_assoc 65+VAL _EVM_plus_assoc(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_4_plus_assoc 66+VAL _EVMSC_4_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVMSC_11_plus_assoc 67+VAL _EVMSC_11_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7);+#define FTAG_EVMSC_10_plus_assoc 68+VAL _EVMSC_10_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_9_plus_assoc 69+VAL _EVMSC_9_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_8_plus_assoc 70+VAL _EVMSC_8_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7);+#define FTAG_EVMSC_7_plus_assoc 71+VAL _EVMSC_7_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_6_plus_assoc 72+VAL _EVMSC_6_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_5_plus_assoc 73+VAL _EVMSC_5_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_3_plus_assoc 74+VAL _EVMSC_3_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_2_plus_assoc 75+VAL _EVMSC_2_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_1_plus_assoc 76+VAL _EVMSC_1_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_0_plus_assoc 77+VAL _EVMSC_0_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVM_plus_comm 61+VAL _EVM_plus_comm(VAL v0,VAL v1);+#define FTAG_EVMSC_1_plus_comm 62+VAL _EVMSC_1_plus_comm(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_2_plus_comm 63+VAL _EVMSC_2_plus_comm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVMSC_0_plus_comm 64+VAL _EVMSC_0_plus_comm(VAL v0,VAL v1,VAL v2);+#define FTAG_EVM_plusnSm 52+VAL _EVM_plusnSm(VAL v0,VAL v1);+#define FTAG_EVMSC_1_plusnSm 53+VAL _EVMSC_1_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_7_plusnSm 54+VAL _EVMSC_7_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6);+#define FTAG_EVMSC_6_plusnSm 55+VAL _EVMSC_6_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVMSC_5_plusnSm 56+VAL _EVMSC_5_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVMSC_4_plusnSm 57+VAL _EVMSC_4_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6);+#define FTAG_EVMSC_3_plusnSm 58+VAL _EVMSC_3_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVMSC_2_plusnSm 59+VAL _EVMSC_2_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVMSC_0_plusnSm 60+VAL _EVMSC_0_plusnSm(VAL v0,VAL v1,VAL v2);+#define FTAG_EVM_plusnO 49+VAL _EVM_plusnO(VAL v0);+#define FTAG_EVMSC_1_plusnO 50+VAL _EVMSC_1_plusnO(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_0_plusnO 51+VAL _EVMSC_0_plusnO(VAL v0,VAL v1);+#define FTAG_EVM_discriminate_Nat 47+VAL _EVM_discriminate_Nat(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_0_discriminate_Nat 48+VAL _EVMSC_0_discriminate_Nat(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVM_notn_S 44+VAL _EVM_notn_S(VAL v0);+#define FTAG_EVMSC_1_notn_S 45+VAL _EVMSC_1_notn_S(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_0_notn_S 46+VAL _EVMSC_0_notn_S(VAL v0,VAL v1);+#define FTAG_EVM_notO_S 40+VAL _EVM_notO_S(VAL v0,VAL v1);+#define FTAG_EVMSC_0_notO_S 41+VAL _EVMSC_0_notO_S(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_2_notO_S 42+VAL _EVMSC_2_notO_S(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_1_notO_S 43+VAL _EVMSC_1_notO_S(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVM_s_injective 36+VAL _EVM_s_injective(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_0_s_injective 37+VAL _EVMSC_0_s_injective(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_2_s_injective 38+VAL _EVMSC_2_s_injective(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_1_s_injective 39+VAL _EVMSC_1_s_injective(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVM_eq_resp_S 34+VAL _EVM_eq_resp_S(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_0_eq_resp_S 35+VAL _EVMSC_0_eq_resp_S(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVM_simplifyS 30+VAL _EVM_simplifyS(VAL v0,VAL v1);+#define FTAG_EVMSC_2_simplifyS 31+VAL _EVMSC_2_simplifyS(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVMSC_1_simplifyS 32+VAL _EVMSC_1_simplifyS(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_0_simplifyS 33+VAL _EVMSC_0_simplifyS(VAL v0,VAL v1,VAL v2);+#define FTAG_EVM_simplifyO 29+VAL _EVM_simplifyO(VAL v0);+#define FTAG_EVM_plus 28+VAL _EVM_plus(VAL v0,VAL v1);+#define FTAG_EVM_plus' 24+VAL _EVM_plus'(VAL v0);+#define FTAG_EVMSC_2_plus' 25+VAL _EVMSC_2_plus'(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_1_plus' 26+VAL _EVMSC_1_plus'(VAL v0,VAL v1);+#define FTAG_EVMSC_0_plus' 27+VAL _EVMSC_0_plus'(VAL v0,VAL v1);+#define FTAG_EVM_NatElim 23+VAL _EVM_NatElim(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVM_or_commutes 19+VAL _EVM_or_commutes(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_2_or_commutes 20+VAL _EVMSC_2_or_commutes(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_1_or_commutes 21+VAL _EVMSC_1_or_commutes(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_0_or_commutes 22+VAL _EVMSC_0_or_commutes(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVM_and_commutes 16+VAL _EVM_and_commutes(VAL v0,VAL v1,VAL v2);+#define FTAG_EVMSC_1_and_commutes 17+VAL _EVMSC_1_and_commutes(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVMSC_0_and_commutes 18+VAL _EVMSC_0_and_commutes(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVM_notElim 15+VAL _EVM_notElim(VAL v0,VAL v1,VAL v2);+#define FTAG_EVM_not 14+VAL _EVM_not(VAL v0);+#define FTAG_EVM_TrueElim 13+VAL _EVM_TrueElim(VAL v0,VAL v1,VAL v2);+#define FTAG_EVM_FalseElim 12+VAL _EVM_FalseElim(VAL v0,VAL v1);+#define FTAG_EVM_ExElim 11+VAL _EVM_ExElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVM_OrElim 10+VAL _EVM_OrElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVM_AndElim 9+VAL _EVM_AndElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4);+#define FTAG_EVM_eq_resp_f 7+VAL _EVM_eq_resp_f(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_0_eq_resp_f 8+VAL _EVMSC_0_eq_resp_f(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7);+#define FTAG_EVM_sym 5+VAL _EVM_sym(VAL v0,VAL v1,VAL v2,VAL v3);+#define FTAG_EVMSC_0_sym 6+VAL _EVMSC_0_sym(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVM_trans 3+VAL _EVM_trans(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_0_trans 4+VAL _EVMSC_0_trans(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7);+#define FTAG_EVM_repl 1+VAL _EVM_repl(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+#define FTAG_EVMSC_0_repl 2+VAL _EVMSC_0_repl(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7);+#define FTAG_EVM_EqElim 0+VAL _EVM_EqElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5);+VAL eval(VAL x) {+    if (x->ty != FUN) return x;+    else {+        function* f = (function*)(x -> info);+        switch(f->ftag) {+            EVALCASE(FTAG_EVM_testval2,0,_EVM_testval2());+            EVALCASE(FTAG_EVM_testvect2,0,_EVM_testvect2());+            EVALCASE(FTAG_EVM_vectsum,2,_EVM_vectsum(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVMSC_1_vectsum,6,_EVMSC_1_vectsum(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_0_vectsum,4,_EVMSC_0_vectsum(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVM_testvect,0,_EVM_testvect());+            EVALCASE(FTAG_EVM_vtail,3,_EVM_vtail(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVM_vtailAux,4,_EVM_vtailAux(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_2_vtailAux,9,_EVMSC_2_vtailAux(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6),FARG(7),FARG(8)));+            EVALCASE(FTAG_EVMSC_3_vtailAux,10,_EVMSC_3_vtailAux(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6),FARG(7),FARG(8),FARG(9)));+            EVALCASE(FTAG_EVMSC_1_vtailAux,5,_EVMSC_1_vtailAux(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVMSC_0_vtailAux,6,_EVMSC_0_vtailAux(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVM_FinElim,5,_EVM_FinElim(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVM_VectElim,6,_EVM_VectElim(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVM_plus_eq_fst_sym,3,_EVM_plus_eq_fst_sym(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_1_plus_eq_fst_sym,4,_EVMSC_1_plus_eq_fst_sym(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_0_plus_eq_fst_sym,4,_EVMSC_0_plus_eq_fst_sym(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVM_plus_eq_fst,3,_EVM_plus_eq_fst(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_2_plus_eq_fst,6,_EVMSC_2_plus_eq_fst(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_8_plus_eq_fst,9,_EVMSC_8_plus_eq_fst(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6),FARG(7),FARG(8)));+            EVALCASE(FTAG_EVMSC_7_plus_eq_fst,7,_EVMSC_7_plus_eq_fst(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6)));+            EVALCASE(FTAG_EVMSC_6_plus_eq_fst,7,_EVMSC_6_plus_eq_fst(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6)));+            EVALCASE(FTAG_EVMSC_5_plus_eq_fst,9,_EVMSC_5_plus_eq_fst(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6),FARG(7),FARG(8)));+            EVALCASE(FTAG_EVMSC_4_plus_eq_fst,7,_EVMSC_4_plus_eq_fst(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6)));+            EVALCASE(FTAG_EVMSC_3_plus_eq_fst,7,_EVMSC_3_plus_eq_fst(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6)));+            EVALCASE(FTAG_EVMSC_1_plus_eq_fst,4,_EVMSC_1_plus_eq_fst(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_0_plus_eq_fst,4,_EVMSC_0_plus_eq_fst(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVM_plus_assoc,3,_EVM_plus_assoc(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_4_plus_assoc,5,_EVMSC_4_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVMSC_11_plus_assoc,8,_EVMSC_11_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6),FARG(7)));+            EVALCASE(FTAG_EVMSC_10_plus_assoc,6,_EVMSC_10_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_9_plus_assoc,6,_EVMSC_9_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_8_plus_assoc,8,_EVMSC_8_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6),FARG(7)));+            EVALCASE(FTAG_EVMSC_7_plus_assoc,6,_EVMSC_7_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_6_plus_assoc,6,_EVMSC_6_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_5_plus_assoc,6,_EVMSC_5_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_3_plus_assoc,6,_EVMSC_3_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_2_plus_assoc,4,_EVMSC_2_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_1_plus_assoc,4,_EVMSC_1_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_0_plus_assoc,4,_EVMSC_0_plus_assoc(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVM_plus_comm,2,_EVM_plus_comm(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVMSC_1_plus_comm,4,_EVMSC_1_plus_comm(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_2_plus_comm,5,_EVMSC_2_plus_comm(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVMSC_0_plus_comm,3,_EVMSC_0_plus_comm(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVM_plusnSm,2,_EVM_plusnSm(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVMSC_1_plusnSm,4,_EVMSC_1_plusnSm(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_7_plusnSm,7,_EVMSC_7_plusnSm(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6)));+            EVALCASE(FTAG_EVMSC_6_plusnSm,5,_EVMSC_6_plusnSm(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVMSC_5_plusnSm,5,_EVMSC_5_plusnSm(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVMSC_4_plusnSm,7,_EVMSC_4_plusnSm(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6)));+            EVALCASE(FTAG_EVMSC_3_plusnSm,5,_EVMSC_3_plusnSm(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVMSC_2_plusnSm,5,_EVMSC_2_plusnSm(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVMSC_0_plusnSm,3,_EVMSC_0_plusnSm(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVM_plusnO,1,_EVM_plusnO(FARG(0)));+            EVALCASE(FTAG_EVMSC_1_plusnO,3,_EVMSC_1_plusnO(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_0_plusnO,2,_EVMSC_0_plusnO(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVM_discriminate_Nat,3,_EVM_discriminate_Nat(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_0_discriminate_Nat,4,_EVMSC_0_discriminate_Nat(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVM_notn_S,1,_EVM_notn_S(FARG(0)));+            EVALCASE(FTAG_EVMSC_1_notn_S,4,_EVMSC_1_notn_S(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_0_notn_S,2,_EVMSC_0_notn_S(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVM_notO_S,2,_EVM_notO_S(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVMSC_0_notO_S,4,_EVMSC_0_notO_S(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_2_notO_S,6,_EVMSC_2_notO_S(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_1_notO_S,5,_EVMSC_1_notO_S(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVM_s_injective,3,_EVM_s_injective(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_0_s_injective,4,_EVMSC_0_s_injective(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_2_s_injective,6,_EVMSC_2_s_injective(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_1_s_injective,5,_EVMSC_1_s_injective(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVM_eq_resp_S,3,_EVM_eq_resp_S(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_0_eq_resp_S,4,_EVMSC_0_eq_resp_S(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVM_simplifyS,2,_EVM_simplifyS(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVMSC_2_simplifyS,5,_EVMSC_2_simplifyS(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVMSC_1_simplifyS,3,_EVMSC_1_simplifyS(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_0_simplifyS,3,_EVMSC_0_simplifyS(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVM_simplifyO,1,_EVM_simplifyO(FARG(0)));+            EVALCASE(FTAG_EVM_plus,2,_EVM_plus(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVM_plus',1,_EVM_plus'(FARG(0)));+            EVALCASE(FTAG_EVMSC_2_plus',4,_EVMSC_2_plus'(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_1_plus',2,_EVMSC_1_plus'(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVMSC_0_plus',2,_EVMSC_0_plus'(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVM_NatElim,4,_EVM_NatElim(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVM_or_commutes,3,_EVM_or_commutes(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_2_or_commutes,4,_EVMSC_2_or_commutes(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_1_or_commutes,4,_EVMSC_1_or_commutes(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_0_or_commutes,4,_EVMSC_0_or_commutes(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVM_and_commutes,3,_EVM_and_commutes(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVMSC_1_and_commutes,5,_EVMSC_1_and_commutes(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVMSC_0_and_commutes,4,_EVMSC_0_and_commutes(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVM_notElim,3,_EVM_notElim(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVM_not,1,_EVM_not(FARG(0)));+            EVALCASE(FTAG_EVM_TrueElim,3,_EVM_TrueElim(FARG(0),FARG(1),FARG(2)));+            EVALCASE(FTAG_EVM_FalseElim,2,_EVM_FalseElim(FARG(0),FARG(1)));+            EVALCASE(FTAG_EVM_ExElim,5,_EVM_ExElim(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVM_OrElim,6,_EVM_OrElim(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVM_AndElim,5,_EVM_AndElim(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4)));+            EVALCASE(FTAG_EVM_eq_resp_f,6,_EVM_eq_resp_f(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_0_eq_resp_f,8,_EVMSC_0_eq_resp_f(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6),FARG(7)));+            EVALCASE(FTAG_EVM_sym,4,_EVM_sym(FARG(0),FARG(1),FARG(2),FARG(3)));+            EVALCASE(FTAG_EVMSC_0_sym,6,_EVMSC_0_sym(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVM_trans,6,_EVM_trans(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_0_trans,8,_EVMSC_0_trans(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6),FARG(7)));+            EVALCASE(FTAG_EVM_repl,6,_EVM_repl(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+            EVALCASE(FTAG_EVMSC_0_repl,8,_EVMSC_0_repl(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5),FARG(6),FARG(7)));+            EVALCASE(FTAG_EVM_EqElim,6,_EVM_EqElim(FARG(0),FARG(1),FARG(2),FARG(3),FARG(4),FARG(5)));+        }+    }+    return x;+}+VAL _EVM_testval2() {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp3 = MKCON0(0);+    tmp2 = MKCON1(1,tmp3);+    tmp1 = MKCON1(1,tmp2);+    tmp2 = _EVM_testvect2();+    return _EVM_vectsum(tmp1,tmp2);+}++VAL _EVM_testvect2() {++    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp3 = MKCON0(0);+    tmp2 = MKCON1(1,tmp3);+    tmp4 = MKCON0(0);+    tmp3 = MKCON1(1,tmp4);+    tmp5 = MKTYPE;+    tmp6 = MKCON0(0);+    tmp10 = MKCON0(0);+    tmp9 = MKCON1(1,tmp10);+    tmp8 = MKCON1(1,tmp9);+    tmp7 = MKCON1(1,tmp8);+    tmp9 = MKTYPE;+    tmp8 = MKCON1(0,tmp9);+    args = MKARGS(4);+    args[0] = tmp5;+    args[1] = tmp6;+    args[2] = tmp7;+    args[3] = tmp8;+    tmp4 = MKCONN(1,args,4);+    args = MKARGS(4);+    args[0] = tmp1;+    args[1] = tmp2;+    args[2] = tmp3;+    args[3] = tmp4;+    tmp0 = MKCONN(1,args,4);+    return tmp0;+}++VAL _EVM_vectsum(VAL v0,VAL v1) {++    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = v0;+    tmp3 = v1;+    tmp5 = v0;+    tmp6 = v1;+    tmp4 = CLOSURE2(FTAG_EVMSC_0_vectsum,2,tmp5,tmp6);+    tmp5 = MKCON0(0);+    tmp7 = v0;+    tmp8 = v1;+    tmp6 = CLOSURE2(FTAG_EVMSC_1_vectsum,2,tmp7,tmp8);+    return _EVM_VectElim(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_1_vectsum(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v3;+    tmp2 = v5;+    return _EVM_plus(tmp1,tmp2);+}++VAL _EVMSC_0_vectsum(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_testvect() {++    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKCON0(0);+    tmp4 = MKCON0(0);+    tmp3 = MKCON1(1,tmp4);+    tmp5 = MKTYPE;+    tmp4 = MKCON1(0,tmp5);+    args = MKARGS(4);+    args[0] = tmp1;+    args[1] = tmp2;+    args[2] = tmp3;+    args[3] = tmp4;+    tmp0 = MKCONN(1,args,4);+    return tmp0;+}++VAL _EVM_vtail(VAL v0,VAL v1,VAL v2) {++    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp2 = v1;+    tmp4 = v1;+    tmp3 = MKCON1(1,tmp4);+    tmp4 = v2;+    tmp6 = MKTYPE;+    tmp8 = v1;+    tmp7 = MKCON1(1,tmp8);+    args = MKARGS(2);+    args[0] = tmp6;+    args[1] = tmp7;+    tmp5 = MKCONN(0,args,2);+    tmp0 = CLOSURE5(FTAG_EVM_vtailAux,5,tmp1,tmp2,tmp3,tmp4,tmp5);+    return tmp0;+}++VAL _EVM_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp2 = v2;+    tmp3 = v3;+    tmp5 = v0;+    tmp6 = v1;+    tmp7 = v2;+    tmp8 = v3;+    tmp4 = CLOSURE4(FTAG_EVMSC_0_vtailAux,4,tmp5,tmp6,tmp7,tmp8);+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp5 = CLOSURE4(FTAG_EVMSC_1_vtailAux,4,tmp6,tmp7,tmp8,tmp9);+    tmp7 = v0;+    tmp8 = v1;+    tmp9 = v2;+    tmp10 = v3;+    tmp6 = CLOSURE4(FTAG_EVMSC_2_vtailAux,4,tmp7,tmp8,tmp9,tmp10);+    return _EVM_VectElim(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_2_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7,VAL v8) {++    VAL tmp14;+    VAL tmp13;+    VAL tmp12;+    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = v4;+    tmp3 = v1;+    tmp5 = MKTYPE;+    tmp6 = v1;+    tmp7 = v4;+    tmp9 = v1;+    tmp10 = v4;+    tmp11 = v8;+    tmp8 = _EVM_s_injective(tmp9,tmp10,tmp11);+    tmp4 = _EVM_sym(tmp5,tmp6,tmp7,tmp8);+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp10 = v4;+    tmp11 = v5;+    tmp12 = v6;+    tmp13 = v7;+    tmp14 = v8;+    args = MKARGS(9);+    args[0] = tmp6;+    args[1] = tmp7;+    args[2] = tmp8;+    args[3] = tmp9;+    args[4] = tmp10;+    args[5] = tmp11;+    args[6] = tmp12;+    args[7] = tmp13;+    args[8] = tmp14;+    tmp5 = CLOSUREN(FTAG_EVMSC_3_vtailAux,9,args,9);+    tmp6 = v6;+    return _EVM_repl(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_3_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7,VAL v8,VAL v9) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = v0;+    tmp3 = v9;+    tmp0 = CLOSUREADD2(tmp1,tmp2,tmp3);+    return tmp0;+}++VAL _EVMSC_1_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = MKTYPE;+    tmp3 = v0;+    tmp4 = v1;+    tmp1 = CLOSUREADD2(tmp2,tmp3,tmp4);+    tmp2 = v1;+    tmp4 = MKTYPE;+    tmp6 = v1;+    tmp5 = MKCON1(1,tmp6);+    tmp6 = MKCON0(0);+    tmp7 = v4;+    tmp3 = _EVM_sym(tmp4,tmp5,tmp6,tmp7);+    return _EVM_discriminate_Nat(tmp1,tmp2,tmp3);+}++VAL _EVMSC_0_vtailAux(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_FinElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    eval(v1);+    switch(TAG(v1)) {+    case 0:+    tmp1 = v3;+    tmp3 = v1;+    tmp2 = GETCONARG(tmp3,0);+    tmp0 = CLOSUREADD1(tmp1,tmp2);+    return tmp0;++    case 1:+    tmp1 = v4;+    tmp3 = v1;+    tmp2 = GETCONARG(tmp3,0);+    tmp4 = v1;+    tmp3 = GETCONARG(tmp4,1);+    tmp6 = v1;+    tmp5 = GETCONARG(tmp6,0);+    tmp7 = v1;+    tmp6 = GETCONARG(tmp7,1);+    tmp7 = v2;+    tmp8 = v3;+    tmp9 = v4;+    tmp4 = _EVM_FinElim(tmp5,tmp6,tmp7,tmp8,tmp9);+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;++    default:+    return NULL;+    }+}++VAL _EVM_VectElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    eval(v2);+    switch(TAG(v2)) {+    case 0:+    tmp0 = v4;+    return tmp0;++    case 1:+    tmp1 = v5;+    tmp3 = v2;+    tmp2 = GETCONARG(tmp3,1);+    tmp4 = v2;+    tmp3 = GETCONARG(tmp4,2);+    tmp5 = v2;+    tmp4 = GETCONARG(tmp5,3);+    tmp7 = v2;+    tmp6 = GETCONARG(tmp7,0);+    tmp8 = v2;+    tmp7 = GETCONARG(tmp8,1);+    tmp9 = v2;+    tmp8 = GETCONARG(tmp9,3);+    tmp9 = v3;+    tmp10 = v4;+    tmp11 = v5;+    tmp5 = _EVM_VectElim(tmp6,tmp7,tmp8,tmp9,tmp10,tmp11);+    tmp0 = CLOSUREADD4(tmp1,tmp2,tmp3,tmp4,tmp5);+    return tmp0;++    default:+    return NULL;+    }+}++VAL _EVM_plus_eq_fst_sym(VAL v0,VAL v1,VAL v2) {++    VAL tmp16;+    VAL tmp15;+    VAL tmp14;+    VAL tmp13;+    VAL tmp12;+    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp3 = v2;+    tmp4 = v0;+    tmp2 = _EVM_plus(tmp3,tmp4);+    tmp4 = v0;+    tmp5 = v2;+    tmp3 = _EVM_plus(tmp4,tmp5);+    tmp5 = MKTYPE;+    tmp7 = v0;+    tmp8 = v2;+    tmp6 = _EVM_plus(tmp7,tmp8);+    tmp8 = v2;+    tmp9 = v0;+    tmp7 = _EVM_plus(tmp8,tmp9);+    tmp9 = v0;+    tmp10 = v2;+    tmp8 = _EVM_plus_comm(tmp9,tmp10);+    tmp4 = _EVM_sym(tmp5,tmp6,tmp7,tmp8);+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp5 = CLOSURE3(FTAG_EVMSC_0_plus_eq_fst_sym,3,tmp6,tmp7,tmp8);+    tmp7 = MKTYPE;+    tmp9 = v2;+    tmp10 = v1;+    tmp8 = _EVM_plus(tmp9,tmp10);+    tmp10 = v1;+    tmp11 = v2;+    tmp9 = _EVM_plus(tmp10,tmp11);+    tmp11 = MKTYPE;+    tmp13 = v1;+    tmp14 = v2;+    tmp12 = _EVM_plus(tmp13,tmp14);+    tmp14 = v2;+    tmp15 = v1;+    tmp13 = _EVM_plus(tmp14,tmp15);+    tmp15 = v1;+    tmp16 = v2;+    tmp14 = _EVM_plus_comm(tmp15,tmp16);+    tmp10 = _EVM_sym(tmp11,tmp12,tmp13,tmp14);+    tmp12 = v0;+    tmp13 = v1;+    tmp14 = v2;+    tmp11 = CLOSURE3(FTAG_EVMSC_1_plus_eq_fst_sym,3,tmp12,tmp13,tmp14);+    tmp13 = v0;+    tmp14 = v1;+    tmp15 = v2;+    tmp12 = _EVM_plus_eq_fst(tmp13,tmp14,tmp15);+    tmp6 = _EVM_repl(tmp7,tmp8,tmp9,tmp10,tmp11,tmp12);+    return _EVM_repl(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_1_plus_eq_fst_sym(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVMSC_0_plus_eq_fst_sym(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_plus_eq_fst(VAL v0,VAL v1,VAL v2) {++    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v2;+    tmp3 = v0;+    tmp4 = v1;+    tmp5 = v2;+    tmp2 = CLOSURE3(FTAG_EVMSC_0_plus_eq_fst,3,tmp3,tmp4,tmp5);+    tmp4 = v0;+    tmp5 = v1;+    tmp6 = v2;+    tmp3 = CLOSURE3(FTAG_EVMSC_1_plus_eq_fst,3,tmp4,tmp5,tmp6);+    tmp5 = v0;+    tmp6 = v1;+    tmp7 = v2;+    tmp4 = CLOSURE3(FTAG_EVMSC_2_plus_eq_fst,3,tmp5,tmp6,tmp7);+    return _EVM_NatElim(tmp1,tmp2,tmp3,tmp4);+}++VAL _EVMSC_2_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp14;+    VAL tmp13;+    VAL tmp12;+    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v4;+    tmp4 = v3;+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp10 = v4;+    tmp11 = v5;+    args = MKARGS(6);+    args[0] = tmp6;+    args[1] = tmp7;+    args[2] = tmp8;+    args[3] = tmp9;+    args[4] = tmp10;+    args[5] = tmp11;+    tmp5 = CLOSUREN(FTAG_EVMSC_3_plus_eq_fst,6,args,6);+    tmp7 = v0;+    tmp8 = v1;+    tmp9 = v2;+    tmp10 = v3;+    tmp11 = v4;+    tmp12 = v5;+    args = MKARGS(6);+    args[0] = tmp7;+    args[1] = tmp8;+    args[2] = tmp9;+    args[3] = tmp10;+    args[4] = tmp11;+    args[5] = tmp12;+    tmp6 = CLOSUREN(FTAG_EVMSC_4_plus_eq_fst,6,args,6);+    tmp8 = v0;+    tmp9 = v1;+    tmp10 = v2;+    tmp11 = v3;+    tmp12 = v4;+    tmp13 = v5;+    args = MKARGS(6);+    args[0] = tmp8;+    args[1] = tmp9;+    args[2] = tmp10;+    args[3] = tmp11;+    args[4] = tmp12;+    args[5] = tmp13;+    tmp7 = CLOSUREN(FTAG_EVMSC_5_plus_eq_fst,6,args,6);+    tmp8 = v0;+    tmp3 = CLOSURE5(FTAG_EVM_NatElim,5,tmp4,tmp5,tmp6,tmp7,tmp8);+    tmp5 = v3;+    tmp7 = v0;+    tmp8 = v1;+    tmp9 = v2;+    tmp10 = v3;+    tmp11 = v4;+    tmp12 = v5;+    args = MKARGS(6);+    args[0] = tmp7;+    args[1] = tmp8;+    args[2] = tmp9;+    args[3] = tmp10;+    args[4] = tmp11;+    args[5] = tmp12;+    tmp6 = CLOSUREN(FTAG_EVMSC_6_plus_eq_fst,6,args,6);+    tmp8 = v0;+    tmp9 = v1;+    tmp10 = v2;+    tmp11 = v3;+    tmp12 = v4;+    tmp13 = v5;+    args = MKARGS(6);+    args[0] = tmp8;+    args[1] = tmp9;+    args[2] = tmp10;+    args[3] = tmp11;+    args[4] = tmp12;+    args[5] = tmp13;+    tmp7 = CLOSUREN(FTAG_EVMSC_7_plus_eq_fst,6,args,6);+    tmp9 = v0;+    tmp10 = v1;+    tmp11 = v2;+    tmp12 = v3;+    tmp13 = v4;+    tmp14 = v5;+    args = MKARGS(6);+    args[0] = tmp9;+    args[1] = tmp10;+    args[2] = tmp11;+    args[3] = tmp12;+    args[4] = tmp13;+    args[5] = tmp14;+    tmp8 = CLOSUREN(FTAG_EVMSC_8_plus_eq_fst,6,args,6);+    tmp9 = v1;+    tmp4 = CLOSURE5(FTAG_EVM_NatElim,5,tmp5,tmp6,tmp7,tmp8,tmp9);+    tmp5 = v5;+    tmp2 = _EVM_s_injective(tmp3,tmp4,tmp5);+    tmp0 = CLOSUREADD1(tmp1,tmp2);+    return tmp0;+}++VAL _EVMSC_8_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7,VAL v8) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v7;+    tmp3 = v8;+    tmp1 = CLOSUREADD1(tmp2,tmp3);+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVMSC_7_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6) {++    VAL tmp0;+    VAL* args;+    tmp0 = v6;+    return tmp0;+}++VAL _EVMSC_6_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVMSC_5_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7,VAL v8) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v7;+    tmp3 = v8;+    tmp1 = CLOSUREADD1(tmp2,tmp3);+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVMSC_4_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6) {++    VAL tmp0;+    VAL* args;+    tmp0 = v6;+    return tmp0;+}++VAL _EVMSC_3_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVMSC_1_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp0;+    VAL* args;+    tmp0 = v3;+    return tmp0;+}++VAL _EVMSC_0_plus_eq_fst(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_plus_assoc(VAL v0,VAL v1,VAL v2) {++    VAL tmp12;+    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp3 = v0;+    tmp4 = v1;+    tmp5 = v2;+    tmp2 = CLOSURE3(FTAG_EVMSC_0_plus_assoc,3,tmp3,tmp4,tmp5);+    tmp4 = MKTYPE;+    tmp6 = v1;+    tmp8 = v0;+    tmp9 = v1;+    tmp10 = v2;+    tmp7 = CLOSURE3(FTAG_EVMSC_1_plus_assoc,3,tmp8,tmp9,tmp10);+    tmp9 = v0;+    tmp10 = v1;+    tmp11 = v2;+    tmp8 = CLOSURE3(FTAG_EVMSC_2_plus_assoc,3,tmp9,tmp10,tmp11);+    tmp10 = v0;+    tmp11 = v1;+    tmp12 = v2;+    tmp9 = CLOSURE3(FTAG_EVMSC_3_plus_assoc,3,tmp10,tmp11,tmp12);+    tmp10 = v2;+    tmp5 = CLOSURE5(FTAG_EVM_NatElim,5,tmp6,tmp7,tmp8,tmp9,tmp10);+    args = MKARGS(2);+    args[0] = tmp4;+    args[1] = tmp5;+    tmp3 = MKCONN(0,args,2);+    tmp5 = v0;+    tmp6 = v1;+    tmp7 = v2;+    tmp4 = CLOSURE3(FTAG_EVMSC_4_plus_assoc,3,tmp5,tmp6,tmp7);+    return _EVM_NatElim(tmp1,tmp2,tmp3,tmp4);+}++VAL _EVMSC_4_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp19;+    VAL tmp18;+    VAL tmp17;+    VAL tmp16;+    VAL tmp15;+    VAL tmp14;+    VAL tmp13;+    VAL tmp12;+    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp4 = v3;+    tmp5 = v1;+    tmp3 = _EVM_plus(tmp4,tmp5);+    tmp4 = v2;+    tmp2 = _EVM_plus(tmp3,tmp4);+    tmp4 = v3;+    tmp6 = v1;+    tmp7 = v2;+    tmp5 = _EVM_plus(tmp6,tmp7);+    tmp3 = _EVM_plus(tmp4,tmp5);+    tmp5 = MKTYPE;+    tmp7 = v3;+    tmp9 = v1;+    tmp10 = v2;+    tmp8 = _EVM_plus(tmp9,tmp10);+    tmp6 = _EVM_plus(tmp7,tmp8);+    tmp9 = v3;+    tmp10 = v1;+    tmp8 = _EVM_plus(tmp9,tmp10);+    tmp9 = v2;+    tmp7 = _EVM_plus(tmp8,tmp9);+    tmp8 = v4;+    tmp4 = _EVM_sym(tmp5,tmp6,tmp7,tmp8);+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp10 = v4;+    tmp5 = CLOSURE5(FTAG_EVMSC_5_plus_assoc,5,tmp6,tmp7,tmp8,tmp9,tmp10);+    tmp7 = MKTYPE;+    tmp11 = v3;+    tmp13 = v0;+    tmp14 = v1;+    tmp15 = v2;+    tmp16 = v3;+    tmp17 = v4;+    tmp12 = CLOSURE5(FTAG_EVMSC_6_plus_assoc,5,tmp13,tmp14,tmp15,tmp16,tmp17);+    tmp14 = v0;+    tmp15 = v1;+    tmp16 = v2;+    tmp17 = v3;+    tmp18 = v4;+    tmp13 = CLOSURE5(FTAG_EVMSC_7_plus_assoc,5,tmp14,tmp15,tmp16,tmp17,tmp18);+    tmp15 = v0;+    tmp16 = v1;+    tmp17 = v2;+    tmp18 = v3;+    tmp19 = v4;+    tmp14 = CLOSURE5(FTAG_EVMSC_8_plus_assoc,5,tmp15,tmp16,tmp17,tmp18,tmp19);+    tmp15 = v1;+    tmp10 = CLOSURE5(FTAG_EVM_NatElim,5,tmp11,tmp12,tmp13,tmp14,tmp15);+    tmp12 = v0;+    tmp13 = v1;+    tmp14 = v2;+    tmp15 = v3;+    tmp16 = v4;+    tmp11 = CLOSURE5(FTAG_EVMSC_9_plus_assoc,5,tmp12,tmp13,tmp14,tmp15,tmp16);+    tmp13 = v0;+    tmp14 = v1;+    tmp15 = v2;+    tmp16 = v3;+    tmp17 = v4;+    tmp12 = CLOSURE5(FTAG_EVMSC_10_plus_assoc,5,tmp13,tmp14,tmp15,tmp16,tmp17);+    tmp14 = v0;+    tmp15 = v1;+    tmp16 = v2;+    tmp17 = v3;+    tmp18 = v4;+    tmp13 = CLOSURE5(FTAG_EVMSC_11_plus_assoc,5,tmp14,tmp15,tmp16,tmp17,tmp18);+    tmp14 = v2;+    tmp9 = CLOSURE5(FTAG_EVM_NatElim,5,tmp10,tmp11,tmp12,tmp13,tmp14);+    tmp8 = MKCON1(1,tmp9);+    args = MKARGS(2);+    args[0] = tmp7;+    args[1] = tmp8;+    tmp6 = MKCONN(0,args,2);+    return _EVM_repl(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_11_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v6;+    tmp3 = v7;+    tmp1 = CLOSUREADD1(tmp2,tmp3);+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVMSC_10_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp0;+    VAL* args;+    tmp0 = v5;+    return tmp0;+}++VAL _EVMSC_9_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVMSC_8_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v6;+    tmp3 = v7;+    tmp1 = CLOSUREADD1(tmp2,tmp3);+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVMSC_7_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp0;+    VAL* args;+    tmp0 = v5;+    return tmp0;+}++VAL _EVMSC_6_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVMSC_5_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKTYPE;+    tmp4 = v5;+    tmp3 = MKCON1(1,tmp4);+    tmp7 = v3;+    tmp8 = v1;+    tmp6 = _EVM_plus(tmp7,tmp8);+    tmp5 = MKCON1(1,tmp6);+    tmp6 = v2;+    tmp4 = _EVM_plus(tmp5,tmp6);+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;+}++VAL _EVMSC_3_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v4;+    tmp3 = v5;+    tmp1 = CLOSUREADD1(tmp2,tmp3);+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVMSC_2_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp0;+    VAL* args;+    tmp0 = v3;+    return tmp0;+}++VAL _EVMSC_1_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVMSC_0_plus_assoc(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKTYPE;+    tmp4 = v3;+    tmp6 = v1;+    tmp7 = v2;+    tmp5 = _EVM_plus(tmp6,tmp7);+    tmp3 = _EVM_plus(tmp4,tmp5);+    tmp6 = v3;+    tmp7 = v1;+    tmp5 = _EVM_plus(tmp6,tmp7);+    tmp6 = v2;+    tmp4 = _EVM_plus(tmp5,tmp6);+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;+}++VAL _EVM_plus_comm(VAL v0,VAL v1) {++    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp3 = v0;+    tmp4 = v1;+    tmp2 = CLOSURE2(FTAG_EVMSC_0_plus_comm,2,tmp3,tmp4);+    tmp4 = MKTYPE;+    tmp6 = v1;+    tmp7 = MKCON0(0);+    tmp5 = _EVM_plus(tmp6,tmp7);+    tmp7 = MKCON0(0);+    tmp8 = v1;+    tmp6 = _EVM_plus(tmp7,tmp8);+    tmp8 = v1;+    tmp7 = _EVM_plusnO(tmp8);+    tmp3 = _EVM_sym(tmp4,tmp5,tmp6,tmp7);+    tmp5 = v0;+    tmp6 = v1;+    tmp4 = CLOSURE2(FTAG_EVMSC_1_plus_comm,2,tmp5,tmp6);+    return _EVM_NatElim(tmp1,tmp2,tmp3,tmp4);+}++VAL _EVMSC_1_plus_comm(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp12;+    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp3 = v1;+    tmp4 = v2;+    tmp2 = _EVM_plus(tmp3,tmp4);+    tmp4 = v2;+    tmp5 = v1;+    tmp3 = _EVM_plus(tmp4,tmp5);+    tmp5 = MKTYPE;+    tmp7 = v2;+    tmp8 = v1;+    tmp6 = _EVM_plus(tmp7,tmp8);+    tmp8 = v1;+    tmp9 = v2;+    tmp7 = _EVM_plus(tmp8,tmp9);+    tmp8 = v3;+    tmp4 = _EVM_sym(tmp5,tmp6,tmp7,tmp8);+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp5 = CLOSURE4(FTAG_EVMSC_2_plus_comm,4,tmp6,tmp7,tmp8,tmp9);+    tmp7 = MKTYPE;+    tmp9 = v1;+    tmp11 = v2;+    tmp10 = MKCON1(1,tmp11);+    tmp8 = _EVM_plus(tmp9,tmp10);+    tmp11 = v1;+    tmp12 = v2;+    tmp10 = _EVM_plus(tmp11,tmp12);+    tmp9 = MKCON1(1,tmp10);+    tmp11 = v1;+    tmp12 = v2;+    tmp10 = _EVM_plusnSm(tmp11,tmp12);+    tmp6 = _EVM_sym(tmp7,tmp8,tmp9,tmp10);+    return _EVM_repl(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_2_plus_comm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKTYPE;+    tmp4 = v4;+    tmp3 = MKCON1(1,tmp4);+    tmp5 = v1;+    tmp7 = v2;+    tmp6 = MKCON1(1,tmp7);+    tmp4 = _EVM_plus(tmp5,tmp6);+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;+}++VAL _EVMSC_0_plus_comm(VAL v0,VAL v1,VAL v2) {++    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKTYPE;+    tmp4 = v2;+    tmp5 = v1;+    tmp3 = _EVM_plus(tmp4,tmp5);+    tmp5 = v1;+    tmp6 = v2;+    tmp4 = _EVM_plus(tmp5,tmp6);+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;+}++VAL _EVM_plusnSm(VAL v0,VAL v1) {++    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp3 = v0;+    tmp4 = v1;+    tmp2 = CLOSURE2(FTAG_EVMSC_0_plusnSm,2,tmp3,tmp4);+    tmp4 = MKTYPE;+    tmp6 = v1;+    tmp5 = MKCON1(1,tmp6);+    args = MKARGS(2);+    args[0] = tmp4;+    args[1] = tmp5;+    tmp3 = MKCONN(0,args,2);+    tmp5 = v0;+    tmp6 = v1;+    tmp4 = CLOSURE2(FTAG_EVMSC_1_plusnSm,2,tmp5,tmp6);+    return _EVM_NatElim(tmp1,tmp2,tmp3,tmp4);+}++VAL _EVMSC_1_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v2;+    tmp4 = v0;+    tmp5 = v1;+    tmp6 = v2;+    tmp7 = v3;+    tmp3 = CLOSURE4(FTAG_EVMSC_2_plusnSm,4,tmp4,tmp5,tmp6,tmp7);+    tmp5 = v0;+    tmp6 = v1;+    tmp7 = v2;+    tmp8 = v3;+    tmp4 = CLOSURE4(FTAG_EVMSC_3_plusnSm,4,tmp5,tmp6,tmp7,tmp8);+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp5 = CLOSURE4(FTAG_EVMSC_4_plusnSm,4,tmp6,tmp7,tmp8,tmp9);+    tmp7 = v1;+    tmp6 = MKCON1(1,tmp7);+    tmp1 = CLOSURE5(FTAG_EVM_NatElim,5,tmp2,tmp3,tmp4,tmp5,tmp6);+    tmp4 = v2;+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp5 = CLOSURE4(FTAG_EVMSC_5_plusnSm,4,tmp6,tmp7,tmp8,tmp9);+    tmp7 = v0;+    tmp8 = v1;+    tmp9 = v2;+    tmp10 = v3;+    tmp6 = CLOSURE4(FTAG_EVMSC_6_plusnSm,4,tmp7,tmp8,tmp9,tmp10);+    tmp8 = v0;+    tmp9 = v1;+    tmp10 = v2;+    tmp11 = v3;+    tmp7 = CLOSURE4(FTAG_EVMSC_7_plusnSm,4,tmp8,tmp9,tmp10,tmp11);+    tmp8 = v1;+    tmp3 = CLOSURE5(FTAG_EVM_NatElim,5,tmp4,tmp5,tmp6,tmp7,tmp8);+    tmp2 = MKCON1(1,tmp3);+    tmp3 = v3;+    return _EVM_eq_resp_S(tmp1,tmp2,tmp3);+}++VAL _EVMSC_7_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v5;+    tmp3 = v6;+    tmp1 = CLOSUREADD1(tmp2,tmp3);+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVMSC_6_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp0;+    VAL* args;+    tmp0 = v4;+    return tmp0;+}++VAL _EVMSC_5_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVMSC_4_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v5;+    tmp3 = v6;+    tmp1 = CLOSUREADD1(tmp2,tmp3);+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVMSC_3_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp0;+    VAL* args;+    tmp0 = v4;+    return tmp0;+}++VAL _EVMSC_2_plusnSm(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVMSC_0_plusnSm(VAL v0,VAL v1,VAL v2) {++    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKTYPE;+    tmp4 = v2;+    tmp6 = v1;+    tmp5 = MKCON1(1,tmp6);+    tmp3 = _EVM_plus(tmp4,tmp5);+    tmp6 = v2;+    tmp7 = v1;+    tmp5 = _EVM_plus(tmp6,tmp7);+    tmp4 = MKCON1(1,tmp5);+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;+}++VAL _EVM_plusnO(VAL v0) {++    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp3 = v0;+    tmp2 = CLOSURE1(FTAG_EVMSC_0_plusnO,1,tmp3);+    tmp4 = MKTYPE;+    tmp5 = MKCON0(0);+    args = MKARGS(2);+    args[0] = tmp4;+    args[1] = tmp5;+    tmp3 = MKCONN(0,args,2);+    tmp5 = v0;+    tmp4 = CLOSURE1(FTAG_EVMSC_1_plusnO,1,tmp5);+    return _EVM_NatElim(tmp1,tmp2,tmp3,tmp4);+}++VAL _EVMSC_1_plusnO(VAL v0,VAL v1,VAL v2) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v1;+    tmp3 = MKCON0(0);+    tmp1 = _EVM_plus(tmp2,tmp3);+    tmp2 = v1;+    tmp3 = v2;+    return _EVM_eq_resp_S(tmp1,tmp2,tmp3);+}++VAL _EVMSC_0_plusnO(VAL v0,VAL v1) {++    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKTYPE;+    tmp4 = v1;+    tmp5 = MKCON0(0);+    tmp3 = _EVM_plus(tmp4,tmp5);+    tmp4 = v1;+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;+}++VAL _EVM_discriminate_Nat(VAL v0,VAL v1,VAL v2) {++    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v1;+    tmp3 = v2;+    tmp1 = _EVM_notO_S(tmp2,tmp3);+    tmp3 = v0;+    tmp4 = v1;+    tmp5 = v2;+    tmp2 = CLOSURE3(FTAG_EVMSC_0_discriminate_Nat,3,tmp3,tmp4,tmp5);+    return _EVM_FalseElim(tmp1,tmp2);+}++VAL _EVMSC_0_discriminate_Nat(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp0;+    VAL* args;+    tmp0 = v0;+    return tmp0;+}++VAL _EVM_notn_S(VAL v0) {++    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp3 = v0;+    tmp2 = CLOSURE1(FTAG_EVMSC_0_notn_S,1,tmp3);+    tmp4 = MKCON0(0);+    tmp3 = CLOSURE1(FTAG_EVM_notO_S,1,tmp4);+    tmp5 = v0;+    tmp4 = CLOSURE1(FTAG_EVMSC_1_notn_S,1,tmp5);+    return _EVM_NatElim(tmp1,tmp2,tmp3,tmp4);+}++VAL _EVMSC_1_notn_S(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v2;+    tmp3 = v1;+    tmp5 = v1;+    tmp4 = MKCON1(1,tmp5);+    tmp5 = v3;+    tmp2 = _EVM_s_injective(tmp3,tmp4,tmp5);+    tmp0 = CLOSUREADD1(tmp1,tmp2);+    return tmp0;+}++VAL _EVMSC_0_notn_S(VAL v0,VAL v1) {++    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = MKTYPE;+    tmp3 = MKTYPE;+    tmp4 = v1;+    tmp6 = v1;+    tmp5 = MKCON1(1,tmp6);+    tmp1 = CLOSUREADD3(tmp2,tmp3,tmp4,tmp5);+    return _EVM_not(tmp1);+}++VAL _EVM_notO_S(VAL v0,VAL v1) {++    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKCON0(0);+    tmp4 = v0;+    tmp3 = MKCON1(1,tmp4);+    tmp4 = v1;+    tmp6 = v0;+    tmp7 = v1;+    tmp5 = CLOSURE2(FTAG_EVMSC_0_notO_S,2,tmp6,tmp7);+    tmp6 = MKCON0(0);+    return _EVM_EqElim(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_0_notO_S(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v2;+    tmp3 = v0;+    tmp4 = v1;+    tmp5 = v2;+    tmp6 = v3;+    tmp2 = CLOSURE4(FTAG_EVMSC_1_notO_S,4,tmp3,tmp4,tmp5,tmp6);+    tmp3 = MKTYPE;+    tmp5 = v0;+    tmp6 = v1;+    tmp7 = v2;+    tmp8 = v3;+    tmp4 = CLOSURE4(FTAG_EVMSC_2_notO_S,4,tmp5,tmp6,tmp7,tmp8);+    return _EVM_NatElim(tmp1,tmp2,tmp3,tmp4);+}++VAL _EVMSC_2_notO_S(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVMSC_1_notO_S(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_s_injective(VAL v0,VAL v1,VAL v2) {++    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKTYPE;+    tmp4 = v0;+    tmp5 = v1;+    tmp6 = v2;+    tmp3 = CLOSURE3(FTAG_EVMSC_0_s_injective,3,tmp4,tmp5,tmp6);+    tmp5 = v0;+    tmp4 = MKCON1(1,tmp5);+    tmp6 = v1;+    tmp5 = MKCON1(1,tmp6);+    tmp6 = v2;+    return _EVM_eq_resp_f(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_0_s_injective(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v3;+    tmp3 = v0;+    tmp4 = v1;+    tmp5 = v2;+    tmp6 = v3;+    tmp2 = CLOSURE4(FTAG_EVMSC_1_s_injective,4,tmp3,tmp4,tmp5,tmp6);+    tmp3 = v0;+    tmp5 = v0;+    tmp6 = v1;+    tmp7 = v2;+    tmp8 = v3;+    tmp4 = CLOSURE4(FTAG_EVMSC_2_s_injective,4,tmp5,tmp6,tmp7,tmp8);+    return _EVM_NatElim(tmp1,tmp2,tmp3,tmp4);+}++VAL _EVMSC_2_s_injective(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp0;+    VAL* args;+    tmp0 = v4;+    return tmp0;+}++VAL _EVMSC_1_s_injective(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_eq_resp_S(VAL v0,VAL v1,VAL v2) {++    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = MKTYPE;+    tmp4 = v0;+    tmp5 = v1;+    tmp6 = v2;+    tmp3 = CLOSURE3(FTAG_EVMSC_0_eq_resp_S,3,tmp4,tmp5,tmp6);+    tmp4 = v0;+    tmp5 = v1;+    tmp6 = v2;+    return _EVM_eq_resp_f(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_0_eq_resp_S(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v3;+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVM_simplifyS(VAL v0,VAL v1) {++    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp4 = v0;+    tmp6 = v0;+    tmp7 = v1;+    tmp5 = CLOSURE2(FTAG_EVMSC_0_simplifyS,2,tmp6,tmp7);+    tmp7 = v0;+    tmp8 = v1;+    tmp6 = CLOSURE2(FTAG_EVMSC_1_simplifyS,2,tmp7,tmp8);+    tmp8 = v0;+    tmp9 = v1;+    tmp7 = CLOSURE2(FTAG_EVMSC_2_simplifyS,2,tmp8,tmp9);+    tmp8 = v1;+    tmp3 = CLOSURE5(FTAG_EVM_NatElim,5,tmp4,tmp5,tmp6,tmp7,tmp8);+    tmp2 = MKCON1(1,tmp3);+    args = MKARGS(2);+    args[0] = tmp1;+    args[1] = tmp2;+    tmp0 = MKCONN(0,args,2);+    return tmp0;+}++VAL _EVMSC_2_simplifyS(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v3;+    tmp3 = v4;+    tmp1 = CLOSUREADD1(tmp2,tmp3);+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVMSC_1_simplifyS(VAL v0,VAL v1,VAL v2) {++    VAL tmp0;+    VAL* args;+    tmp0 = v2;+    return tmp0;+}++VAL _EVMSC_0_simplifyS(VAL v0,VAL v1,VAL v2) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_simplifyO(VAL v0) {++    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = v0;+    args = MKARGS(2);+    args[0] = tmp1;+    args[1] = tmp2;+    tmp0 = MKCONN(0,args,2);+    return tmp0;+}++VAL _EVM_plus(VAL v0,VAL v1) {++    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp2 = v1;+    tmp0 = CLOSURE2(FTAG_EVM_plus',2,tmp1,tmp2);+    return tmp0;+}++VAL _EVM_plus'(VAL v0) {++    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp3 = v0;+    tmp2 = CLOSURE1(FTAG_EVMSC_0_plus',1,tmp3);+    tmp4 = v0;+    tmp3 = CLOSURE1(FTAG_EVMSC_1_plus',1,tmp4);+    tmp5 = v0;+    tmp4 = CLOSURE1(FTAG_EVMSC_2_plus',1,tmp5);+    return _EVM_NatElim(tmp1,tmp2,tmp3,tmp4);+}++VAL _EVMSC_2_plus'(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp2 = v2;+    tmp3 = v3;+    tmp1 = CLOSUREADD1(tmp2,tmp3);+    tmp0 = MKCON1(1,tmp1);+    return tmp0;+}++VAL _EVMSC_1_plus'(VAL v0,VAL v1) {++    VAL tmp0;+    VAL* args;+    tmp0 = v1;+    return tmp0;+}++VAL _EVMSC_0_plus'(VAL v0,VAL v1) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_NatElim(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    eval(v0);+    switch(TAG(v0)) {+    case 0:+    tmp0 = v2;+    return tmp0;++    case 1:+    tmp1 = v3;+    tmp3 = v0;+    tmp2 = GETCONARG(tmp3,0);+    tmp5 = v0;+    tmp4 = GETCONARG(tmp5,0);+    tmp5 = v1;+    tmp6 = v2;+    tmp7 = v3;+    tmp3 = _EVM_NatElim(tmp4,tmp5,tmp6,tmp7);+    tmp0 = CLOSUREADD2(tmp1,tmp2,tmp3);+    return tmp0;++    default:+    return NULL;+    }+}++VAL _EVM_or_commutes(VAL v0,VAL v1,VAL v2) {++    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp2 = v1;+    tmp3 = v2;+    tmp5 = v0;+    tmp6 = v1;+    tmp7 = v2;+    tmp4 = CLOSURE3(FTAG_EVMSC_0_or_commutes,3,tmp5,tmp6,tmp7);+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp5 = CLOSURE3(FTAG_EVMSC_1_or_commutes,3,tmp6,tmp7,tmp8);+    tmp7 = v0;+    tmp8 = v1;+    tmp9 = v2;+    tmp6 = CLOSURE3(FTAG_EVMSC_2_or_commutes,3,tmp7,tmp8,tmp9);+    return _EVM_OrElim(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_2_or_commutes(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v1;+    tmp2 = v0;+    tmp3 = v3;+    args = MKARGS(3);+    args[0] = tmp1;+    args[1] = tmp2;+    args[2] = tmp3;+    tmp0 = MKCONN(0,args,3);+    return tmp0;+}++VAL _EVMSC_1_or_commutes(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v1;+    tmp2 = v0;+    tmp3 = v3;+    args = MKARGS(3);+    args[0] = tmp1;+    args[1] = tmp2;+    args[2] = tmp3;+    tmp0 = MKCONN(1,args,3);+    return tmp0;+}++VAL _EVMSC_0_or_commutes(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = v1;+    tmp3 = v0;+    tmp0 = CLOSUREADD2(tmp1,tmp2,tmp3);+    return tmp0;+}++VAL _EVM_and_commutes(VAL v0,VAL v1,VAL v2) {++    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp2 = v1;+    tmp3 = v2;+    tmp5 = v0;+    tmp6 = v1;+    tmp7 = v2;+    tmp4 = CLOSURE3(FTAG_EVMSC_0_and_commutes,3,tmp5,tmp6,tmp7);+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp5 = CLOSURE3(FTAG_EVMSC_1_and_commutes,3,tmp6,tmp7,tmp8);+    return _EVM_AndElim(tmp1,tmp2,tmp3,tmp4,tmp5);+}++VAL _EVMSC_1_and_commutes(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v1;+    tmp2 = v0;+    tmp3 = v4;+    tmp4 = v3;+    args = MKARGS(4);+    args[0] = tmp1;+    args[1] = tmp2;+    args[2] = tmp3;+    args[3] = tmp4;+    tmp0 = MKCONN(0,args,4);+    return tmp0;+}++VAL _EVMSC_0_and_commutes(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = v1;+    tmp3 = v0;+    tmp0 = CLOSUREADD2(tmp1,tmp2,tmp3);+    return tmp0;+}++VAL _EVM_notElim(VAL v0,VAL v1,VAL v2) {++    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v1;+    tmp2 = v2;+    tmp0 = CLOSUREADD1(tmp1,tmp2);+    return tmp0;+}++VAL _EVM_not(VAL v0) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_TrueElim(VAL v0,VAL v1,VAL v2) {++    VAL tmp0;+    VAL* args;+    eval(v0);+    switch(TAG(v0)) {+    case 0:+    tmp0 = v2;+    return tmp0;++    default:+    return NULL;+    }+}++VAL _EVM_FalseElim(VAL v0,VAL v1) {++    VAL tmp0;+    VAL* args;+    tmp0 = MKTYPE;+    return tmp0;+}++VAL _EVM_ExElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    eval(v2);+    switch(TAG(v2)) {+    case 0:+    tmp1 = v4;+    tmp3 = v2;+    tmp2 = GETCONARG(tmp3,2);+    tmp4 = v2;+    tmp3 = GETCONARG(tmp4,3);+    tmp0 = CLOSUREADD2(tmp1,tmp2,tmp3);+    return tmp0;++    default:+    return NULL;+    }+}++VAL _EVM_OrElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    eval(v2);+    switch(TAG(v2)) {+    case 0:+    tmp1 = v4;+    tmp3 = v2;+    tmp2 = GETCONARG(tmp3,2);+    tmp0 = CLOSUREADD1(tmp1,tmp2);+    return tmp0;++    case 1:+    tmp1 = v5;+    tmp3 = v2;+    tmp2 = GETCONARG(tmp3,2);+    tmp0 = CLOSUREADD1(tmp1,tmp2);+    return tmp0;++    default:+    return NULL;+    }+}++VAL _EVM_AndElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4) {++    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    eval(v2);+    switch(TAG(v2)) {+    case 0:+    tmp1 = v4;+    tmp3 = v2;+    tmp2 = GETCONARG(tmp3,2);+    tmp4 = v2;+    tmp3 = GETCONARG(tmp4,3);+    tmp0 = CLOSUREADD2(tmp1,tmp2,tmp3);+    return tmp0;++    default:+    return NULL;+    }+}++VAL _EVM_eq_resp_f(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp2 = v3;+    tmp3 = v4;+    tmp4 = v5;+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp10 = v4;+    tmp11 = v5;+    args = MKARGS(6);+    args[0] = tmp6;+    args[1] = tmp7;+    args[2] = tmp8;+    args[3] = tmp9;+    args[4] = tmp10;+    args[5] = tmp11;+    tmp5 = CLOSUREN(FTAG_EVMSC_0_eq_resp_f,6,args,6);+    tmp7 = v1;+    tmp9 = v2;+    tmp10 = v3;+    tmp8 = CLOSUREADD1(tmp9,tmp10);+    args = MKARGS(2);+    args[0] = tmp7;+    args[1] = tmp8;+    tmp6 = MKCONN(0,args,2);+    return _EVM_EqElim(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_0_eq_resp_f(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7) {++    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = v1;+    tmp4 = v2;+    tmp5 = v3;+    tmp3 = CLOSUREADD1(tmp4,tmp5);+    tmp5 = v2;+    tmp6 = v6;+    tmp4 = CLOSUREADD1(tmp5,tmp6);+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;+}++VAL _EVM_sym(VAL v0,VAL v1,VAL v2,VAL v3) {++    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp2 = v1;+    tmp3 = v2;+    tmp4 = v3;+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp5 = CLOSURE4(FTAG_EVMSC_0_sym,4,tmp6,tmp7,tmp8,tmp9);+    tmp7 = v0;+    tmp8 = v1;+    args = MKARGS(2);+    args[0] = tmp7;+    args[1] = tmp8;+    tmp6 = MKCONN(0,args,2);+    return _EVM_EqElim(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_0_sym(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = v0;+    tmp3 = v4;+    tmp4 = v1;+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;+}++VAL _EVM_trans(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp2 = v2;+    tmp3 = v3;+    tmp4 = v5;+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp10 = v4;+    tmp11 = v5;+    args = MKARGS(6);+    args[0] = tmp6;+    args[1] = tmp7;+    args[2] = tmp8;+    args[3] = tmp9;+    args[4] = tmp10;+    args[5] = tmp11;+    tmp5 = CLOSUREN(FTAG_EVMSC_0_trans,6,args,6);+    tmp6 = v4;+    return _EVM_EqElim(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_0_trans(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7) {++    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = MKTYPE;+    tmp2 = v0;+    tmp3 = v1;+    tmp4 = v6;+    tmp0 = CLOSUREADD3(tmp1,tmp2,tmp3,tmp4);+    return tmp0;+}++VAL _EVM_repl(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp11;+    VAL tmp10;+    VAL tmp9;+    VAL tmp8;+    VAL tmp7;+    VAL tmp6;+    VAL tmp5;+    VAL tmp4;+    VAL tmp3;+    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v0;+    tmp2 = v1;+    tmp3 = v2;+    tmp4 = v3;+    tmp6 = v0;+    tmp7 = v1;+    tmp8 = v2;+    tmp9 = v3;+    tmp10 = v4;+    tmp11 = v5;+    args = MKARGS(6);+    args[0] = tmp6;+    args[1] = tmp7;+    args[2] = tmp8;+    args[3] = tmp9;+    args[4] = tmp10;+    args[5] = tmp11;+    tmp5 = CLOSUREN(FTAG_EVMSC_0_repl,6,args,6);+    tmp6 = v5;+    return _EVM_EqElim(tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);+}++VAL _EVMSC_0_repl(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5,VAL v6,VAL v7) {++    VAL tmp2;+    VAL tmp1;+    VAL tmp0;+    VAL* args;+    tmp1 = v4;+    tmp2 = v6;+    tmp0 = CLOSUREADD1(tmp1,tmp2);+    return tmp0;+}++VAL _EVM_EqElim(VAL v0,VAL v1,VAL v2,VAL v3,VAL v4,VAL v5) {++    VAL tmp0;+    VAL* args;+    eval(v3);+    switch(TAG(v3)) {+    case 0:+    tmp0 = v5;+    return tmp0;++    default:+    return NULL;+    }+}+
+ examplett/test.tt view
@@ -0,0 +1,83 @@+Datatype Nat {+   TyCon Nat : *,+   Con O : Nat,+   Con S : (n:Nat)Nat,+   Elim natElim : (n:Nat)(P:(n:Nat)*)+                  (mz:(P O))+		  (ms:(k:Nat)(ih:(P n))(P (S k)))+		  (P n),+   Scheme O,P,mz,ms -> mz+   Scheme (S k),P,mz,ms -> ms k (natElim k P mz ms)+};++holey_plus = [m:Nat][n:Nat](?H:Nat. +	   (natElim n ([n:Nat]Nat) H ([k:Nat][ih:Nat](S ih))));+H. try m;+H. solve;+H. cut;+Prf;+holey_plus.solve;+Lift;++plus = [m:Nat][n:Nat](natElim n ([n:Nat]Nat) m ([k:Nat][ih:Nat](S ih)));+mult = [m:Nat][n:Nat](natElim n ([n:Nat]Nat) O ([k:Nat][ih:Nat](plus m ih)));+fact = [n:Nat](natElim n ([n:Nat]Nat) (S O) ([k:Nat][ih:Nat](mult ih (S k))));++double : (n:Nat)Nat;+double. attack H;+H. intro;+H. x:Nat;+H. y:Nat;+H. try plus x y;+H. solve;+y. try n;+y. solve;+x. try n; +x. solve;+double. solve;+Lift;++id : (A:*)(a:A)A;+id. attack H;+H. intro;+H. intro;+H. try a;+H. solve;+H. cut;+id. solve;+Lift;++Eval plus (S (S O)) (S (S O));++Datatype Vect {+   TyCon Vect : (A:*)(n:Nat)*,+   Con Vnil : (A:*)(Vect A O),+   Con Vcons : (A:*)(k:Nat)(a:A)(v:Vect A k)(Vect A (S k)),+   Elim VectElim : (A:*)+                   (n:Nat)+                   (v:Vect A n)+                   (P:(n:Nat)(v:Vect A n)*)+                   (mnil:(P O (Vnil A)))+                   (mcons:(k:Nat)(a:A)(v:Vect A k)(ih:P k v)+                          (P (S k) (Vcons A k a v)))+                   (P n v),+    Scheme A,O,(Vnil A),P,mnil,mcons -> mnil+    Scheme A,(S k),(Vcons A k a v),P,mnil,mcons +          -> mcons k a v (VectElim A k v P mnil mcons)+};++vectFold = [A:*][B:*][n:Nat][v:Vect A n][empty:B][tail:(a:A)(b:B)B]+	 (VectElim A n v ([n:Nat][v:Vect A n]B) empty+	     ([k:Nat][a:A][v:Vect A k][ih:B](tail a ih)));++Eval VectElim Nat O (Vnil Nat) ([n:Nat][v:Vect Nat n]Nat) +    (S O) ([k:Nat][a:Nat][v:Vect Nat k][ih:Nat](S ih));++Eval VectElim Nat (S (S O)) (Vcons Nat (S O) (S O) (Vcons Nat O (S O) (Vnil Nat)))+    ([n:Nat][v:Vect Nat n]Nat) (S O) ([k:Nat][a:Nat][v:Vect Nat k][ih:Nat](S (S ih)));++Output "rts/test";++Eval fact (S (S (S (S (S (S (S O)))))));++Quit;
+ examplett/vec.tt view
@@ -0,0 +1,13 @@+Load "nat.tt";++Data Vect (A:*) : (n:Nat)* =+   Vnil : (Vect A O)+ | Vcons : (k:Nat)(a:A)(v:Vect A k)(Vect A (S k));++vec_append : (A:*)(m,n:Nat)(xs:Vect A m)(ys:Vect A n)(Vect A (plus m n));+intros;+induction xs;+fill ys;+intros;+fill (Vcons _ _ a v_IH);+Qed;
+ examplett/vect.tt view
@@ -0,0 +1,76 @@+Load "fin.tt";++Data Vect (A:*):(n:Nat)* where+      vnil:Vect A O+    | vcons:(k:Nat)(x:A)(xs:Vect A k)Vect A (S k);++vappend : (A:*)->(n,m:Nat)->(xs:Vect A n)->(ys:Vect A m)->+           (Vect A (plus n m));+intros;+induction xs;+fill ys;+intros;+fill (vcons _ _ x xs_IH);+Qed;++vtail : (A:*)(k:Nat)(xs:Vect A (S k))Vect A k;+local vtailAux : (A:*)(k:Nat)(k':Nat)(xs:Vect A k')(p:Eq _ (S k) k')Vect A k;+Focus H;+intros;+refine (vtailAux _ k _ xs);+refine refl;+intro A k k' xs;+induction xs;+intros;+fill discriminate_Nat _ _ (sym _ _ _ p);+intros;+replace s_injective _ _ p0;+fill xs0;+Qed;++testvect = vcons _ _ (S O) (vnil Nat);++vectsum : (k:Nat)(v:Vect Nat k)Nat;+intros;+induction v;+fill O;+intros;+fill (plus x xs_IH);+Qed;++testvect2 = vcons _ _ (S O) (vcons _ _ (S (S (S O))) (vnil Nat));+testval2 = vectsum _ testvect2;++lookup:(A:*)(n:Nat)(i:Fin n)(xs:Vect A n)A;+local lookupAux:(A:*)(n:Nat)(i:Fin n)(n':Nat)(xs:Vect A n')(p:Eq _ n n')A;+intro A n i;+induction i;+intro k n' xs;+induction xs;+intros;+fill (discriminate_Nat _ _ (sym _ _ _ p));+intros;+fill x; {- fz (x::xs) -}+intro k i i_IH n' xs;+induction xs;+intros;+fill (discriminate_Nat _ _ (sym _ _ _ p0));+intros;+refine (i_IH k0);+fill xs0;+refine s_injective;+trivial;+intros;+refine (lookupAux _ _ i _ xs);+refine refl;+Qed;++lookupLt:(A:*)(n:Nat)(i:Nat)(p:Lt i n)(xs:Vect A n)A;+intros;+refine lookup;+fill n;+refine mkFin;+fill i;+fill p;+fill xs;+Qed;
+ ivor.cabal view
@@ -0,0 +1,78 @@+Name:           ivor+Version:        0.1.5+License:        BSD3+License-file:   LICENSE+Author:         Edwin Brady+Maintainer:     Edwin Brady <eb@dcs.st-and.ac.uk>+Homepage:       http://www.dcs.st-and.ac.uk/~eb/Ivor/++Stability:      experimental+Category:       Theorem provers+Synopsis:       Theorem proving library based on dependent type theory+Description:    Ivor is a type theory based theorem prover, with a+                Haskell API, designed for easy extending and embedding+                of theorem proving technology in Haskell+                applications. It provides an implementation of the+                type theory and tactics for building terms, more or+                less along the lines of systems such as Coq or Agda,+                and taking much of its inspiration from Conor+                McBride's presentation of OLEG.+                .+                The API provides a collection of primitive tactics and+                combinators for building new tactics. It is therefore+                possible to build new tactics to suit specific+                applications. Ivor features a dependent type theory+                similar to Luo's ECC with definitions (and similar to+                that implemented in Epigram), with dependent pattern+                matching, and experimental multi-stage programming+                support. Optionally, it can be extended with+                heterogeneous equality, primitive types and operations,+                new parser rules, user defined tactics and (if you+                want your proofs to be untrustworthy) a fixpoint+                combinator.++Data-files:     BUGS, INSTALL, TODO, docs/macros.ltx, docs/local.ltx, docs/tt.tex, docs/conclusion.tex,+                docs/intro.tex, docs/hcar.sty, docs/tactics.tex, docs/library.ltx,+                docs/shell.tex, docs/dtp.bib, docs/HCAR.tex, docs/Makefile,+                docs/combinators.tex, docs/humett.tex, docs/interface.tex,+                papers/tutorial/tutorial.tex, papers/tutorial/macros.ltx, papers/tutorial/theoremproving.tex,+                papers/tutorial/introduction.tex, papers/tutorial/hslibrary.tex, papers/tutorial/library.ltx,+                papers/tutorial/programming.tex, papers/tutorial/Makefile, papers/bib/literature.bib,+                papers/ivor/examples.tex, papers/ivor/code.tex, papers/ivor/macros.ltx,+                papers/ivor/ivor.tex, papers/ivor/corett.tex, papers/ivor/conclusions.tex,+                papers/ivor/intro.tex, papers/ivor/llncs.cls, papers/ivor/tactics.tex,+                papers/ivor/library.ltx, papers/ivor/dtp.bib, papers/ivor/alink.bib,+                papers/ivor/Makefile, papers/ivor/embounded.bib++Extra-source-files: emacs/ivor-mode.el, examplett/staged.tt, examplett/test.c, examplett/partial.tt, examplett/nat.tt,+                    examplett/vec.tt, examplett/lt.tt, examplett/Test.hs, examplett/plus.tt,+                    examplett/jmeq.tt, examplett/eq.tt, examplett/logic.tt, examplett/interp.tt,+                    examplett/stageplus.tt, examplett/Nat.hs, examplett/general.tt, examplett/natsimpl.tt,+                    examplett/test.tt, examplett/vect.tt, examplett/fin.tt, examplett/ack.tt,+                    IOvor/IOPrims.lhs, IOvor/Main.lhs, IOvor/iobasics.tt, Jones/Main.lhs,+                    lib/nat.tt, lib/lt.tt, lib/list.tt, lib/eq.tt,+                    lib/basics.tt, lib/logic.tt, lib/vect.tt, lib/fin.tt++++Build-depends:  base, parsec, mtl, plugins, directory+Build-type:     Simple++Extensions:     MultiParamTypeClasses, FunctionalDependencies,+                ExistentialQuantification, OverlappingInstances+-- Needs some -Wall cleanup+-- GHC-options:    -Wall++Exposed-modules:+                Ivor.TT, Ivor.Shell, Ivor.Primitives,+                Ivor.TermParser, Ivor.ViewTerm, Ivor.Equality,+                Ivor.Plugin, Ivor.Construction+Other-modules:  Ivor.Nobby, Ivor.TTCore, Ivor.State,+                Ivor.Tactics, Ivor.Typecheck, Ivor.Evaluator+                Ivor.Gadgets, Ivor.SC, Ivor.Bytecode,+                Ivor.CodegenC, Ivor.Datatype, Ivor.Display,+                Ivor.ICompile, Ivor.MakeData, Ivor.Unify,+                Ivor.Grouper, Ivor.ShellParser, Ivor.Constant,+                Ivor.RunTT, Ivor.Compiler, Ivor.Prefix,+                Ivor.PatternDefs,  Ivor.ShellState+
+ lib/basics.tt view
@@ -0,0 +1,15 @@+-- Some generally useful definitions+-- Heterogeneous equality, nats, maybe, bools, lists.++Load "eq.tt";+Load "nat.tt";++Data Maybe (A:*) : * +  = nothing : Maybe A+  | just : (a:A)(Maybe A);++Data Bool : * = true : Bool | false : Bool;++Data List (A:*) : * +  = nil : List A+  | cons : (x:A)->(xs:List A)->(List A);
+ lib/eq.tt view
@@ -0,0 +1,31 @@+Equality Eq refl;++repl : (A:*)(x:A)(y:A)(q:Eq _ _ x y)(P:(m:A)*)(p:P x)(P y);+intros;+by EqElim _ _ _ q;+fill p;+Qed;+Freeze repl;++trans : (A:*)(a:A)(b:A)(c:A)(p:Eq _ _ a b)(q:Eq _ _ b c)(Eq _ _ a c);+intros;+by EqElim _ _ _ q;+fill p;+Qed;+Freeze trans;++sym : (A:*)(a:A)(b:A)(p:Eq _ _ a b)(Eq _ _ b a);+intros;+by EqElim _ _ _ p;+refine refl;+Qed;+Freeze sym;++Repl Eq repl sym;++eq_resp_f:(A,B:*)(f:(a:A)B)(x:A)(y:A)(q:Eq _ _ x y)(Eq _ _ (f x) (f y));+intros;+by EqElim _ _ _ q;+refine refl;+Qed;+Freeze eq_resp_f;
+ lib/fin.tt view
@@ -0,0 +1,15 @@+Load "basics.tt";+Load "lt.tt";++Data Fin : (n:Nat)*+    = fz : (k:_)(Fin (S k))+    | fs : (k:_)(i:Fin k)(Fin (S k));++Match weaken : (n:_)(i:Fin n)->(Fin (S n)) =+    weaken _ (fz _) = fz _+  | weaken _ (fs _ i) = fs _ (weaken _ i);++Match fin2Nat : (n:_)(i:Fin n)->Nat =+    fin2Nat _ (fz _) = O+  | fin2Nat _ (fs _ i) = S (fin2Nat _ i);+
+ lib/list.tt view
@@ -0,0 +1,5 @@+Load "nat.tt";++Data List (A:*) : *+  = nil : List A+  | cons : (x:A)->(xs:List A)->(List A);
+ lib/logic.tt view
@@ -0,0 +1,39 @@+Data And (A:*)(B:*) : * = and_intro : (a:A)(b:B)(And A B);++Data Or (A:*)(B:*) : * +     = or_intro_l : (a:A)(Or A B)+     | or_intro_r : (b:B)(Or A B);++Data Ex (A:*)(P:(a:A)*) : * = ex_intro : (x:A)(p:P x)(Ex A P);++Data False : * = ;++Data True : * = II : True ;++not = [A:*](a:A)False;++notElim = [A:*][p:not A][pp:A](p pp);++Axiom classical:(P:*)(Or P (not P));++and_commutes : (A:*)(B:*)(p:And A B)(And B A);+intros;+induction p;+intros;+refine and_intro;+fill b;+fill a;+Qed;+Freeze and_commutes;++or_commutes : (A:*)(B:*)(p:Or A B)(Or B A);+intros;+induction p;+intros;+refine or_intro_r;+fill a;+intros;+refine or_intro_l;+fill b;+Qed;+Freeze or_commutes;
+ lib/lt.tt view
@@ -0,0 +1,55 @@+Load "basics.tt";++Data le : (m,n:Nat)* =+    leO : (n:_)(le O n)+  | leS : (m,n:_)(p:le m n)(le (S m) (S n));++Match leSuc : (m,n:Nat)(p:le m n)(le m (S n)) =+    leSuc _ _ (leO _) = leO _+  | leSuc _ _ (leS _ _ p) = leS _ _ (leSuc _ _ p);++Match leSym : (m:Nat)(le m m) =+    leSym O = leO _+  | leSym (S k) = leS _ _ (leSym k);++Match lePlus : (m,n:Nat)(le m (plus m n)) =+    lePlus O n = leO _+  | lePlus (S k) n = leS _ _ (lePlus k n);++Data Compare : (m,n:Nat)* =+    cmpLT : (k,m:Nat)(Compare m (plus m (S k)))+  | cmpEQ : (n:Nat)(Compare n n)+  | cmpGT : (k,n:Nat)(Compare (plus n (S k)) n);++Match Partial compareAux : (m,n:Nat)(Compare m n)->(Compare (S m) (S n)) =+    compareAux _ _ (cmpLT k _) = cmpLT k _+  | compareAux _ _ (cmpEQ n) = cmpEQ _+  | compareAux _ _ (cmpGT k _) = cmpGT k _;++Match compare : (m,n:Nat)(Compare m n) =+    compare O (S k) = cmpLT _ O+  | compare O O = cmpEQ _+  | compare (S k) O = cmpGT _ O+  | compare (S x) (S y) = compareAux _ _ (compare x y);++Match mkLTaux : (m,n:Nat)(Compare m n)->(Maybe (le m n)) =+    mkLTaux _ _ (cmpLT k m) = just _ (lePlus m (S k))+  | mkLTaux _ _ (cmpEQ m) = just _ (leSym m)+  | mkLTaux _ _ (cmpGT k m) = nothing _;++mkLT = [m,n:Nat](mkLTaux _ _ (compare m n));++isBounded : (n,min,max:Nat)(Maybe (And (le min n) (le n max)));+intros;+induction mkLT min n;+refine nothing;+intros;+induction mkLT n max;+refine nothing;+intros;+refine just;+refine and_intro;+refine a;+refine a0;+Qed;+
+ lib/nat.tt view
@@ -0,0 +1,173 @@+Load "eq.tt";+Load "logic.tt";++Data Nat:* = O:Nat | S:(k:Nat)Nat;++Match plus : Nat->Nat->Nat =+   plus O y = y+ | plus (S k) y = S (plus k y);++Match mult : Nat->Nat->Nat =+   mult O y = O+ | mult (S k) y = plus y (mult k y);++simplifyO:(n:_)(Eq _ _ (plus O n) n);+intros;+refine refl;+Qed;++simplifyS:(m,n:_)(Eq _ _ (plus (S m) n) (S (plus m n)));+intros;+refine refl;+Qed;++eq_resp_S:(n,m:_)(q:Eq _ _ n m)(Eq _ _ (S n) (S m));+intros;+fill (eq_resp_f _ _ S n m q);+Qed;+Freeze eq_resp_S;++s_injective:(n,m:_)(q:Eq _ _ (S n) (S m))(Eq _ _ n m);+intros;+local unS:(m:Nat)Nat;+intros;+induction m0;+fill n;+intros;+fill k;+fill eq_resp_f _ _ unS _ _ q;+Qed;+Freeze s_injective;++notO_S:(k:_)(not (Eq _ _ O (S k)));+intros;+compute;+intro q;+local dmotive : (x:Nat)(q:Eq _ _ O x)*;+intros;+induction x;+fill True;+intros;+fill False;+fill EqElim _ _ _ q dmotive II;+Qed;+Freeze notO_S;++notn_S:(n:_)(not (Eq _ _ n (S n)));+intro;+induction n;+fill notO_S O;+intros;+unfold not;+intros;+claim q:Eq _ _ k (S k);+fill k_IH q;+refine s_injective;+fill a;+Qed;+Freeze notn_S;++discriminate_Nat:(A,k:_)(q:Eq _ _ O (S k))A;+intros;+local false:False;+fill notO_S k q;+induction false;+Qed;+Freeze discriminate_Nat;++plusnO:(n:_)(Eq _ _ (plus n O) n);+intro;+induction n;+refine refl;+intros;+equiv Eq _ _ (S (plus k O)) (S k);+refine eq_resp_S;+fill k_IH;+Qed;+Freeze plusnO;++plusnSm:(n,m:_)(Eq _ _ (plus n (S m)) (S (plus n m)));+intros;+induction n;+refine refl;+intros;+refine eq_resp_S;+fill k_IH;+Qed;+Freeze plusnSm;++plus_comm:(n,m:_)(Eq _ _ (plus n m) (plus m n));+intros;+induction n;+refine sym;+refine plusnO;+intros;+equiv Eq _ _ (S (plus k m)) (plus m (S k));+replace k_IH;+refine sym;+refine plusnSm;+Qed;+Freeze plus_comm;++plus_assoc:(m,n,p:_)(Eq _ _ (plus m (plus n p)) (plus (plus m n) p));+intros;+induction m;+refine refl;+intros;+equiv Eq _ _ (S (plus k (plus n p))) (plus (S (plus k n)) p);+replace k_IH;+refine refl;+Qed;+Freeze plus_assoc;++plus_eq_fst : (m,n,p:_)(q:Eq _ _ (plus p m) (plus p n))(Eq _ _ m n);+intro m n p;+induction p;+intros;+fill q;+intros;+refine k_IH;+refine s_injective;+refine q0;+Qed;+Freeze plus_eq_fst;++plus_eq_fst_sym : (m,n,p:_)(q:Eq _ _ (plus m p) (plus n p))(Eq _ _ m n);+intro m n p;+replace plus_comm m p;+replace plus_comm n p;+intros;+fill plus_eq_fst m n p q;+Qed;+Freeze plus_eq_fst_sym;++multnO:(n:_)(Eq _ _ (mult n O) O);+intro;+induction n;+refine refl;+intros;+equiv Eq _ _ (plus O (mult k O)) O;+replace k_IH;+refine refl;+Qed;+Freeze multnO;++multnSm:(n,m:_)(Eq _ _ (mult n (S m)) (plus n (mult n m)));+intro;+induction n;+intros;+refine refl;+intros;+equiv Eq _ _ (S (plus m0 (mult k (S m0))))+             (S (plus k (plus m0 (mult k m0))));+refine eq_resp_S;+replace (k_IH m0);+generalise mult k m0;+intros;+replace (plus_comm m0 x);+replace (plus_assoc k x m0);+replace (plus_comm m0 (plus k x));+refine refl;+Qed;+Freeze multnSm;+
+ lib/vect.tt view
@@ -0,0 +1,13 @@+Load "basics.tt";+Load "fin.tt";++Data Vect (A:*):(n:Nat)* +    = vnil:Vect A O+    | vcons:(k:Nat)(x:A)(xs:Vect A k)Vect A (S k);++Match lookup : (A:*)(n:Nat)(i:Fin n)(xs:Vect A n)A =+    lookup _ _ (fz _) (vcons _ _ x xs) = x+  | lookup _ _ (fs _ i) (vcons _ _ x xs) = lookup _ _ i xs;++testvect = vcons _ _ O (vcons _ _ (S O) (vcons _ _ (S (S O)) (vnil Nat)));+testfin = fs _ (fz (S O));
+ papers/bib/literature.bib view
@@ -0,0 +1,3019 @@++@inproceedings{sheard-langfuture,+  author = {Tim Sheard},+  title = "Languages of the future",+  booktitle = "ACM Conference on Object Orientated Programming Systems, Languages and Applicatioons (OOPSLA'04)",+  year = "2004"+}++@inproceedings{ivor,+  author = {Edwin Brady},+  title = {{Ivor}, a proof engine},+  year = {2007},+  publisher = {Springer},+  series = {LNCS},+  booktitle = {Implementation and Application of Functional Languages 2006},+  note = {To appear}+}++@misc{coq-in-coq,+  author = {Bruno Barras and Benjamin Werner},+  year = 1997,+  title = {{Coq} in {Coq}}+}++@article{hudak-edsl,+  author = {Paul Hudak},+  title = {Building Domain-Specific Embedded Languages},+  year = {1996},+  month = {December},+  journal = {ACM Computing Surveys},+  volume = {28A},+  number = {4}+}++@inproceedings{concon,+  author = {Conor McBride and Healfdene Goguen and James McKinna},+  title = {Some Constructions On Constructors},+  year = 2005,+  booktitle = {TYPES 2004},+  publisher = {Springer},+  series = {LNCS},+  volume = {3839}+}++@InProceedings{Hume-GPCE,+author = {K. Hammond and G.J. Michaelson},+title = {{Hume: a Domain-Specific Language for Real-Time Embedded Systems}},+booktitle = {{Proc. Conf. Generative Programming and Component Engineering (GPCE~'03)}},+publisher = {Springer-Verlag},+series = {Lecture Notes in Computer Science},+year = {2003},+}++@inproceedings{lcf-milner,+  author = {Robin Milner},+  title = {{LCF}: A Way of Doing Proofs with a Machine},+  booktitle = {Mathematical Foundations of Computer Science 1978},+  pages = {146-159},+  year = 1979,+  series = {LNCS},+  volume = {64}+}+++@inproceedings{epireloaded,+  title = {Epigram Reloaded: A Standalone Typechecker for {ETT}},+  author = {James Chapman and Thorsten Altenkirch and Conor McBride},+  year = 2006,+  booktitle = {Trends in Functional Programming 2005},+  note = {To appear}+}++@TECHREPORT{why-tool,+  AUTHOR = {J.-C. Filli\^atre},+  TITLE = {{Why: a multi-language multi-prover verification tool}},+  INSTITUTION = {{LRI, Universit\'e Paris Sud}},+  TYPE = {{Research Report}},+  NUMBER = {1366},+  MONTH = {March},+  YEAR = 2003,+  URL = {http://www.lri.fr/~filliatr/ftp/publis/why-tool.ps.gz}+}++@misc{ large-extraction,+  author = "Lu\'iz Cruz-Filipe and Bas Spitters",+  title = "Program Extraction from Large Proof Developments",+  year = 2003,+  url = "citeseer.ist.psu.edu/cruz-filipe03program.html" }++@inproceedings{ fta,+    author = "Herman Geuvers and Freek Wiedijk and Jan Zwanenburg",+    title = "A Constructive Proof of the Fundamental Theorem of Algebra without Using the Rationals",+    booktitle = "{TYPES 2000}",+    pages = "96--111",+    year = "2000",+    url = "citeseer.ist.psu.edu/geuvers01constructive.html" }++@article{mckinna-expr,+   title = {A type-correct, stack-safe, provably correct, expression compiler in {Epigram}},+   author = {James McKinna and Joel Wright},+   year = 2007,+   journal = 	 {Journal of Functional Programming},+   note = {To appear}+}++@article{pugh-omega,+   title =  "The {Omega} {Test}: a fast and practical integer programming algorithm for dependence analysis",+   author = "William Pugh",+   journal = "Communication of the ACM",+   year = 1992,+   pages = {102--114}+}++@misc{four-colour,+  author = "Georges Gonthier",+  title = "A computer-checked proof of the {Four Colour Theorem}",+  year = 2005,+  howpublished = {\url{http://research.microsoft.com/~gonthier/4colproof.pdf}}}++@inproceedings{sparkle,+  author = "Maarten {de Mol} and Marko {van Eekelen} and Rinus Plasmeijer",+  title = "Theorem Proving for Functional Programmers",+  url = "citeseer.ist.psu.edu/654423.html",+  BOOKTITLE = {Proc. Implementation of Functional Languages (IFL 2002)},+  publisher = {Springer},+  series = {LNCS},+  volume = {2312},+  year = 2002+ }++@misc{agda,+   title = {Agda},+   author = {Catarina Coquand},+   howpublished= {\url{http://agda.sourceforge.net/}},+   year = 2005+}++@misc{cover,+   title = {Cover Translator},+   howpublished = {\url{http://coverproject.org/CoverTranslator/}}+}++@misc{parsec,+  title = {Parsec, a fast combinator parser},+  author = {Daan Leijen},+  year = {2001},+  howpublished = {\url{http://www.cs.uu.nl/~daan/parsec.html}}+}++@inproceedings{dtpmsp-gpce,+    author = {Edwin Brady and Kevin Hammond},+    title = {A Verified Staged Interpreter is a Verified Compiler},+    booktitle = {{Proc. Conf. Generative Programming and Component Engineering (GPCE~'06)}},+    year = 2006+}++@misc{haddock,+  title = {Haddock: A {Haskell} Documentation Tool},+  howpublished = {\url{http://www.haskell.org/haddock/}}+}++@inproceedings{offshoring,+  title = {Implicitly Heterogeneous Multi-Stage Programming},+  author = {Jason Eckhardt and Roumen Kaibachev and Emir Pa\v{s}al\'{i}c and Kedar Swadi and Walid Taha},+  booktitle = {Proc. 2005 Conf. on Generative Programming and Component Engineering (GPCE 2005)},+  publisher = {Springer},+  series = {LNCS},+  volume = {3676},+  year = 2005+}++@misc{alti-partial,+  title = {Stop thinking about bottoms when writing programs},+  author = {Thorsten Altenkirch},+  year = 2006,+  note = {Talk at BCTCS 2006}+}++@misc{tarmo-partial,+  title = {Partiality is an Effect},+  author = {Tarmo Uustalu},+  year = 2004,+  note = {Talk at Dagstuhl workshop on Dependently Typed Progamming}+}++@inproceedings{McKinnaPOPL06,+ author = {James McKinna},+ title = {Why dependent types matter},+ booktitle = {Proc. ACM Symp. on Principles of Programming Languages (POPL 2006)},+ year = {2006},+ issn = {0362-1340},+ pages = {1--1},+ doi = {http://doi.acm.org/10.1145/1111320.1111038},+}+++@inproceedings{leroy-compiler,+  title = {Formal Certification of a Compiler Back-end},+  author = {Xavier Leroy},+  year = 2006,+  booktitle = {Principles of Programming Languages 2006},+  pages = {42--54},+  publisher = {ACM Press}+}++@inproceedings{hutton-exceptions,+   title = {Compiling Exceptions Correctly},+   year = 2004,+   author = {Graham Hutton and Joel Wright},+   booktitle = {Mathematics of Program Construction},+   publisher = {Springer},+   series = {LNCS},+   volume = {3125}+}++@inproceedings{tagless-staged,+  title = {Tagless Staged Interpreters for Typed Languages},+  year = {2002},+  booktitle = {Proc. 2002 International Conf. on Functional Programming (ICFP 2002)},+  author = {Emir Pa\v{s}al\'{i}c and Walid Taha and Tim Sheard},+  publisher = {ACM}+}++@inproceedings{env-classifiers,+   title = {Environment Classifiers},+   year = 2003,+   author = {Walid Taha},+   booktitle = {Proc. ACM Symp. on Principles of Programming Languages (POPL 2003)},+   pages = {26--37},+}++@inproceedings{dsl-msp,+   title = {{DSL} Implementation in {MetaOCaml}, {Template Haskell}, {and C++}},+   booktitle = {Domain Specific Program Genearation 2004},+   author = {Krzysztof Czarnecki and John O'Donnell and J\"{o}rg Striegnitz and Walid Taha},+   publisher = {Springer},+   series = {LNCS},+   volume = {3016},+   year = 2004+}++@misc{ gadt-extk,+    author = {Tim Sheard and James Hook and Nathan Linger},+    title = {{GADTs} + Extensible Kinds = Dependent Programming},+    year = 2005,+    misc = {Submitted to ICFP '05}+}++@INPROCEEDINGS{dt-framework,+  TITLE = {A Dependently Typed Framework for Static Analysis of Program Execution Costs},+  YEAR = {2006},+  BOOKTITLE = {Proc. Implementation of Functional Languages (IFL 2005)},+  AUTHOR = {Edwin Brady and Kevin Hammond},+  VOLUME = {4015},+  SERIES = {LNCS},+  PAGES = {74--90},+  PUBLISHER = {Springer}+}++@INPROCEEDINGS{step-counting,+  TITLE = {Accurate Step Counting},+  YEAR = {2006},+  BOOKTITLE = {Proc. Implementation of Functional Languages (IFL 2005)},+  AUTHOR = {Catherine Hope and Graham Hutton},+  PUBLISHER = {Springer}+}++@misc{multi-taha,+    author = {Walid Taha},+    title = {A Gentle Introduction to Multi-stage Programming},+    year = {2003},+    note = {Available from \url{http://www.cs.rice.edu/~taha/publications/journal/dspg04a.pdf}}+}++@misc{mckinnabrady-phase,+   title = {Phase Distinctions in the Compilation of {Epigram}},+   year = 2005,+   author = {James McKinna and Edwin Brady},+   note = {Draft}+}++@phdthesis{ brady-thesis,+    author = {Edwin Brady},+    title = {Practical Implementation of a Dependently Typed Functional Programming Language},+    year = 2005,+    school = {University of Durham}+}++@phdthesis{ taha-thesis,+    author = {Walid Taha},+    title = {Multi-stage Programming:  Its Theory and Applications},+    year = 1999,+    school = {Oregon Graduate Inst. of Science and Technology}+}++@phdthesis{ pasalic-thesis,+    author = {Emir Pa\v{s}al\'{i}c},+    title = {The Role of Type-Equality in Meta-programming},+    year = 2004,+    school = {OGI School of Science and Engineering}+}++@misc{ydtm,+    author = {Thorsten Altenkirch and Conor McBride and James McKinna},+    title = {Why Dependent Types Matter},+    note = {Draft},+    year = 2005}+++@inproceedings { wadler-listless,+    author = {Philip Wadler},+    title = {Listlessness is better than laziness: {Lazy} evaluation and garbage collection at compile-time},+    booktitle = {Proceedings of the 1984 ACM Symposium on LISP and functional programming},+    year = 1984,+    pages = {45--52}+}++@techreport { gofer-impl,+    author = {Mark P. Jones},+    title = {The implementation of the Gofer functional programming system},+    month = {May},+    year = {1994},+    number = {YALEU/DCS/RR-1030},+    institution = {Yale University}+}++@techreport { pm-opt1,+    author = {Kevin Scott and Norman Ramsey},+    title = {When do match-compilation heuristics matter?},+    month = {May},+    year = {2000},+    number = {CS-2000-13},+    institution = {Department of Computer Science, University of Virginia}+}++@inproceedings{ pm-opt2,+    author = "Fabrice Le Fessant and Luc Maranget",+    title = "Optimizing Pattern Matching",+    booktitle = "International Conference on Functional Programming",+    pages = "26-37",+    year = "2001",+    url = "citeseer.ist.psu.edu/lefessant01optimizing.html" }++@incollection{con-engine,+  author = {G\'{e}rard Huet},+  title = {The constructive engine},+  booktitle = {A Perspective in Theoreticak Computer Science},+  publisher = {World Scientific Publishing},+  year = {1989},+  editor = {R. Narasimhan},+  note = {Commemorative Volume for Gift Siromoney},+  pages = {38--69}+}++@inproceedings{gadts,+  title = {Simple unification-based type inference for {GADTs}},+  author = {Simon {Peyton Jones} and Dimitrios Vytiniotis and Stephanie Weirich and Geoffrey Washburn},+  year = {2006},+  booktitle = {Proc. 2006 International Conf. on Functional Programming (ICFP 2006)}+}++@misc{wobbly,+  author = {Simon {Peyton Jones} and Geoffrey Washburn and Stephanie Weirich},+  title = {Wobbly types: type inference for generalised algebraic data types},+  year = {2004},+  note = {Submitted to POPL 2005}+}++@misc{epigram-afp,+    author = {Conor McBride},+    title = {Epigram: Practical Programming with Dependent Types},+    year = {2004},+    howpublished = {Lecture Notes, International Summer School on Advanced Functional Programming}+}++@book{ml85,+    author = {Per Martin-L\"{o}f},+    title = "Intuitionistic Type Theory",+    year = "1985",+    publisher = "Bibliopolis"+}   ++@article{modular-fulllazy,+  title = {A Modular Fully Lazy Lambda Lifter in {Haskell}},+  author = {Simon {Peyton Jones} and David Lester},+  year = {1991},+  month = {May},+  journal = {Software Practice and Experience},+  volume = {21},+  number = {5},+  pages = {479--506}+}++@article{ghani-jay95,+  author = 	 {Barry Jay and Neil Ghani},+  title = 	 {The Virtues of Eta-Expansion},+  journal = 	 {Journal of Functional Programming},+  year = 	 {1995},+  volume = 	 {5},+  number = 	 {2},+  pages = 	 {135-154},+}++@misc{nkpat,+    author = {Lennart Augustsson},+    title = {n+k patterns},+    year = {1993},+    howpublished = {Message to the haskell mailing list, Mon, 17 May 93}+}++@article{ danvy98functional,+    author = "Olivier Danvy",+    title = "Functional Unparsing",+    journal = "Journal of Functional Programming",+    volume = "8",+    number = "6",+    pages = "621-625",+    year = "1998",+    url = "citeseer.ist.psu.edu/danvy98functional.html" }++@inproceedings{SeveriPoll94,+   author = {Paula Severi and Erik Poll},+   booktitle = {Logical Foundations of Computing Science, LFCS'94},+   editor = {A. Nerode and Yu. V. Matiyasevich},+   number = {813},+   pages = {316--328},+   publisher = {Springer},+   series = {LNCS},+   title = {{P}ure {T}ype {S}ystems with {D}efinitions},+   year = {1994}+}++@inproceedings{coinductive,+  title = {An Application of Co-Inductive Types in Coq: Verification of the Alternating Bit Protocol},+  booktitle = {Proceedings of the 1995 Workshop on Types for Proofs and Programs},+  series = {LNCS},+  year = {1995},+  volume = {1158}, +  pages = {135-152},+  publisher = {Springer-Verlag},+  author = {Eduardo Gim\'{e}nez}+}++@book{erlang,+    author = "Joe Armstrong and Robert Virding and Claes Wikstr{\"o}m and Mike Williams",+    title = "Concurrent Programming in Erlang",+    edition = "Second",+    publisher = "Prentice-Hall",+    year = "1996",+    url = "citeseer.ist.psu.edu/armstrong93concurrent.html" +}++@PhdThesis{alti:phd93,+  author =       "Thorsten Altenkirch",+  title =        "Constructions, Inductive Types and Strong Normalization",+  school =       "University of Edinburgh",+  year =         "1993",+  month =        "November",+}++@inproceedings{coq-modules,+  author = "Jacek Chrzaszcz",+  title = "Modules in {Coq} Are and Will Be Correct",+  year = {2004},+   booktitle = {Types for Proofs and Programs 2003},+   editor = {Stefano Berardi and Mario Coppo and Ferruccio Damiani},+   publisher = {Springer},+   volume = {3085}+}++@inproceedings{comp-polymorphism,+  author = "Robert Harper and Greg Morrisett",+  title = "Compiling Polymorphism Using Intensional Type Analysis",+  year = "1995",+  booktitle = "Proceedings of the 22nd ACM SIGPLAN-SIGACT symposium on Principles of programming languages",+  pages = "130 -- 141"+}++@misc{runtime-loader,+  author = "Andre Pang",+  title = "{GHC} Runtime Loading",+  year = "2004",+  howpublished = {Available from \verb+http://www.algorithm.com.au/wiki/hacking/haskell.ghc_runtime_loading+}+}++@article{mccarthy-lisp,+  author = "John McCarthy",+  title = "Recursive Functions of Symbolic Expressions and Their Computation By Machine",+  year = "1960",+  journal = "Communications of the ACM",+  volume = "3",+  number = "4",+  pages = "184--195"+}++@book{stl,+  author = " David R. Musser and Atul Saini and Gillmer J. Derge",+  title= "The {STL} Tutorial and Reference Guide: {C++} Programming with the Standard Template Library",+  year = "2001",+  publisher = "Addison Wesley"+}++@misc{ phase-distinction,+    author = "Luca Cardelli",+    title = "Phase Distinctions in Type Theory",+    howpublished = "Manuscript",+    year = "1988",+    url = "citeseer.ist.psu.edu/cardelli88phase.html" }++@book {pierce-types,+  author = "Benjamin C. Pierce",+  title = "Type and Programming Languages",+  year = "2002",+  publisher = "MIT Press"+}++@article{ coqcc,+  Author = "Thierry Coquand and G\'{e}rard Huet",+  title = "The calculus of constructions",+  year = "1988",+  journal = "Information and Computation",+  volume = "76",+  pages = "95--120"+}++@article{ miller91jlc,+  Author = "Dale Miller",+  Title = "A Logic Programming Language with Lambda-Abstraction,+    Function Variables, and Simple Unification",+  Journal = "Journal of Logic and Computation",+  Volume = "1",+  Number = "4",+  Pages = "497-536",+  Year = "1991",+  URL = "citeseer.ist.psu.edu/miller91logic.html",+  URL = "file://ftp.cis.upenn.edu/pub/papers/miller/jlc91.dvi.Z" }++@article{miller-unity,+   author = "Dale Miller",+   title = "Unification Under a Mixed Prefix",+   journal = "Journal of Symbolic Computation",+   volume = "14",+   pages = "321--358",+   year = 1992+}++@inproceedings{ cynthia,+    author = "Jon Whittle and Alan Bundy and Richard J. Boulton and Helen Lowe",+    title = "An {ML} Editor Based on Proofs-As-Programs",+    booktitle = "Automated Software Engineering",+    pages = "166-173",+    year = "1999",+    url = "citeseer.ist.psu.edu/whittle99ml.html" }+++@misc{ewd340,+   title={The Humble Programmer},+   author={Edsger Dijkstra},+   year={1972},+   note={Turing Award Lecture, EWD 340}+}++@misc{fortran,+   title={Specifications for the {IBM} Mathematical FORmula TRANslating System, {FORTRAN}},+   author={{IBM Applied Science Division}},+   key={IBM},+   year={1954},+   month={November}+}++@inproceedings{quickcheck,+   title = {{QuickCheck}: A Lightweight Tool For Random Testing Of {Haskell} Programs},+   author = {Koen Claessen and John Hughes},+   year = {2000},+   booktitle = {International Conference on Functional Programming}+}++@inproceedings{currylam,+   title = {Functionality in Combinatory Logic},+   author = {Haskell Curry},+   year = {1934},+   booktitle = {Proc. Nat. Acad. Sci, USA},+   volume = {20},+   pages = {584--590}+}++@article{churchsimplelam1,+   title = {A set of postulates for the foundation of logic},+   author = {Alonzo Church},+   year = {1932},+   journal = {Annals of Mathematics},+   volume = {2},+   number = {33},+   pages = {346--366}+}++@article{churchsimplelam2,+   title = {A set of postulates for the foundation of logic},+   author = {Alonzo Church},+   year = {1933},+   journal = {Annals of Mathematics},+   volume = {2},+   number = {34},+   pages = {839--864}+}++@article{churchlam,+   title = {A Formulation of the Simple Theory of Types},+   author = {Alonzo Church},+   year = {1940},+   journal = {Journal of Symbolic Logic},+   volume = {5},+   pages = {56--58}+}++@book{mitchell,+   title = {Concepts in Programming Languages},+   author = {John C. Mitchell},+   year = {2003},+   publisher = {Cambridge University Press}+}++@inproceedings{harrison-hol99,+   title = {A Machine-Checked Theory of Floating Point Arithmetic},+   year = {1999},+   booktitle = {Theorem Proving in Higher Order Logics: 12th International Conference, TP},+   pages = {113--130},+   author = {John Harrison},+   crossref = {hol99}+}++@inproceedings{c--,+   title = {C--: A portable assembly language},+   year = {1997},+   booktitle = {Workshop on Implementing Functional Languages, St Andrews},+   author = {Simon {Peyton Jones} and Thomas Nordin and Dino Oliva},+   crossref = {func-imp97}+}++@proceedings{func-imp97,+   title = {Workshop on Implementing Functional Languages, St Andrews},+   year = {1997},+   editor = {C Clack},+   publisher = {Springer-Verlag}+}++@proceedings{hol99,+   volume = {1690},+   title = {Theorem Proving in Higher Order Logics:        12th International Conference, TPHOLs'99},+   year = {1999},+   editor = {Yves Bertot and Gilles Dowek and Andr{\'e}        Hirschowitz and Christine Paul},+   publisher = {Springer-Verlag},+   address = {Nice, France},+   series = {LNCS}+}++@book{mathlogic,+   title = {Mathematical Logic and Programming Languages},+   year = {1985},+   editor = {C.A.R. Hoare and J.C. Shepherdson},+   publisher = {Prentice-Hall}+}++@book{automath,+   title = {Selected Papers on Automath},+   year = {1994},+   editor = {S. Abramsky and J. Barwise and K. Fine and H.J. Keisler and        A.S. Troelstr},+   publisher = {North-Holland}+}++@misc{gimps,+   howpublished = {http://www.mersenne.org/prime.htm},+   title = {Great Internet Mersenne Prime Search}+}++@misc{haskell-report,+   title = {Haskell 98 Language and Libraries --- The Revised Report},+   year = {2002},+   month = {December},+   author = {Simon {Peyton Jones} and others},+   howpublished = {Available from \verb+http://www.haskell.org/+}+}++@inproceedings{cayenne-icfp,+    author = "Lennart Augustsson",+    title = "Cayenne - a Language with Dependent Types",+    booktitle = "Proc. 1998 International Conf. on Functional Programming (ICFP '98)",+    pages = "239--250",+    year = "1998",+    url = "citeseer.nj.nec.com/augustsson98cayenne.html" +}+++@misc{equality-cayenne,+   howpublished = {\verb+http://www.cs.chalmers.se/~augustss/cayenne/+},+   title = {Equality Proofs in Cayenne},+   year = {1999},+   author = {Lennart Augustsson}+}++@misc{interp-cayenne,+   howpublished = {\url{http://www.cs.chalmers.se/~augustss/cayenne/}},+   title = {An exercise in dependent types: A well-typed interpreter},+   year = {1999},+   author = {Lennart Augustsson and Magnus Carlsson}+}++@inproceedings{balaa00fixpoint,+   title = {Fix-Point Equations for Well-Founded Recursion in Type Theory},+   year = {2000},+   booktitle = {Theorem Proving in Higher Order Logics},+   pages = {1-16},+   author = {Antonia Balaa and Yves Bertot}+}++@inproceedings{isabelle-maple,+   title = {Theorems and algorithms: An interface between Isabelle and Maple},+   year = {1995},+   booktitle = {International Symposium on Symbolic and Algebraic Computation},+   author = {Ballarin, C. and Homann, K., and Calmet, J.}+}++@book{barendregt-num,+   title = {The Lambda Calculus, Its Syntax and Semantics},+   year = {1984},+   publisher = {North-Holland},+   author = {Henk Barendregt}+}++@book{beiler,+   title = {Recreations in the Theory of Numbers},+   year = {1964},+   publisher = {Dover},+   author = {Albert H. Beiler}+}++@article{multidigit,+   journal = {Advances in Applied Mathematics},+   title = {Multidigit Multiplication for Mathematicians},+   year = {1998},+   author = {Daniel J. Bernstein}+}++@article{buhler-fox,+   journal = {ACM Crossroads 2.1.},+   month = {September},+   title = {The Fox project: A language-structured approach to networking        software.},+   year = {1995},+   author = {Buhler, J.},+   note = {Available at http://www.acm.org/crossroads/xrds2-1/foxnet.html}+}++@techreport{burstall91,+   title = {Computer Assisted Proof for Mathematics: an Introduction Using        the \textsc{Lego} Proof System},+   year = {1991},+   institution = {University of Edinburgh},+   author = {Rod Burstall}+}++@article{plastic,+   title = {An Implementation of {LF} with Coercive Subtyping and Universes}, +   author = {Paul Callaghan and Zhaohui Luo},+   journal = {Journal of Automated Reasoning},+   volume = {27},+   number = {1},+   pages = {3--27},+   year = {2001}+}++@article{coercive,+   title = {Coercive subtyping},+   author = {Zhaohui Luo},+   journal = {J. Logic Comput.},+   volume = {9},+   number = {1},+   year = {1991},+   pages = {105--130}+}++@inproceedings{calmet-homann,+   title = {Classification of communication and cooperation mechanisms for        logical and symbolic computation systems},+   year = {1996},+   booktitle = {Proceedings of the First International Workshop 'Frontiers of        Combining S},+   pages = {133-146},+   publisher = {Kluwer},+   author = {J. Calmet and K. Homann}+}++@techreport{comm-proofs,+   title = {On Communicating Proofs in Interactive Mathematical Documents},+   year = {2000},+   institution = {Eindhoven University of Technology},+   author = {Olga Caprotti and Martijn Oostdijk}+}++@article{prime2999,+   title = {How to formally and efficiently prove Prime(2999)},+   year = {2001},+   author = {Olga Caprotti and Martijn Oostdijk},+   journal = {Symbolic Computation and Automated Reasoning},+   pages = {114--125}+}++@book{church-num,+   title = {The Calculi of Lambda-Conversion},+   year = {1941},+   publisher = {Princeton University Press},+   author = {Alonzo Church}+}++@book{nuprl86,+   title = {Implementing Mathematics with the NuPrl Proof Development System},+   year = {1986},+   publisher = {Prentice-Hall},+   address = {NJ},+   author = {Constable, Robert L. and others}+}++@book{conway,+   title = {On Numbers and Games},+   year = {1976},+   publisher = {Academic Press},+   author = {J.H. Conway}+}++@misc{coq-manual,+   howpublished = {\verb+http://coq.inria.fr/+},+   title = {The {Coq} Proof Assistant --- Reference Manual},+   year = {2001},+   author = {{Coq Development Team}}+}++@misc{tt-prog,+   month = {June},+   title = {Type Theory and Programming},+   year = {1994},+   author = {Thierry Coquand and Bengt Nordstr\"{o}m and Jan M. Smith and Bj\"{o}rn von Sydow}+}++@book{func-appr,+   title = {The Functional Approach to Programming},+   year = {1998},+   publisher = {Cambridge University Press},+   author = {Guy Cousineau and Michel Mauny}+}++@misc{ibmspec,+   howpublished = {http://www2.hursley.ibm.com/decimal/},+   month = {January},+   title = {Standard Decimal Arithmetic Specification},+   year = {2001},+   author = {Mike Cowlishaw},+   note = {\copyright IBM Corporation 2001}+}++@book{dummett,+   title = {Elements of Intuitionism},+   year = {2000},+   edition = {2nd},+   publisher = {Oxford: Clarendon},+   author = {Michael A.E. Dummet}+}++@article{dybjer94,+   title = {Inductive Families},+   year = {1994},+   author = {Peter Dybjer},+   journal = {Formal Aspects Of Computing},+   volume = {6},+   pages = {440--465}+}++@misc{octave,+   howpublished = {http://www.octave.org/},+   month = {February},+   title = {GNU Octave --        A high-level interactive language for numerical computations},+   year = {1997},+   author = {John W. Eaton}+}++@book{comp-methods,+   title = {Computing methods for scientists and engineers},+   year = {1968},+   publisher = {Oxford : Clarendon Press},+   author = {L. Fox and D.F. Mayers}+}++@misc{guile,+   howpublished = {http://www.gnu.org/software/guile/guile.html},+   title = {Guile -- Project GNU's extension language},+   year = {2001},+   author = {{Free Software Foundation}}+}++@article{need-dep,+   journal = {Journal of Functional Programming},+   number = {4},+   volume = {10},+   title = {Do we need dependent types?},+   year = {2000},+   pages = {409-415},+   author = {Daniel Fridlender and Mia Indrika}+}++@book{primes-programming,+   title = {Primes and Programming -- An Introduction to Number Theory with Computing},+   year = {1993},+   publisher = {Cambridge University Press},+   author = {Peter Giblin}+}++@misc{rec-coq,+   month = {May},+   title = {A Tutorial on Recursive Types in \textsc{Coq}},+   year = {1998},+   author = {Eduardo Gim\'{e}nez}+}++@article{goldberg91,+   journal = {ACM Computing Surveys},+   number = {1},+   volume = {23},+   title = {What every computer scientist should know about floating point        arithmetic},+   year = {1991},+   pages = {5-48},+   author = {D. Goldberg}+}++@article{binary-lambda,+   journal = {Journal of Functional Programming},+   number = {6},+   volume = {10},+   title = {An adequate and efficient left associated binary numeral        system in the $\lambda$-calculus},+   year = {2000},+   author = {Mayer Goldberg}+}++@book{hol,+   title = {Introduction to HOL},+   year = {1993},+   publisher = {Cambridge University Press},+   author = {M. Gordon and T. Melham}+}++@misc{gmp,+   howpublished = {Available from \verb+http://www.swox.com/gmp/manual/+},+   title = {The {GNU Multiple Precision} Arithmetic Library 4.1.3 --- Manual},+   year = {2004},+   author = {Torbj\"{o}rn Granlund and others}+}++@article{harrison-fmsd94,+   journal = {Formal Methods in System Design},+   volume = {5},+   title = {Constructing the Real Numbers in {HOL}},+   year = {1994},+   pages = {35--59},+   author = {John Harrison}+}++@book{harrison-thesis,+   title = {Theorem Proving with the Real Numbers},+   year = {1998},+   publisher = {Springer-Verlag},+   author = {John Harrison}+}++@techreport{hol-maple,+   title = {Reasing about the Reals: the marriage of HOL and Maple},+   year = {1993},+   institution = {University of Cambridge Computer Laboratory},+   author = {John Harrison and Laurent Th\'{e}ry}+}++@misc{coq-tutorial,+   howpublished = {http://pauillac.inria.fr/coq},+   title = {The \textsc{Coq} Proof Assistant - A Tutorial},+   author = {G\'{e}rard Huet and Gilles Kahn and Christine Paulin-Mohring}+}++@misc{restr-haskell,+   howpublished = {http://citeseer.nj.nec.com/253599.html},+   month = {September},+   title = {Restricted Data Types in Haskell},+   year = {1999},+   author = {John Hughes}+}++@misc{javadec,+   howpublished = {http://www2.hursley.ibm.com/decimalj/decimald.html},+   month = {September},+   title = {Decimal Arithmetic for Java -- a Proposal},+   year = {2000},+   author = {{IBM Corporation}}+}++@misc{ieee754,+   title = {IEEE Standard for Binary Floating Point Arithmetic},+   year = {1985},+   author = {{IEEE Standard 754}}+}++@misc{ieee854,+   title = {IEEE Standard for Radix-Independent Floating-Point Arithmetic},+   year = {1987},+   author = {{IEEE Standard 854}}+}++@inproceedings{jon91,+   title = {Completing the Rational and Metric Spaces in \textsc{Lego}},+   year = {1991},+   booktitle = {Proceedings of the Second Workshop on Logical Frameworks},+   author = {Claire Jones}+}++@misc{ typinghaskell,+  author = "Mark Jones",+  title = "Typing {Haskell} in {Haskell}",+  howpublished = "In Haskell Workshop, September 1999.",+  year = "1999",+  url = "citeseer.ist.psu.edu/article/jones99typing.html" }++@article{karatsuba,+   journal = {Soviet Physics-Doklady},+   volume = {7},+   title = {Multiplication of multidigit numbers by automata},+   year = {1963},+   pages = {595--596},+   author = {A. Karatsuba and Y. Ofman}+}++@book{knuth2,+   volume = {2},+   title = {The Art of Computer Programming - Seminumerical Algorithms},+   year = {1969},+   publisher = {Addison Wesley},+   author = {Donald E. Knuth}+}++@article{next700,+   journal = {Communications of the ACM},+   number = {3},+   month = {March},+   volume = {9},+   title = {The next 700 programming languages},+   year = {1966},+   author = {P.J. Landin}+}++@techreport{luo-spec,+   month = {January},+   title = {Program Specification and Data Refinement in Type Theory},+   year = {1993},+   institution = {Department of Computer Science, University of Edinburgh},+   author = {Zhaohui Luo}+}++@phdthesis{luo90,+   school = {University of Edinburgh},+   title = {An Extended Calculus Of Constructions},+   year = {1990},+   author = {Zhaohui Luo}+}++@techreport{lego-manual,+   title = {\textsc{Lego} Proof Development System: User's Manual},+   year = {1992},+   institution = {Department of Computer Science, University of Edinburgh},+   author = {Zhaohui Luo and Robert Pollack}+}++@inproceedings{alf,+   title = {The {ALF} proof editor and its proof engine},+   year = {1994},+   booktitle = {Formal Proceeding of the 1993 Workshop on Types for Proofs        and Programs},+   author = {Lena Magnusson and Bengt N\"{o}rdstrom}+}++@misc{happy,+   howpublished = {http://www.haskell.org/happy/},+   title = {Happy User Guide},+   year = {2001},+   author = {Simon Marlow and Andy Gill}+}++@inproceedings{generic-haskell,+   title = {Generic Haskell, Specifically},+   author = {Dave Clarke and Andres L\"{o}h},+   editor = {Jeremy Gibbons and Johan Jeuring},+   booktitle = {Proceedings of the IFIP TC2 Working Conference on Generic Programming},+   year = {2002},+   publisher = {Kluwer Academic Publishers},+   pages = {21--48}+}++@article{faking-it,+   title = {Faking It -- Simulating Dependent Types in {Haskell}},+   year = {2002},+   author = {Conor McBride},+   journal = {Journal of Functional Programming},+   volume = {12},+   number = {4+5},+   pages = {375--392}+}++@misc{mcbride-inverting,+   title = {Inverting Inductively Defined Relations in \textsc{Lego}},+   year = {1996},+   author = {Conor McBride}+}++@phdthesis{mcbride-thesis,+   month = {May},+   school = {University of Edinburgh},+   title = {Dependently Typed Functional Programs and their         proofs},+   year = {2000},+   author = {Conor McBride}+}++@article{mcbride-unification,+   title = {First-Order Unification by Structural Recursion},+   year = {2003},+   author = {Conor McBride},+   journal = {Journal of Functional Programming},+   volume = {13},+   number = {6},+   pages = {1061--1075}+}++@misc{mckinna-pollack,+   howpublished = {Kluwer Academic Publishers},+   title = {Some Lambda Calculus and Type Theory formalized},+   year = {1998},+   author = {James McKinna and Robert Pollack}+}++@book{num-theory,+   title = {An Introduction to the Theory of Numbers},+   year = {1980},+   publisher = {John Wiley and Sons},+   author = {Ivan Niven and Herbert S. Zuckerman}+}++@book{prog-mltt,+   title = {Programming in Martin-L\"{o}f's Type Theory -- An Introduction},+   year = {1990},+   publisher = {Oxford University Press},+   author = {Bengt Nordstr\"{o}m and Kent Petersson and Jan M. Smith},+   note = {Out of print. Available from http://www.cs.chalmers.se/Cs/Research/Logic}+}++@book{okasaki,+   title = {Purely Functional Data Structures},+   year = {1998},+   publisher = {Cambridge University Press},+   author = {Chris Okasaki}+}++@book{arith-systems,+   title = {Computer Arithmetic Systems},+   year = {1994},+   publisher = {Prentice-Hall},+   author = {Amos R. Omondi}+}++@book{pj-imp,+   title = {The Implementation of Functional Programming Languages},+   year = {1987},+   publisher = {Prentice-Hall},+   author = {Simon {Peyton Jones}}+}++@book{cp-bjc,+   title = {Computational Numerical Methods},+   year = {1986},+   publisher = {John Wiley and Sons},+   author = {C. Phillips and B. Cornelius}+}++@book{nag,+   title = {The NAG Library: a beginner's guide},+   year = {1986},+   publisher = {Oxford : Clarendon Press},+   author = {Jen Phillips}+}++@misc{believe,+   month = {September},+   title = {How to Believe a Machine-Checked Proof},+   year = {1996},+   author = {Robert Pollack}+}++@phdthesis{pollack94,+   school = {University of Edinburgh},+   title = {The Theory of LEGO -- A Proof Checker for the Extended Calculus of Constructions},+   year = {1994},+   author = {Robert Pollack}+}++@inproceedings{intel-bug,+   series = {LNCS},+   volume = {915},+   title = {Anatomy of the Pentium Bug},+   publisher = {Springer-Verlag},+   year = {1995},+   pages = {97--107},+   author = {V.R. Pratt}+}++@book{maple,+   title = {The Maple Handbook: Maple V Release 4},+   year = {1996},+   publisher = {Springer},+   author = {Darren Redfern}+}++@book{crypto,+   title = {Applied Cryptography: protocols, algorithms and source code in C.},+   year = {1996},+   publisher = {Wiley},+   author = {Bruce Schneier}+}++@article{adts,+   journal = {Mathematical Structures in Computer Science},+   number = {2},+   volume = {10},+   title = {On lists and other abstract data types in the calculus of        construction},+   year = {2000},+   pages = {261-276},+   author = {Jonathan P. Seldin}+}++@article{seldin97,+   journal = {Annals of Pure and Applied Logic},+   number = {1},+   month = {January},+   volume = {83},+   title = {On the proof theory of Coquand's calculus of constructions},+   year = {1997},+   pages = {23--101},+   author = {Jonathan P. Seldin}+}++@article{wichmann,+   journal = {The Computer Journal},+   volume = {32},+   title = {Towards a Formal Specification of Floating Point},+   year = {1989},+   pages = {432-436},+   author = {B.A. Wichmann}+}++@book{mathematica,+   title = {Mathematica : a system for doing mathematics by computer},+   year = {1991},+   publisher = {Addison Wesley},+   author = {Stephen Wolfram}+}++@inproceedings{xi-imp,+author = "Hongwei Xi",+title = {{Imperative Programming with Dependent Types}},+booktitle = "Proceedings of 15th IEEE Symposium on Logic in Computer Science",+year = 2000,+month = "June",+address = "Santa Barbara",+pages = "375--387"+}++@phdthesis{xi-thesis,+   month = {December},+   school = {Department of Mathematical Sciences, Carnegie Mellon University},+   title = {Dependent Types in Practical Programming},+   year = {1998},+   author = {Hongwei Xi}+}+++@techreport{dtal,+author = {Hongwei Xi and Robert Harper},+title = {A Dependently Typed Assembly Language},+institution = {Computer Science and Engineering Department, Oregon Graduate Institute},+year = 1999,+number = {OGI-CSE-99-008},+month = {July},+}++@misc{bignum-cmp,+   month = {February},+   title = {Comparison of three public-domain multiprecision libraries:        BigNum, Gmp and Pari},+   year = {1998},+   author = {Paul Zimmerman}+}++@book{perl,+   title = {Programming Perl},+   author = {Larry Wall and Tom Christiansen and Jon Orwant},+   year = {2000},+   edition = {3rd},+   publisher = {O'Reilly}+}++@misc{python,+   howpublished = {http://www.python.org/doc/current/tut/tut.html},+   month = {April},+   title = {Python Tutorial},+   year = {2001},+   author = {Guido van {Rossum} and Fred L. {Drake, Jr}}+}++@book{logic,+   title = {The Language of First Order Logic},+   year = {1992},+   publisher = {CSLI Lecture Notes},+   author = {Jon Barwise and John Etchemendy}+}++@book{haskell,+   title = {Haskell -- The Craft of Functional Programming},+   year = {1999},+   publisher = {Addison Wesley},+   author = {Simon Thompson}+}++@inproceedings{coq-hol,+   title = {A Comparative Study of Coq and HOL},+   year = {1997},+   booktitle = {Theorem Proving in Higher Order Logics},+   pages = {323-337},+   author = {Vincent Zammit}+}++@misc{gay90,+   month = {November},+   title = {Correctly Rounded Binary-Decimal and Decimal-Binary Conversions},+   year = {1990},+   author = {David M. Gay},+   note = {AT&T Bell Laboratories, Numerical Analysis Manuscript 90-10}+}++@article{hughes-matters,+   journal = {Computer Journal},+   number = {2},+   volume = {32},+   title = {Why Functional Programming Matters},+   year = {1989},+   pages = {98--107},+   author = {J. Hughes}+}++@inproceedings{proofpointing,+   title = {Proof by Pointing},+   year = {1994},+   booktitle = {Proceedings of the International Symposium on Theoretical Aspects of Computer So},+   pages = {141--160},+   editor = {M. Hagiya and J. C. Mitchell},+   publisher = {Springer-Verlag},+   series = {LNCS},+   volume = {789},+   address = {Sendai, Japan},+   author = {Yves Bertot and Gilles Kahn and Laurent Th{\'e}ry}+}++@misc{inductive-coq,+   month = {December},+   title = {Inductive Definitions in the System Coq -- Rules and Properties},+   year = {1992},+   author = {Christine Paulin-Mohring}+}++@misc{leiserson98,+   month = {July},+   title = {Using de Bruijn Sequences to Index a 1 in a Computer Word},+   year = {1998},+   author = {{Charles E. Leiserson} and {Harald Prokop} and {Keith H. Randall}}+}++@inproceedings{proofchecking,+   title = {A two-level approach towards lean proof-checking},+   year = {1996},+   booktitle = {TYPES},+   pages = {16--35},+   author = {G. Barthe and M.P.J. Ruys and H.P. Barendregt}+}++@inproceedings{congruence,+   title = {Congruence Types},+   year = {1995},+   booktitle = {CSL},+   pages = {36--51},+   author = {Gilles Barthe and Herman Geuvers}+}++@phdthesis{geuvers-thesis,+   title = {Logic and Type Systems},+   author = {Herman Geuvers},+   year = 1993,+   school = {Katholieke Universiteit Nijmegen}+}++@techreport{multiple-values,+   title = {Multiple Values in {Standard ML}},+   year = {1994},+   number = {94-312},+   institution = {LFCS, Dept of Computer Science, University of Edinburgh},+   author = {Kevin Mitchell}+}++@inproceedings{oracle-checking,+   month = {January},+   title = {Oracle-Based Checking of Untrusted Software},+   year = {2001},+   booktitle = {Proceedings of the 28th ACM Symposium on Principles of Programming Languages},+   pages = {142--154},+   author = {{George C. Necula} and {S.P. Rahul}}+}++@article{adams93jfp,+   journal = {Journal of Functional Programming},+   number = {4},+   volume = {3},+   title = {Efficient Sets -- A Balancing Act},+   year = {1993},+   pages = {553--561},+   author = {Stephen Adams}+}++@inproceedings{hughes-sized,+   title = {Proving the Correctness of Reactive Systems Using Sized Types},+   year = {1996},+   booktitle = {Proceedings of the 23rd ACM SIGPLAN-SIGACT symposium on Principles of programmin},+   pages = {410--423},+   author = {John Hughes and Lars Pareto and Amr Sabry}+}++@inproceedings{whittle99ml,+   title = {An {ML} Editor Based on Proofs-As-Programs},+   year = {1999},+   booktitle = {Automated Software Engineering},+   pages = {166--173},+   author = {Jon Whittle and Alan Bundy and Richard J. Boulton and Helen Lowe}+}++@book{efp-typeinf,+   title = {Elements of Functional Programming},+   year = {1989},+   publisher = {Addison-Wesley},+   author = {Chris Reade},+   series = {International Computer Science Series}+}++@incollection{ wadler-views,+    author = "Philip Wadler",+    title = "Views: {A} Way for Pattern Matching to Cohabit with Data Abstraction",+    booktitle = "Proceedings, 14th Symposium on Principles of Programming Languages",+    publisher = "Association for Computing Machinery",+    editor = "Steve Munchnik",+    pages = "307--312",+    year = "1987",+    url = "citeseer.nj.nec.com/wadler87views.html" }++@article{ coquand-checking,+    author = "Thierry Coquand",+    title = "An Algorithm for Type-Checking Dependent Types",+    journal = "Science of Computer Programming",+    volume = "26",+    number = "1-3",+    pages = "167-177",+    year = "1996",+    url = "citeseer.nj.nec.com/coquand96algorithm.html" }++@misc{coquand-pm,+    author = "Thierry Coquand",+    title = "Pattern Matching with Dependent Types",+    year = "1992",+    howpublished = "Available from \verb+http://www.cs.chalmers.se/~coquand/type.html+"+}++@misc{pollack-records,+   month = {August},+   title = {Dependently Typed Records for Representing Mathematical Structure},+   year = {2000},+   author = {Robert Pollack}+}++@article{checking-betarte,+   journal = {Journal of Functional Programming},+   number = {2},+   month = {March},+   volume = {10},+   title = {Type checking dependent (record) types and subtyping},+   year = {2000},+   pages = {137--166},+   author = {Gustavo Betarte}+}+++@article{ gcode,+    author = "Thomas Johnsson",+    title = "Efficient Compilation of Lazy Evaluation",+    booktitle = "Proceedings of the {ACM} {SIGPLAN}'84 Symposium on Compiler Con struction",+    journal = "SIGPLAN Notices",+    volume = "19",+    number = "6",+    month = "June",+    publisher = "ACM Press",+    pages = "58--69",+    year = "1984",+    url = "citeseer.nj.nec.com/johnsson84efficient.html" }++@misc{kamareddine01,+   month = {February},+   title = {Reviewing the classical and the de Bruijn notation for $\lambda$-calculus and pure type systems},+   year = {2001},+   author = {Fairouz Kamareddine}+}++@book{prooftheory,+   title = {Basic Proof Theory},+   year = {1996},+   publisher = {Cambridge University Press},+   author = {A.S. Troelstra and H. Schwichtenberg},+   series = {Cambridge Tracts in Theoretical Computer Science}+}++@misc{nbe_staged,+   title = {Integrating Normalization-by-Evaluation into a Staged Programming Language},+   year = {1998},+   author = {Tim Sheard}+}++@inproceedings{nbe2,+   title = {Normalization by evaluation},+   year = {1998},+   author = {Ulrich Berger and Matthias Eberl and Helmut Schwichtenberg},+   booktitle = {Prospects for Hardware Foundations 1998},+   pages = {117--137},+   series = {LNCS}+}++++@misc{rtcg_jfp,+   title = {Compiling for Run-time Code Generation},+   year = {2000},+   author = {Frederick Smith and Dan Grossman and Greg Morrisett and Luke Hornof and Trevor J},+   note = {Under consideration for J. Functional Programming}+}++@phdthesis{fredsmith_thesis,+   month = {January},+   school = {Cornell University},+   title = {Certified Run-time Code Generation},+   year = {2002},+   author = {Frederick Smith}+}++@inproceedings{xi_arraybounds,+author = "Hongwei Xi and Frank Pfenning",+title = {Eliminating Array Bound Checking through Dependent Types},+booktitle = "Proceedings of ACM SIGPLAN Conference on Programming Language Design and Implementation",+year = 1998,+month = "June",+address = "Montreal",+pages = "249--257",+}++@inproceedings{xi_deadcode,+author = "Hongwei Xi",+title = {Dead Code Elimination through Dependent Types},+booktitle = "The First International Workshop on Practical Aspects of Declarative Languages",+year = 1999,+month = "January",+address = "San Antonio",+pages = "228--242"+}++@book{compilers,+   title = {Compilers --- Principles, Techniques and Tools},+   year = {1986},+   publisher = {Addison-Wesley},+   author = {Alfred Aho and Ravi Sethi and Jeffrey Ullman}+}++@inproceedings{nhc,+   title = {Highlights from nhc: A space efficient {Haskell} Compiler},+   year = {1995},+   author = "Niklas R{\"o}jemo",+   booktitle = "Functional Programming Languages and Computer Architecture",+   pages = "282--292"+}+++@misc{mlmatch,+   title = {SML/NJ Match Compiler Notes},+   year = {1992},+   author = {William Aitken}+}++@misc{mlmatch_sestoft,+   title = {ML pattern match compilation and partial evaluation},+   year = {1992},+   author = {Peter Sestoft}+}++@inproceedings{compiledstrongreduction,+   title = {A Compiled Implementation of Strong Reduction},+   year = {2002},+   author = {Benjamin Gr\'{e}goire and Xavier Leroy},+   booktitle = {Proc. 2002 International Conf. on Functional Programming (ICFP 2002)},+   pages = {235--246}+}++@misc{tclhaskell,+   howpublished = {http://www.dcs.gla.ac.uk/~meurig/TclHaskell/usermanual.html},+   month = {August},+   title = {TclHaskell - User Manual},+   year = {1999},+   author = {Meurig Sage}+}+++@InProceedings{nbe-cat,+  author =	 "Thorsten Altenkirch and Martin Hofmann and Thomas Streicher",+  title =	 "Categorical reconstruction of a reduction free+		  normalization proof",+  year =	 "1995",+  booktitle = 	 "Category Theory and Computer Science",+  editor =	 {David Pitt and David E. Rydeheard and Peter Johnstone},+  series =	 {LNCS},+  volume = {953},+  pages =	 {182-199}+}++@inproceedings{presburgerEFSM,+   title = {A Comparison of Presburger Engines for EFSM Reachability},+   year = {1998},+   booktitle = {Computer Aided Verification '98},+   pages = {280--292},+   author = {Thomas R. Shiple and James H. Kukula and Rajeev K. Ranjan}+}++@misc{typesafecast,+   title = {Type-Safe Cast},+   year = {2000},+   author = {Stephanie Weirich}+}++@phdthesis{grobauer-thesis,+   school = {University of Aarhus},+   title = {Topics in Semantics Based Program Manipulation},+   year = {2001},+   author = {Bernd Grobauer}+}++@misc{monads-moggi,+   title = {Computational Lambda Calculus and Monads},+   year = {1989},+   author = {Eugenio Moggi}+}++@article{gmp-proof,+   title = {A proof of {GMP} square root},+   year = {2002},+   journal = {Journal of Automated Reasoning},+   volume = {29},+   pages = {225--252},+   author = {Yves Bertot and Nicolas Magaud and Paul Zimmerman}+}++@article{F-tal,+   journal = {ACM Transactions on Programming Languages and Systems},+   number = {3},+   month = {May},+   volume = {21},+   title = {From {System F} to Typed Assembly Language},+   year = {1999},+   pages = {528--569},+   author = {Greg Morrisett and David Walker and Karl Crary and Neal Glew}+}++@techreport{nbe-rtcg,+   month = {December},+   title = {Strong Normalization by Type-Directed Partial Evaluation and Run-Time Code Generation},+   year = {1997},+   institution = {BRICS},+   author = {Vincent Balat and Oliver Danvy}+}++@misc{yong-schemata,+   howpublished = {http://www.dur.ac.uk/yong.luo/},+   title = {A Methodology for Implementing Inductive Schemata},+   year = {2002},+   author = {Yong Luo and Zhaohui Luo}+}++@inproceedings{harper93,+   title = {Explicit Polymorphism and CPS Conversion},+   year = {1993},+   booktitle = {20th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages},+   pages = {206--219},+   publisher = {ACM Press, New York, NY, USA},+   author = {Robert Harper and Mark Lillibridge}+}++@techreport{backends,+   month = {November},+   title = {Functional Back-Ends within the Lambda-Sigma Calculus},+   year = {1996},+   institution = {INRIA},+   author = {Th\'{e}r\`{e}se Hardin and Luc Maranget and Bruno Pagano}+}++@article{stg,+   title = {Implementing lazy functional languages on stock hardware -- the {Spineless Tagless G-machine}},+   year = {1992},+   journal = {Journal of Functional Programming},+   volume = {2},+   number = {2},+   pages = {127--202},+   month = {April},+   author = {Simon {Peyton Jones}}+}++@article{debruijn,+   journal = {Indagationes Mathematicae},+   volume = {34},+   title = {Lambda calculus notation with nameless dummies},+   year = {1972},+   pages = {381--392},+   author = {N.G. de Bruijn}+}++@book{assembly,+   month = {January},+   title = {PC Assembly Language},+   year = {2002},+   publisher = {http://www.drpaulcarter.com/},+   author = {Paul A. Carter}+}++@inproceedings{poly99,+   title = {Once Upon A Polymorphic Type},+   year = {1999},+   booktitle = {26th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages},+   publisher = {ACM},+   author = {Keith Wansbrough and Simon {Peyton Jones}}+}++@misc{lazy_intro,+   title = {Compiling Lazy Functional Languages: An introduction},+   year = {1986},+   author = {Thomas Johnsson}+}++@inproceedings{unboxed-fp,+   month = {Sept},+   title = {Unboxed Values as First Class Citizens in a Non-Strict Functional Language},+   year = {1991},+   author = {Simon {Peyton Jones} and John Launchbury},+   booktitle = {Functional Programming Languages and Computer Architecture (FPCA'91)},+   crossref = {fplca91},+   pages = {636--666}+}++@inproceedings{abc-machine,+ author = {Sjaak Smetsers and Eric N{\"{o}}cker and John {van Groningen} and Rinus Plasmeijer},+ title = {Generating efficient code for lazy functional languages},+ booktitle = {Functional programming Languages and Computer Architecture},+ year = {1991},+ pages = {592--617},+ crossref = {fplca91}+}++@proceedings{fplca91,+   title = {Functional programming Languages and Computer Architecture},+   year = {1991},+   volume = {523},+   series = {LNCS},+   publisher = {Springer-Verlag},+   editor = {John Hughes}+}++++@inproceedings{nbe,+   title = {An inverse of the evaluation functional for typed $\lambda$-calculus},+   year = {1991},+   booktitle = {Proc. 1991 IEEE Symp. on Logic in Comp. Sci.},+   pages = {203--211},+   editor = {R. Vemuri},+   author = {Ulrich Berger and Helmut Schwichtenberg}+}++@inproceedings{typed-closure,+   title = {Typed Closure Conversion},+   year = {1996},+   booktitle = {Symposium on Principles of Programming Languages},+   pages = {271--283},+   author = {Yasuhiko Minamide and J. Gregory Morrisett and Robert Harper}+}++@misc{ghc-commentary,+   howpublished = {http://www.cse.unsw.edu.au/~chak/haskell/ghc/comm/},+   title = {The Glasgow Haskell Compiler (GHC) Commentary},+   year = {2002},+   author = {Manuel M. T. Chakravarty and Sigbjorn Finne and Simon Marlow and Simon {Peyton Jones} and Julian Seward and Reuben Thomas},+   note = {Available from GHC CVS repository}+}++@inproceedings{lambdalift,+   month = {September},+   title = {Lambda Lifting: Transforming Programs to Recursive Equations},+   year = {1985},+   booktitle = {Functional Programming Languages and Computer Architecture},+   pages = {190--203},+   editor = {Jean-Pierre Jouannaud},+   publisher = {Springer-Verlag},+   author = {Thomas Johnsson}+}++@inproceedings{til,+   title = {TIL: A Type-Directed Optimizing Compiler for ML},+   year = {1996},+   booktitle = {Proc. {ACM} {SIGPLAN} '96 Conference on Programming Language Design and Implementation},+   pages = {181--192},+   author = {D. Tarditi and G. Morrisett and P. Cheng and C. Stone and R. Harper and P. Lee}+}++@phdthesis{shao94,+   school = {Princeton University},+   title = {Compiling Standard {ML} for Efficient Execution on Modern Machines},+   year = {1994},+   author = {Zhong Shao}+}++@inproceedings{gmachine,+   month = {September},+   title = {The {G-Machine}: A fast, graph-reduction evaluator},+   year = {1985},+   booktitle = {Functional Programming Languages and Computer Architecture},+   pages = {400--413},+   editor = {Jean-Pierre Jouannaud},+   publisher = {Springer-Verlag},+   author = {R.B. Kieburtz}+}++@inproceedings{strictness,+   month = {September},+   title = {Strictness Analysis - A practical approach},+   year = {1985},+   booktitle = {Functional Programming Languages and Computer Hardware},+   pages = {35--49},+   editor = {Jean-Pierre Jouannaud},+   publisher = {Springer-Verlag},+   author = {Chris Clack and Simon {Peyton Jones}}+}++@book{fl-impl,+   title = {Implementing Functional Languages - A Tutorial},+   year = {1992},+   publisher = {Prentice Hall International},+   author = {Simon {Peyton Jones} and David Lester}+}++@phdthesis{capretta-thesis,+   school = {Katholieke Universiteit Nijmegen},+   title = {Abstraction and Computation},+   year = {2002},+   author = {Venanzio Capretta}+}++@article{bird-pointer,+   journal = {Journal of Functional Programming},+   number = {3},+   month = {May},+   volume = {11},+   title = {Unfolding Pointer Algorithms},+   year = {2001},+   pages = {347--358},+   author = {Richard S. Bird}+}++@article{impl-tp,+   journal = {Journal of Functional Programming},+   number = {2},+   month = {March},+   volume = {9},+   title = {Implementing Theorem Provers in a Purely Functional Style},+   year = {1999},+   pages = {147--166},+   author = {Keith Hanna}+}++@article{shrink-lambda,+   journal = {Journal of Functional Programming},+   number = {5},+   month = {September},+   volume = {7},+   title = {Shrinking Lambda Expressions in Linear Time},+   year = {1997},+   pages = {515--540},+   author = {Andrew W. Appel and Trevor Jim}+}++@article{stack-tal,+   journal = {Journal of Functional Programming},+   number = {1},+   month = {January},+   volume = {12},+   title = {Stack-based Typed Assembly Language},+   year = {2002},+   pages = {43--88},+   author = {Greg Morrisset and Karl Crart and Neal Glew and David Walker}+}++@article{runtime-lamsig,+   journal = {Journal of Functional Programming},+   number = {2},+   month = {March},+   volume = {8},+   title = {Functional Runtime Systems within the lambda-sigma Calculus},+   year = {1998},+   pages = {131--176},+   author = {Th\'{e}r\`{e}se Hardin and Luc Maranget and Bruno Pagano}+}++@article{busylazy,+   journal = {Journal of Functional Programming},+   number = {6},+   month = {November},+   volume = {11},+   title = {How to look busy while being as lazy as ever: the Implementation of a lazy functional debugger},+   year = {2001},+   pages = {629--671},+   author = {Henrik Nilsson}+}++@article{lazyveager,+   journal = {Journal of Functional Programming},+   number = {5},+   month = {September},+   volume = {7},+   title = {More haste, less speed: lazy versus eager evaluation},+   year = {1997},+   pages = {541--547},+   author = {Richard Bird and Geraint Jones and Oege {de Moor}}+}++@article{jvm-fp,+   journal = {Journal of Functional Programming},+   number = {6},+   month = {November},+   volume = {9},+   title = {Compiling lazy functional programs for the Java Virtual Machine},+   year = {1999},+   pages = {579--603},+   author = {David Wakeling}+}++@book{isabelle,+   publisher = {Springer-Verlag},+   series = {LNCS},+   volume = {2283},+   month = {March},+   title = {Isabelle/HOL - A proof assistant for higher order logic},+   year = {2002},+   author = {Tobias Nipkow and Lawrence C. Paulson and Markus Wenzel}+}++@article{ghc-inliner,+   journal = {Journal of Functional Programming},+   number = {4},+   month = {September},+   volume = {12},+   title = {Secrets of the {Glasgow Haskell Compiler} inliner},+   year = {2002},+   pages = {393--434},+   author = {Simon {Peyton Jones} and Simon Marlow}+}++@article{dynamic-fp,+   journal = {Journal of Functional Programming},+   number = {1},+   month = {January},+   volume = {8},+   title = {The dynamic compiliation of lazy functional programs},+   year = {1998},+   pages = {61--81},+   author = {David Wakeling}+}++@misc{isabelle-ref,+   month = {March},+   title = {Isabelle Reference Manual},+   year = {2002},+   author = {Lawrence C. Paulson}+}++@article{debruijn-nested,+   journal = {Journal of Functional Programming},+   number = {1},+   month = {January},+   volume = {9},+   title = {de Bruijn notation as a nested datatype},+   year = {1999},+   pages = {77--91},+   author = {Richard S. Bird and Ross Paterson}+}++@article{perfect-trees,+   journal = {Journal of Functional Programming},+   number = {3},+   month = {May},+   volume = {10},+   title = {Perfect trees and bit-reversal permutations},+   year = {2000},+   pages = {305--317},+   author = {Ralf Hinze}+}++@phdthesis{paulin-extraction,+   school = {Paris 7},+   title = {Extraction de programmes dans le Calcul des Constructions},+   year = {1989},+   author = {Christine Paulin-Mohring}+}++@phdthesis{santos95,+   school = {University of Glasgow},+   title = {Compilation By Transformation In Non-Strict Functional Languages},+   year = {1995},+   author = {{Andr\'{e} Lu\'{i}s de Medeiros} Santos}+}++@book{cps,+   title = {Compiling With Continuations},+   year = {1992},+   publisher = {Cambridge University Press},+   author = {Andrew W. Appel}+}++@techreport{SKIM,+   number = {31},+   title = {The {SKIM} microprogrammer's guide},+   year = {1983},+   institution = {University of Cambridge},+   author = {W.R. Stoye}+}++@misc{NORMA,+   title = {An Overview of Burroughs {NORMA}},+   year = {1985},+   author = {H. Richards}+}++@book{ml,+   title = {The Definition of Standard ML --- Revised},+   year = {1997},+   publisher = {MIT Press},+   author = {Robin Milner and Mads Tofte and Robert Harper and David MacQueen}+}++@misc{ml71,+   title = {An intuitionistic theory of types},+   year = {1971},+   author = {Per Martin-L\"{o}f}+}++@phdthesis{girard-thesis,+   school = {Universit\'{e} Paris VII},+   title = {Interpr\'{e}tation fonctionelle et \'{e}limination des coupures de l'arithm\'{e}tique d'ordre sup\'{e}rieur},+   year = {1972},+   author = {Jean-Yves Girard}+}++@inproceedings{ml75,+   title = {An intuitionistic theory of types: predicative part},+   year = {1975},+   booktitle = {Logic Colloquium '73},+   editor = {H. Rose and J.C. Shepherdson},+   publisher = {North-Holland},+   author = {Per Martin-L\"{o}f}+}++@inproceedings{cpm90,+   title = {Inductively defined types},+   year = {1990},+   author = {Thierry Coquand and Christine Paulin-Mohring},+   series = {LNCS},+   volume = {417},+   publusher = {Springer-Verlag}+}++@phdthesis{fpcustom,+   month = {May},+   school = {Computer Lab, University of Cambridge},+   title = {The Implementation of Functional Languages using Custom Hardware},+   year = {1985},+   author = {W.R. Stoye}+}++@phdthesis{hughesthesis,+   month = {September},+   school = {Programming Research Group, Oxford},+   title = {The design and implementation of programming languages},+   year = {1984},+   author = {John Hughes}+}++@inproceedings{tim,+   volume = {274},+   title = {{TIM} -- A simple lazy abstract machine to execute supercombinators},+   year = {1987},+   booktitle = {Functional Programming Languages and Computer Architecture},+   publisher = {Springer-Verlag},+   author = {John Fairbairn and Stuart Wray},+   pages = {34--45},+   series = {LNCS}+}++@techreport{abc,+   title = {The {ABC} machine -- A Sequential Stack-based Abstract Machine For Graph Rewriting},+   year = {1990},+   institution = {University of Nijmegen},+   author = {P.W.M.  Koopman and M.C.J.D. van {Eekelen} and E.G.J.M.H. Ncker and J.E.W. Smetsers and M.J. Plasmeijer}+}++@techreport{implicit,+   title = {On Implicit Arguments},+   year = {1994},+   institution = {Faculty of Science, University of Tokyo},+   author = {Masami Hagiya and Yozo Toda}+}++@book{semantics,+   title = {Denotational Semantics},+   year = {1986},+   publisher = {Wm. C. Brown},+   author = {David A. Schmidt}+}++@inproceedings{lazyml,+   month = {August},+   title = {A compiler for {Lazy} {ML}},+   year = {1984},+   booktitle = {Proceedings of the {ACM} Symposium on Lisp and Functional Programming},+   pages = {218--227},+   author = {Lennart Augustsson}+}++@inproceedings{nu-g,+   title = {Parallel graph reduction with the $\langle\nu,G\rangle$-machine},+   year = {1989},+   booktitle = {Functional Programming Languages and Computer Architecture},+   publisher = {ACM Press},+   author = {Lennart Augustsson and Thomas Johnsson}+}++@book{k&r,+   title = {The C programming language},+   year = {1988},+   publisher = {Prentice-Hall},+   author = {Brian W. Kernighan and Dennis M. Ritchie}+}++@misc{c--garbage,+   title = {C--: a portable assembly language that supports garbage collection},+   year = {1999},+   author = {Simon {Peyton Jones} and Norman Ramsey and Fermin Reig},+   note = {Invited talk at PPDP'99}+}++@misc{epigram,+   howpublished = {http://www.dur.ac.uk/CARG/epigram.html},+   title = {Project Proposal: {Epigram}: Innovative Programming via Inductive Families},+   year = {2002},+   author = {Zhaohui Luo and James McKinna and Paul Callaghan and Conor McBride}+}++@misc{ghc-rewrite,+   title = {Playing by the Rules: Rewriting as a practical optimisation technique in {GHC}},+   year = {2001},+   author = {Simon {Peyton Jones} and Andrew Tolmach and Tony Hoare}+}++@UNPUBLISHED{implicit-pollack,+  AUTHOR = {Robert Pollack},+  TITLE = {Implicit Syntax},+  NOTE = {Informal Proceedings of First Workshop on +                 Logical Frameworks, Antibes},+  YEAR = {1990},+  MONTH = MAY+}+++@article{transform-haskell,+   journal = {Science of Computer Programming},+   volume = {32},+   title = {A transformation-based optimiser for {Haskell}},+   year = {1998},+   pages = {3--47},+   author = {Simon {Peyton Jones} and Andr\'{e} L. M. Santos}+}++@inproceedings{knuth-bendix,+   title = {Simple Word Problems in Universal Algebras},+   year = {1970},+   booktitle = {Computational Problems in Abstract Algebra},+   pages = {263--298},+   editor = {John Leech},+   publisher = {Pergamon Press},+   author = {Donald E. Knuth and Peter B. Bendix}+}++@inproceedings{phantomfun,+   title = {Fun With Phantom Types},+   author = {Ralf Hinze},+   pages = {245--262},+   year = {2003},+   crossref = {funprogramming},+   booktitle = {The Fun Of Programming},+   publisher = {Palgrave}+}++@book{funprogramming,+   month = {March},+   title = {The Fun Of Programming},+   year = {2003},+   editor = {Jeremy Gibbons and Oege {de Moor}},+   publisher = {Palgrave},+   series = {Cornerstones of Computing}+}++@inproceedings{anderson-proof,+   title = {Representing Proof Transformations For Program Optimization},+   year = {1994},+   booktitle = {International Conference On Automated Deduction},+   publisher = {Springer Verlag},+   author = {Penny Anderson}+}++@phdthesis{daria-thesis,+   month = {April},+   school = {Institute of Informatics, Warsaw University},+   title = {Termination of Rewriting in the Calculus of Constructions},+   year = {2003},+   author = {Daria Walukiewicz-Chrzaszcz}+}++@inproceedings{change-data,+   title = {Changing Data Structures In Type Theory: A Study Of Natural Numbers},+   year = {2001},+   booktitle = {Types For Proofs And Programs 2000},+   pages = {181--196},+   editor = {Paul Callaghan and Zhaohui Luo and James McKinna and Robert Pollack},+   publisher = {Springer},+   author = {Nicolas Magaud and Yves Bertot}+}++@phdthesis{nico-thesis,+   title = {Changement de Representation des donn\'{e}es dans le Calcul de Constructions},+   author = {Nicolas Magaud},+   year = {2003},+   month = {October},+   school = {Universit\'{e} de Nice - Sophia Antipolis}+}+   ++@book{patterns,+   title = {Design Patterns},+   year = {1995},+   publisher = {Addison Wesley},+   author = {Erich Gamma and Richard Helm and Ralph Johnson and John Vlissides}+}++@misc{ghchugs,+   month = {August},+   title = {The New {GHC}/{Hugs} Runtime System},+   year = {1998},+   author = {Simon Marlow and Simon {Peyton Jones}}+}++@misc{stgrevised,+   month = {February},+   title = {The {STG} runtime system (revised)},+   year = {1999},+   author = {Simon {Peyton Jones} and Simon Marlow and Alastair Reid},+   howpublished = {Available from \verb+http://www.haskell.org/ghc/documentation.html+}+}++@inproceedings{optimistic,+   month = {March},+   title = {Optimistic Evaluation --- an adaptive evaluation strategy for non-strict programs},+   year = {2003},+   author = {Robert Ennals and Simon {Peyton Jones}},+   booktitle = {International Conference on Functional Programming},+   pages = {287--298}+}++@phdthesis{ennals-thesis,+   title = {Adaptive Evaluation of Non-Strict Programs},+   author = {Robert Ennals},+   year = {2003},+   month = {December},+   school = {King's College, University of Cambridge}+}++@article{garbage,+   journal = {ACM Computing Surveys},+   number = {3},+   volume = {13},+   title = {Garbage Collection of Linked Data Structures},+   year = {1981},+   pages = {341--367},+   author = {Jacques Cohen}+}++@article{baker-gc,+   journal = {Communications of the ACM},+   number = {4},+   month = {April},+   volume = {21},+   title = {List Processing In Real Time On A Serial Computer},+   year = {1978},+   pages = {280--294},+   author = {Henry G. {Baker Jr}}+}++@misc{bc-rec,+   month = {February},+   title = {Modelling General Recursion in Type Theory},+   year = {2003},+   note = {Under consideration for publication in Math. Struct. in Comp. Science. Draft, DCS, CTH --- INRIA, Sophia Antipolis, France},+   author = {Ana Bove and Venanzio Capretta}+}++@misc{global-tag,+   title = {Global Tagging Optimization by Type Inference},+   year = {1992},+   author = {Fritz Henglein}+}++@book{esr,+   month = {October},+   title = {The Cathedral And The Bazaar},+   year = {1999},+   publisher = {O'Reilly},+   author = {Eric Raymond}+}++@book{manmonth,+   title = {The Mythical Man-month: Essays on Software Engineering},+   year = {1975},+   publisher = {Addison Wesley},+   author = {Frederick P. Brooks}+}++@inproceedings{evalpush,+   title = {How to make a fast curry: push/enter vs eval/apply},+   year = {2004},+   author = {Simon Marlow and Simon {Peyton Jones}},+   booktitle = {International Conference on Functional Programming, Snowbird},+   pages = {4--15}+}++@phdthesis{boquist-thesis,+   month = {April},+   school = {Chalmers University of Technology},+   title = {Code Optimisation Techniques for Lazy Functional Languages},+   year = {1999},+   author = {Urban Boquist}+}++@book{formal-spec,+   title = {Formal Specification Of Programming Languages},+   year = {1981},+   publisher = {Prentice-Hall},+   author = {Frank G. Pagan}+}++@inproceedings{elim-motive,+   title = {Elimination With A Motive},+   year = {2000},+   booktitle = {Types for Proofs and Programs},+   pages = {197--216},+   editor = {Paul Callaghan and Zhaohui Luo and James McKinna and Robert Pollack},+   publisher = {Springer},+   author = {Conor McBride}+}++@article{telescope,+   journal = {Information and Computation},+   number = {2},+   month = {April},+   volume = {91},+   title = {Telescoping Mappings in Typed Lambda Calculus},+   year = {1991},+   pages = {189--204},+   author = {N.G. de Bruijn}+}++@misc{typeintype,+   title = {Typechecking is undecidable when 'type' is a type},+   year = {1989},+   author = {Mark B. Reinhold}+}++@misc{core,+   month = {September},+   title = {An External Representation for the {GHC} Core Language},+   year = {2001},+   author = {Andrew Tolmach and {The GHC Team}}+}++@article{deforestation,+   journal = {Theoretical Computer Science},+   volume = {73},+   title = {Deforestation: Transforming programs to eliminate trees},+   year = {1990},+   pages = {231--248},+   author = {Philip Wadler}+}++@misc{hep,+   month = {July},+   title = {Architecture of the {Haskell} Execution Platform},+   year = {1999},+   author = {Julian Seward and Simon Marlow and Andy Gill and Sigbjorn Finne and Simon {Peyton Jones} },+   note = {Version 6},+   howpublished = {Available from \verb+http://www.haskell.org/ghc/documentation.html+}+}++@mastersthesis{wahlstedt-thesis,+   month = {October},+   school = {Chalmers University Of Technology},+   title = {Detecting Termination Using Size Change In Parameter Values},+   year = {2000},+   author = {David Wahlstedt}+}++@inproceedings{size-change,+   title = {The size-change principle for program termination},+   year = {2001},+   booktitle = {Proceedings of the 28th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages},+   author = {Chin Soon Lee and Neil D. Jones and Amir Ben-Amram. }+}++@article{ski-turner,+   journal = {Software -- Practice and Experience},+   volume = {9},+   title = {A new implementation technique for applicative languages},+   year = {1979},+   pages = {31--49},+   author = {David Turner}+}++@inproceedings{turner-strong,+   number = {1022},+   title = {Elementary Strong Functional Programming},+   year = {1996},+   booktitle = {First International Symposium on Functional Programming Languages in Education, Nijmegen, Netherlands, December 1995.},+   pages = {1--13},+   publisher = {Springer},+   author = {David Turner},+   series = {LNCS}+}++@misc{clean,+   title = {The {Concurrent CLEAN} Language Report (draft)},+   year = {2003},+   author = {Rinus Plasmeijer and Marko van Eekelen},+   howpublished = {Available from \verb+http://www.cs.kun.nl/~clean/+}+}++@article{burstall-struct,+   journal = {Computer Journal},+   number = {1},+   volume = {12},+   title = {Proving Properties of Programs By Structural Induction},+   year = {1969},+   pages = {41--48},+   author = {Rod Burstall}+}++@incollection{ barendregt-types,+    author = "Henk Barendregt",+    title = "Lambda Calculi with Types",+    booktitle = "Handbook of Logic in Computer Science, Volumes 1 (Background: Mathematical Structures) and 2 (Background: Computational Structures), Abramsky \& Gabbay \& Maibaum (Eds.)",+    publisher = "Clarendon",+    volume = "2",+    year = "1992",+    url = "citeseer.nj.nec.com/barendregt92lambda.html" }++@book{curry-feys,+   title = {Combinatory Logic, volume 1},+   year = {1958},+   publisher = {North Holland},+   author = {Haskell B. Curry and Robert Feys}+}++@phdthesis{bove-thesis,+   month = {November},+   school = {Chalmers University of Technology},+   title = {General Recursion in Type Theory},+   year = {2002},+   author = {Ana Bove}+}++@inbook{ml-cm,+   title = {Constructive Mathematics and Computer Programming},+   year = {1985},+   booktitle = {Mathematical Logic and Programming Languages},+   publisher = {Prentice Hall},+   author = {Per Martin-L\"{o}f}+}++@inproceedings{howard,+   title = {The formulae-as-types notion of construction},+   year = {1980},+   booktitle = {To H.B.Curry: Essays on combinatory logic, lambda calculus and formalism},+   editor = {Jonathan P. Seldin and J. Roger Hindley},+   publisher = {Academic Press},+   author = {William A. Howard},+   note = {A reprint of an unpublished manuscript from 1969}+}++@inproceedings{talx86,+   title = {TALx86: A Realistic Typed Assembly Language},+   year = {1999},+   booktitle = {ACM SIGPLAN Workshop on Compiler Support for System Software},+   pages = {25--35},+   author = {Greg Morrisett and Karl Crary and Neal Glew and Dan Grossman and Richard Samuels and Frederick Smith and David Walker and Stephanie Weirich and Steve Zdancewic}+}++@inproceedings{bove-capretta,+   volume = {2152},+   title = {Nested General Recursion and Partiality in Type Theory},+   year = {2001},+   booktitle = {Theorem Proving in Higher Order Logics, 14th International Conference, TPHOLS 2001},+   pages = {121--135},+   editor = {Richard J. Boulton and Paul B. Jackson},+   publisher = {Springer-Verlag},+   author = {Ana Bove and Venanzio Capretta},+   series = {LNCS}+}++@misc{lvm,+   month = {November},+   title = {LVM, the lazy virtual machine},+   year = {2002},+   author = {Daan Leijen}+}++@misc{ocaml,+   howpublished = {\verb+http://caml.inria.fr/ocaml/htmlman/+},+   month = {August},+   title = {The {Objective Caml} system release 3.06},+   year = {2002},+   author = {Xavier Leroy}+}++@misc{lambdagoto,+   title = {Lambda : The Ultimate Goto},+   year = {1977},+   author = {Guy L. {Steele Jr}},+   note = {MIT AI Memo 443}+}++@inproceedings{ liu-tail,+    author = "Yanhong A. Liu and Scott D. Stoller",+    title = "From Recursion to Iteration: What are the Optimizations?",+    booktitle = "Partial Evaluation and Semantic-Based Program Manipulation",+    pages = "73-82",+    year = "2000",+    url = "citeseer.nj.nec.com/liu00from.html" }++@inproceedings{aczel77,+   title = {An Introduction To Inductive Definitions},+   year = {1977},+   booktitle = {Handbook of Mathematical Logic},+   editor = {J. Barwise},+   publisher = {North Holland},+   author = {Peter Aczel}+}++@inproceedings{inductive-plastic,+   volume = {1956},+   title = {Implementation Techniques for Inductive Types in {Plastic}},+   year = {1999},+   booktitle = {Types for Proofs and Programs},+   pages = {94--113},+   editor = {Thierry Coquand and Peter Dybjer and Bengt Nordstr\"{o}m and Jan Smith},+   publisher = {Springer-Verlag},+   author = {Paul Callaghan and Zhaohui Luo},+   series = {LNCS}+}++@misc{graham,+   howpublished = {Available from \verb+http://www.paulgraham.com/+},+   month = {April},+   title = {The Hundred Year Language},+   year = {2003},+   author = {Paul Graham},+   note = {Keynote address at PyCon 2003}+}++@inproceedings{gimenez98,+   volume = {1443},+   title = {Structural Recursive Definitions in Type Theory},+   year = {1998},+   booktitle = {Proceedings of ICALP '98},+   publisher = {Springer-Verlag},+   author = {Eduardo Gim\'{e}nez},+   series = {LNCS}+}++@article{quicksort,+   journal = {Computer Journal},+   number = {1},+   volume = {5},+   title = {Quicksort},+   year = {1962},+   pages = {10--15},+   author = {C.A.R. Hoare}+}++@phdthesis{goguen-thesis,+   school = {University of Edinburgh},+   title = {A Typed Operational Semantics for Type Theory},+   year = {1994},+   author = {Healfdene Goguen}+}++@article{ph-universes,+   journal = {Theoretical Computer Science},+   number = {1},+   volume = {89},+   title = {Type Checking With Universes},+   year = {1991},+   pages = {107--136},+   author = {Robert Harper and Randy Pollack}+}++@inproceedings{pm-compile,+   month = {September},+   title = {Compiling Pattern Matching},+   year = {1985},+   booktitle = {Functional Programming Languages and Computer Architecture},+   pages = {368--381},+   editor = {Jean-Pierre Jouannaud},+   publisher = {Springer-Verlag},+   author = {Lennart Augustsson}+}++@phdthesis{lena-thesis,+   school = {Chalmers University of Technology, G\"{o}teborg},+   title = {The implementation of {ALF} -- A Proof Editor based on {Martin-L\"{o}f}'s Monomorphic Type Theory with Explicit Substitutions},+   year = {1994},+   author = {Lena Magnusson}+}++@article{view-left,+   journal = {Journal of Functional Programming},+   number = {1},+   volume = {14},+   title = {The View From The Left},+   year = {2004},+   author = {Conor McBride and James McKinna},+   pages = {69--111}+}++@inproceedings{not-a-number,+  author = {Conor McBride and James McKinna},+  title = {I am not a number, {I} am a free variable},+  year = {2004},+  booktitle = {Proceedings of the ACM SIGPLAN Haskell Workshop}+}+++@misc{profiling,+   title = {Time and Space Profiling for Non-Strict, Higher Order  Functional Languages},+   year = {1995},+   author = {Patrick M. Sansom and Simon {Peyton Jones}}+}++@inbook{pattern-matching,+   title = {The Implementation of Functional Programming Languages},+   year = {1987},+   booktitle = {The Implementation of Functional Programming Languages},+   pages = {78--103},+   editor = {Simon {Peyton Jones}},+   chapter = {5},+   publisher = {Prentice Hall},+   author = {Philip Wadler},+   crossref = {pj-imp}+}++@misc{tag-elim,+   title = {Tag Elimination -- or -- Type Specialisation is a Type Indexed Effect},+   year = {2000},+   author = {Walid Taha and Henning Makholm}+}++@inproceedings{extraction-coq,+   title = {A New Extraction for {Coq}},+   year = {2002},+   booktitle = {Types for proofs and programs},+   editor = {Herman Geuvers and Freek Wiedijk},+   publisher = {Springer},+   author = {Pierre Letouzey},+   series = {LNCS}+}++@phdthesis{mcbride-snr-thesis,+   school = {Queen's University of Belfast},+   title = {Computer Aided Manipulation of Symbols},+   year = {1970},+   author = {Fred McBride}+}++@article{ho-strictness,+   journal = {Science of Computer Programming},+   volume = {7},+   title = {Strictness analysis for higher-order functions},+   year = {1986},+   pages = {249--278},+   author = { Geoffrey L. Burn and Chris Hankin and Samson Abramsky}+}++@phdthesis{mycroft-thesis,+   school = {Dept Computer Science, University of Edinburgh},+   title = {Abstract interpretation and optimising transformations for applicative programs},+   year = {1981},+   author = {A. Mycroft}+}++@inproceedings{bc-nested,+   month = {September},+   volume = {2152},+   title = {Nested General Recursion and Partiality in Type Theory},+   year = {2001},+   booktitle = {Theorem Proving In Higher Order Logics: 14th International Conferences, TPHOLS 2001},+   pages = {121--135},+   publisher = {Springer--Verlag},+   author = {Ana Bove and Venanzio Capretta},+   series = {LNCS}+}++@techreport{bove-mutual,+   month = {May},+   title = {Mutual General Recursion in Type Theory},+   year = {2002},+   institution = {Department of Computing Science, Chalmers University of Technology},+   author = {Ana Bove}+}++@article{berardi-pruning,+   journal = {Journal of Logic and Computation},+   number = {5},+   volume = {6},+   title = {Pruning Simply Typed Lambda Terms},+   year = {1996},+   pages = {663--681},+   author = {Stefano Berardi}+}++@article{milner-tc,+   journal = {Journal of Computer and System Science},+   volume = {17},+   title = {A Theory of Type Polymorphism in Programming},+   year = {1978},+   pages = {348--75},+   author = {R. Milner}+}++@inproceedings{extt,+   title = {Inductive Families Need Not Store Their Indices},+   year = {2004},+   booktitle = {Types for Proofs and Programs 2003},+   author = {Edwin Brady and Conor McBride and James McKinna},+   editor = {Stefano Berardi and Mario Coppo and Ferruccio Damiani},+   publisher = {Springer},+   volume = {3085},+   pages = {115--129}+}++@book{luo94,+   title = {Computation and Reasoning -- A Type Theory for Computer Science},+   year = {1994},+   publisher = {OUP},+   author = {Zhaohui Luo},+   series = {Intl. Series of Monographs on Comp. Sci.}+}++@article{backus78,+   journal = {Communications of the ACM},+   month = {August},+   volume = {21},+   title = {Can Programming Be Liberated From the {Von Neumann} Style?},+   year = {1978},+   pages = {280--294},+   author = {John Backus}+}++@misc{henk,+   month = {May},+   title = {Henk: A Typed Intermediate Language},+   year = {1997},+   author = {Simon {Peyton Jones} and Erik Meijer}+}++@article{thunks,+   journal = {Journal of Functional Programming},+   number = {3},+   month = {May},+   volume = {7},+   title = {Thunks and the $\lambda$-calculus},+   year = {1997},+   pages = {303--319},+   author = {John Hatcliff and Olivier Danvy}+}++@inproceedings{grin-project,+    author = "Urban Boquist and Thomas Johnsson",+    title = "The {GRIN} Project: A Highly Optimising Back End for Lazy Functional Languages",+    booktitle = "Implementation of Functional Languages",+    pages = "58--84",+    year = "1996",+    url = "citeseer.ist.psu.edu/boquist96grin.html" }++@misc{boehm-gc,+   howpublished = {\verb+http://www.hpl.hp.com/personal/Hans_Boehm/gc/+},+   title = {A garbage collector for {C} and {C++}},+   year = {2001},+   author = {Hans-J. Boehm and Alan J. Demers and {Xerox Corporation Silicon Graphic} and {Hewlett-Packard Company}}+}++@misc{art-interpreter,+   month = {May},+   title = {The Art of the Interpreter or, the Modularity Complex (Parts Zero, One, and Two)},+   year = {1978},+   author = {Guy Lewis {Steele, Jr.} and Gerald Jay Sussman},+   note = {MIT AI Lab. AI Lab Memo AIM-453}+}++@inproceedings{gimenez,+   title = {Codifying Guarded Definitions With Recursive Schemes},+   year = {1994},+   booktitle = {Proceedings of TYPES 1994},+   pages = {39--59},+   author = {Eduardo Gim\'{e}nez}+}++@manual{ghc-manual,+   title = {The Glasgow Haskell Compiler User's Guide, Version 6.0},+   year = {2003},+   author = {The {GHC Team}}+}++@article{rbtree,+   journal = {Journal of Functional Programming},+   number = {4},+   month = {May},+   volume = {9},+   title = {Red-Black Trees In A Functional Setting},+   year = {1999},+   pages = {471--477},+   author = {Chris Okasaki}+}++@inproceedings{dt-data,+author = "Hongwei Xi",+title = {{Dependently Typed Data Structures}},+booktitle = "Proceedings of Workshop of Algorithmic Aspects of Advanced Programming Languages (WAAAPL '99)",+year = 1999,+month = "September",+pages = "17--32",+address = "Paris",+}++@misc{krivine,+   title = {On the Correctness and Efficiency of the {Krivine} Machine},+   year = {2003},+   month = {October},+   author = {Mitchell Wand and Daniel P. Friedman},+   howpublished = {Submitted for publication}+   }++@inproceedings{nbe-filinski,+   title = {Normalization by Evaluation for the Computational Lambda-Calculus},+   year = {2001},+   month = {May},+   booktitle = {Typed Lambda Calculi and Applications: 5th International Conference, TLCA 2001},+   author = {Andrzej Filinski},+   pages = {151--165},+   publisher = {Springer-Verlag},+   series = {LNCS},+   volume = {2044}+}++@inproceedings{filinski-nbesem,+   title = {A semantic account of type-directed partial evaluation},+   year = {1999},+   author = {Andrzej Filinski},+   editor = {G. Nadathur},+   booktitle = {International Conference on Principles and Practice of Declarative Programming},+   volume = {1702},+   series = {LNCS},+   pages = {378--395},+   publisher = {Springer-Verlag}+}++@article{secd,+   title = {The mechanical evaluation of expressions},+   author = {P.J. Landin},+   year = {1964},+   journal = {Computer Journal},+   volume = {6},+   pages = {308--320}+}++@misc{lispkit,+   title = {The {LispKit} Manual},+   author = {Peter Henderson and Geraint Jones and Simon Jones},+   year = {1982},+   howpublished = {Oxford University Computing Laboratory}+}++@inproceedings{wells-undecidable,+   title = {Typability and Type Checking in the Second-order $\lambda$-calculus are equivalent and undecidable},+   author = {J. Wells},+   year = {1994},+   month = {July},+   booktitle = {Proc. 9th Ann. IEEE Symp. Logic Comput. Sci.}+}++@misc{patguards,+   title = {Pattern Guards and Transformational Patterns},+   author = {Martin Erwig and Simon {Peyton Jones}},+   year = {2000},+   howpublished = {Haskell Workshop}+}++@misc{alfa-manual,+  title = {Alfa Users' Guide},+  author = {Thomas Hallgren},+  year = {2001},+  howpublished = {Available from \verb+http://www.cs.chalmers.se/~hallgren/Alfa/+}+}+   +@inproceedings{nofib,+  title = {The nofib Benchmark Suite of {Haskell} Programs},+  author = {Will Partain},+  year = {1992},+  booktitle = {Functional Programming},+  editor = {J. Launchbury and P.L. Sansom},+  series = {Workshops in Computing},+  publisher = {Springer Verlag}+}++@article{shape,+   title = {Shape in Computing},+   author = {Barry Jay},+   journal = 	 "{ACM} Computing Surveys",+   year = 	 "1996",+   volume = 	 "28",+   number = 	 "2",+   pages = 	 "355--357",+}++@misc{ffi,+   title = {The {Haskell 98} Foreign Function Interface 1.0: An Addendum to the {Haskell 98} Report},+   editor = {Manuel Chakravarty},+   key = {FFI},+   year = {2002},+   month = {December},+   howpublished = {Available from \verb+http://www.haskell.org/+}+}++@misc{perlxs,+   title = {Perl {XS} Reference Manual},+   author = {Dean Roehrich and {The Perl Porters}},+   year = {1996},+   howpublished = {\verb+http://www.perldoc.com/perl5.6/pod/perlxs.html+}+}++@misc{swig,+   title = {{SWIG} : An Easy to Use Tool for Integrating Scripting Languages with {C} and {C++}},+   author = {David M. Beazley},+   year = {1996},+   howpublished = {\verb+http://www.swig.org/papers/Tcl96/tcl96.html+}+}++@inproceedings{types-prog,+   title = {Type Systems for Programming Languages},+   booktitle = {Handbook of Theoretical Computer Science},+   author = {John C. Mitchell},+   pages = {365--458},+   year = {1990},+   crossref = {htcs}+}++@book{htcs,+   title = {Handbook of Theoretical Computer Science},+   editor = {J. van Leeuwen},+   publisher = {Elsevier Science},+   year = {1990}+}++@misc{r5rs,+   title = {Revised$^5$ Report on the Algorithmic Language Scheme},+   author = {Richard Kelsey and William Clinger and Jonathan Rees},+   year = {1998},+   month = {February},+   howpublished = {Available from \verb+http://www.schemers.org/+}+ }
+ papers/ivor/Makefile view
@@ -0,0 +1,27 @@+all: ivor.pdf++SOURCES = ivor.tex intro.tex corett.tex tactics.tex code.tex \+          examples.tex conclusions.tex ../bib/literature.bib++ivor.pdf: $(SOURCES)+	pdflatex ivor+	-bibtex ivor+	-pdflatex ivor++ivor.ps: ivor.dvi+	dvips -o ivor.ps ivor++ivor.dvi: $(SOURCES)+	-latex ivor+	-bibtex ivor+	-latex ivor+	-latex ivor++package: ifl06.tar++ifl06.tar: ivor.dvi ivor.ps ivor.pdf .PHONY+	mkdir -p ifl06+	cp ../bib/*.bib *.tex *.ltx *.bib *.ps *.pdf *.dvi *.cls ifl06+	tar cvf ivor06.tar ifl06++.PHONY:
+ papers/ivor/alink.bib view
@@ -0,0 +1,22382 @@+Journals, books, and series
+@String{AI =     "Artificial Intelligence"}
+
+@String{Acta =   "Acta Informatica"}
+
+@String{CACM =   "Communications of the {ACM}"}
+
+@String{CJ =     "Computer Journal"}
+
+@String{ESOP =   "European Symposium on Programming"}
+
+@String{FPCA =   "International Conf. on Functional Programming
+                 Languages and Computer Architecture"}
+
+@String{IFIP =   "IFIP World Congress Proceedings"}
+
+@String{IPL =    "Information Processing Letters"}
+
+@String{JACM =   "Journal of the {ACM}"}
+
+@String{JCSS =   "Journal of Computer and System Sciences"}
+
+@String{JFP =    "Journal of Functional Programming"}
+
+@String{JSC =    "Journal of Symbolic Computation"}
+
+@String{JTASPEFL = "Analyse Statique en Programmation {\'E}quationnelle,
+                 Fonctionnelle, et Logique, Bordeaux, France, Octobre
+                 1991 (Bigre, vol. 74)"}
+
+@String{LASC =   "{LISP} and Symbolic Computation"}
+
+@String{LFP =    "{ACM} Conf. on {LISP} and Functional Programming"}
+
+@String{LICS =   "{IEEE} Symposium on Logic in Computer Science"}
+
+@String{LNCS =   "LNCS"}
+
+@String{MFCS =   "Mathematical Foundations of Computer Science"}
+
+@String{MFPLS =  "Mathematical Foundations of Programming Language
+                 Semantics"}
+
+@String{NGC =    "New Generation Computing"}
+
+@String{PEMC =   "Partial Evaluation and Mixed Computation"}
+
+@String{PEPM91 =   "Partial Evaluation and Semantics-Based Program
+                 Manipulation, New Haven, Connecticut (Sigplan Notices,
+                 vol. 26, no. 9, September 1991)"}
+
+@String{PEPM92 = "Partial Evaluation and Seman\-tics-Based Program
+                 Manipulation, San Francisco, California, June 1992
+                 (Technical Report {YALEU/DCS/RR}-909)"}
+
+@String{PEPM93 = "Partial Evaluation and Seman\-tics-Based Program
+                 Manipulation, Copenhagen, Denmark, June 1993"}
+
+@String{PEPM94 = "Partial Evaluation and Seman\-tics-Based Program
+                 Manipulation, Orlando, Florida, June 1994 (Technical
+                 Report 94/9, Department of Computer Science, University
+                 of Melbourne)"}
+
+@String{PDO =    "Programs as Data Objects, Copenhagen, Denmark (Lecture
+                 Notes in Computer Science, vol. 217)"}
+
+@String{POPL =   "ACM Symposium on Principles of Programming Languages"}
+
+@String{SCP =    "Science of Computer Programming"}
+
+@String{SIGPLAN = "Sigplan Notices"}
+
+@String{SMD =    "Soviet Mathematics Doklady"}
+
+@String{SPE =    "Software -- Practice and Experience"}
+
+@String{TCS =    "Theoretical Computer Science"}
+
+@String{TOPLAS = "ACM Transactions on Programming Languages and
+                 Systems"}
+
+@String{TSE =    "IEEE Transactions on Software Engineering"}
+
+@String{WSA92 =  "WSA '92, Static Analysis, Bordeaux, France, September
+                 1992. Bigre vols 81--82, 1992"}
+
+Publishers
+@String{ACM =    "ACM Press"}
+
+@String{A-W =    "Addison-Wesley"}
+
+@String{AP =     "Academic Press"}
+
+@String{CSP =    "Computer Science Press"}
+
+@String{CUP =          "Cambridge University Press"}
+@String{CUPtracts =    "Cambridge Tracts in Theoretical Computer Science"}
+
+@String{IEEE =   "IEEE"}
+
+@String{IEEECSP = "IEEE Computer Society"}
+
+@String{ISO =    "ISO"}
+
+@String{JWS =    "John Wiley \& Sons"}
+
+@String{MIT =    "MIT Press"}
+
+@String{N-H =    "North-Holland"}
+
+@String{OUP =    "Oxford University Press"}
+
+@String{P-H =    "Prentice Hall"}
+
+@String{S-V =    "Springer-Verlag"}
+
+@String{SL =     "Studentlitteratur"}
+
+@String{WHF =    "W.H. Freeman"}
+
+@String{Yale =   "Yale University"}
+
+Institutions and people
+@String{BEJ =    "D. Bj{\o}rner and A.P. Ershov and N.D. Jones"}
+
+@String{CCN =    "Computing Center"}
+
+@String{CTH =    "Chalmers University of Technology"}
+
+@String{DIKU =   "DIKU, University of Copenhagen, Denmark"}
+
+@String{IDDTH =  "Department of Computer Science, Technical University
+                 of Denmark"}
+
+@String{ISI =    "Informatics Systems Institute, Novosibirsk, USSR"}
+
+@String{PMG =    "Programming Methodology Group, Chalmers University of
+                 Technology"}
+
+@String{PROCOS = "ProCoS II, ESPRIT BRA 7071"}
+
+@String{UPMAIL = "UPMAIL, Uppsala University, Sweden"}
+		  
+From:  James Hook -- bibliography data base
+
+First some helpfull abbreviations.  These should eventually
+become standard:
+
+@String { TAMS = "Transactions of the American Mathematical Society"}
+@String {  LNM = "Lecture Notes in Mathematics"}
+@String {  TSE = "IEEE Transactions on Software Engineering" }
+@string{lncs = "Lecture Notes in Computer Science"}
+@string{LNCS = "Lecture Notes in Computer Science"}
+
+@string{nh =    "North-Holland"}
+@string{sv =    "Springer-Verlag"}
+@string{aw =    "Addison-Wesley"}
+@string{ab =    "Allyn and Bacon"}
+@string{ph =    "Prentice-Hall"}
+ 
+
+I am assuming that the names of POPL Conf.s are as regular as
+they appear.
+
+@String{ POPL19 ="Conf. Record of the Nineteenth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL18 ="Conf. Record of the Eighteenth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL17 ="Conf. Record of the Seventeenth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL16 ="Conf. Record of the Sixteenth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL15 ="Conf. Record of the Fifteenth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL14 ="Conf. Record of the Fourteenth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL13 ="Conf. Record of the Thirteenth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL12 ="Conf. Record of the Twelfth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL11 ="Conf. Record of the Eleventh Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL10 ="Conf. Record of the Tenth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL9 ="Conf. Record of the Ninth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL8 ="Conf. Record of the Eigth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL7 ="Conf. Record of the Seventh Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL6 ="Conf. Record of the Sixth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL5 ="Conf. Record of the Fifth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL4 ="Conf. Record of the Fourth Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL3 ="Conf. Record of the Third Annual
+		ACM Symp. on Principles of Programming Languages" }
+@String{ POPL2 ="Conf. Record of the Second Annual
+		ACM Symp. on Principles of Programming Languages" }
+
+@String{CuCS = "Cornell University, Department of Computer Science"}
+@String{DECSRC = "Digital Equipment Corporation, Systems Research Center"}
+@String{SRICSL = "SRI International, Computer Science Laboratory"}
+@String{ORA = "Odyssey Research Associates"}
+@String{LFCS = "Laboratory for the Foundations of Computer Science, 
+	Dept. of Computer Science, University of Edinburgh"}
+@String{OGICSE = "Oregon Grad. Inst."}
+
+@MISC{KirchnerKirchner-greco-98,
+        AUTHOR = {Kirchner, Claude and Kirchner, H\'{e}l\`{e}ne},
+        TITLE = {Rewriting, Solving, Proving},
+        HOWPUBLISHED = {Notes de cours de l'\'{e}cole jeunes chercheurs
+                        en programmation}, 
+        year = 1998,
+        ADDRESS = {Nantes (France)}}
+
+@Article{Nielson:1988:TSC,
+author =       "Flemming Nielson and Hanne Riis Nielson",
+title =        "Two-level semantics and code generation",
+journal =      "Theoretical Computer Science",
+volume =       "56",
+number =       "1",
+pages =        "59--133",
+year =         1988,
+coden =        "TCSCDI",
+ISSN =         "0304-3975",
+bibdate =      "Sat Nov 22 13:29:49 MST 1997",
+acknowledgement = ack-nhfb,
+classification = "C4240 (Programming and algorithm theory); C6150C
+               (Compilers, interpreters and other processors)",
+corpsource =   "Dept. of Comput. Sci., Tech. Univ. of Denmark, Lyngby,
+               Denmark",
+keywords =     "activation records; code generation; compile-time;
+                 correctness; data flow analysis; Kripke-like relations;
+                 Pascal-like languages; program compilers; program
+                 verification; programming theory; run-time;
+                 stack-machine; syntactic restrictions; two-level
+                 denotational metalanguage; two-level semantics",
+pubcountry =   "Netherlands A04",
+treatment =    "T Theoretical or Mathematical",
+}
+
+
+
+@InProceedings{MTBS99,
+  author =       "Eugenio Moggi and Walid Taha and Zine El-Abidine Benaissa
+                  and Tim Sheard",
+  title =        "An Idealized {M}eta{ML}:  
+                  Simpler, and More Expressive",
+  booktitle =    "European Symposium on Programming {(ESOP)}",
+  pages =        "193--207",
+  year =         1999,
+  volume =       1576,
+  series =       LNCS,
+  publisher =    "Springer-Verlag",
+  OPTnote =         "An extended version appears in \cite{MTBS98TR}",
+}
+
+@InProceedings{Flanagan99,
+  author =       "Cormac Flanagan and Mart{\'\i}n Abadi",
+  title =        "Types for Safe Locking",
+  booktitle =    "European Symposium on Programming {(ESOP)}",
+  volume =       "1576",
+  series =       LNCS,
+  publisher =    "Springer-Verlag",
+  pages =        "91--108",
+  year =         "1999",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Tue Sep 14 06:09:05 MDT 1999",
+  acknowledgement = ack-nhfb,
+  keywords =     "ESOP; ETAPS; programming; software",
+}
+
+@inproceedings{scp91-felleisen,
+  author =       "Matthias Felleisen",
+  year =         "1991",
+  booktitle =    "Science of Computer Programming",
+  volume =       "17",
+  pages =        "35-75",
+  note =         "Preliminary version in: {\it Proc. European
+                  Symposium on Programming}, Lecture Notes in Computer Science,
+                  432. Springer-Verlag (1990), 134--151.",
+  title =        "On the Expressive Power of Programming Languages"
+}
+
+@InProceedings{Thiemann99,
+  author =       "Peter Thiemann",
+  title =        "Higher-Order Code Splicing",
+  booktitle =    "European Symposium on Programming (ESOP)",
+  OPTcrossref =  {},
+  OPTkey =       {},
+  year =         1999,
+  OPTeditor =    {},
+  volume =       1576,
+  OPTnumber =    {},
+  series =       LNCS,
+  OPTaddress =   {},
+  OPTorganization = {},
+  publisher =    "Springer-Verlag",
+  OPTannote =    {}
+}
+
+@TechReport{MTBS98TR,
+  author = 	 "Eugenio Moggi and Walid Taha and Zine El-Abidine Benaissa
+                  and Tim Sheard",
+  title = 	 "An Idealized {M}eta{ML}:  
+                  Simpler, and More Expressive (Includes Proofs)",
+  institution =  "OGI",
+  year = 	 1998,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "CSE-98-017",
+  note  =        "Available from \cite{ogi-tr-site}"
+}
+
+@Article{Moggi:91,
+Author={Moggi, Eugenio},
+Title={Notions of Computation and Monads},
+Journal={Information and Computation},
+Volume=93,
+Number=1,
+Year=1991}
+
+@InProceedings{Moggi:98,
+Author={Moggi, Eugenio},
+Title={Functor Categories and two-level Languages},
+Booktitle={Foundations of Software Science and Computation
+           Structures {(FoSSaCS)}},
+Volume=1378,
+Series=LNCS,
+Publisher={Springer Verlag},
+Year=1998}
+
+@InProceedings{Wickline:98,
+  title =        "Run-time Code Generation and {Modal-ML}",
+  author =       "Philip Wickline and Peter Lee and Frank Pfenning",
+  booktitle =    "Proc. Conf. on
+                 Programming Language Design and Implementation
+                 ({PLDI})",
+  address =      "Montreal",
+  pages =        "224--235",
+  year =         1998,
+  references =   "\cite{PLDI::AuslanderPCEB1996}
+                 \cite{POPL::ConselN1996} \cite{SCP::cousineauCM1987}
+                 \cite{LICS::Davies1996} \cite{POPL::DaviesP1996}
+                 \cite{POPL::EnglerHK996} \cite{POPL::JorringS1986}
+                 \cite{PLDI::LeeL1996} \cite{ACMCS::LeoneL1998}
+                 \cite{SPE::PikeLR1985} \cite{ACMCS::WicklineLPD1998}",
+}
+@InCollection{Barendregt91,
+  author =       "Henk P. Barendregt",
+  title =        "Lambda Calculi with Types",
+  year =         1991,
+  booktitle =    "Handbook of Logic in Computer Science",
+  editor =       "S. Abramsky and D. M. Gabbay and T. S. E. Maibaum",
+  publisher =    "Oxford University Press",
+  address =      "Oxford",
+}
+@Book{Hindley97,
+  author =       "J. Roger Hindley",
+  title =        "Basic Simple Type Theory",
+  publisher =    CUP,
+  year =         1997,
+  key =          "Hindley",
+  volume =       42,
+  series =       CUPtracts,
+  address =      "Cambridge",
+  annote =       "Many references.",
+}
+
+@Article{Kohlbecker:86,
+  author =       "Eugene E. Kohlbecker and Daniel P. Friedman and
+                 Matthias Felleisen and Bruce Duba",
+  year =         "1986",
+  journal =      "{ACM} Conf. on {LISP} and Functional Programming",
+  pages =        "151--161",
+  title =        "Hygienic macro expansion",
+}
+
+@InProceedings{lfp86*151,
+  author =       "Eugene Kohlbecker and Daniel P. Friedman and Matthias
+                 Felleisen and Bruce Duba",
+  title =        "Hygienic Macro Expansion",
+  pages =        "151--181",
+  ISBN =         "0-89791-200-4",
+  editor =       "Richard P. Gabriel",
+  booktitle =    "Proc. {ACM} Conf. on {LISP} and
+                 Functional Programming",
+  address =      "Cambridge, MA",
+  month =        aug,
+  year =         "1986",
+  publisher =    "ACM Press",
+}
+
+@Article{purelyFunctional,
+  author =       "Amr Sabry",
+  title =        "What is a Purely Functional Language?",
+  journal =      jfp,
+  year =         1998,
+  volume = "8",
+  number = "1",
+  pages = "1-22",
+  month = jan
+}
+
+@InProceedings{impcbneed,
+  author =       "Zena M. Ariola and Amr Sabry",
+  title =        "Correctness of Monadic State: An Imperative
+                  Call-by-Need Calculus",
+  booktitle =    popl,
+  year =         1998,
+  publisher =    acm,
+  pages = "62-74"
+}
+
+@InProceedings{erkok-launchbury,
+   author    = "Levent {Erk\"{o}k} and John Launchbury",
+   title     = "Recursive Monadic Bindings",
+   booktitle = "Proc. Fifth {ACM} {SIGPLAN} International
+                Conf. on Functional Programming, {ICFP'00}",
+   year      = "2000",
+   month     = "September",
+   ISBN      = "1-58113-202-6",
+   pages     = "174--185",
+   publisher = "ACM Press",
+}                  
+
+
+@InProceedings{Steele:93,
+  author =       "Guy L. {Steele, Jr.} and Richard P. Gabriel",
+  title =        "The Evolution of {LISP}",
+  pages =        "231--270",
+  ISBN =         "0-89791-570-4",
+  editor =       "Richard L. Wexelblat",
+  booktitle =    "Proc. Conf. on History of
+                 Programming Languages",
+  series =       "ACM Sigplan Notices",
+  volume =       "28(3)",
+  publisher =    ACM,
+  address =      "New York",
+  year =         1993,
+}
+
+@Article{Nielson:1989:TSA,
+  author =       "Flemming Nielson",
+  title =        "Two-level semantics and abstract interpretation",
+  journal =      "Theoretical Computer Science",
+  volume =       "69",
+  number =       "2",
+  pages =        "117--242",
+  day =          "11",
+  year =         1989,
+  coden =        "TCSCDI",
+  ISSN =         "0304-3975",
+  bibdate =      "Sat Nov 22 13:24:22 MST 1997",
+  acknowledgement = ack-nhfb,
+  classification = "C4240 (Programming and algorithm theory); C6150G
+                 (Diagnostic, testing, debugging and evaluating
+                 systems)",
+  corpsource =   "Dept. of Comput. Sci., Tech. Univ. of Denmark, Lyngby,
+                 Denmark",
+  keywords =     "abstract interpretation; binding time; collecting
+                 semantics; compile-time; correctness; data flow
+                 analysis; denotational semantics; implementable
+                 analysis; most precise analysis; partial evaluation;
+                 program analysis; program verification; run-time;
+                 static semantics",
+  pubcountry =   "Netherlands",
+  treatment =    "B Bibliography; P Practical; T Theoretical or
+                 Mathematical",
+}
+
+@Book{Barwise:78:Kleene,
+  author = 	 "J. Barwise and  H. J.  Keisler and  K. Kunen (Editors)",
+  title = 	 "The Kleene Symposium",
+  publisher = 	 "North-Holland",
+  year = 	 1978,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  number = 	 101,
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+}
+
+
+
+@InProceedings{Bondorf:92,
+  author =       "Anders Bondorf",
+  title =        "Improving binding times without explicit
+                 {CPS}-conversion",
+  booktitle =    "1992 ACM Conf. on Lisp and Functional
+                 Programming. San Francisco, California",
+  year =         1992,
+  pages =        "1--10",
+  summary =      "Binding times are improved by transforming a
+                 specializer written in continuation passing style. The
+                 improvements enable straightforward safe treatment of
+                 partially static data structures.",
+  keywords =     "partial evaluation, context propagation,
+                 continuations, frozen expressions, generating
+                 extensions, dynamic choice of static values, Similix",
+}
+
+@PhdThesis{Bondorf90,
+  author = 	 "Anders Bondorf",
+  title = 	 "Self-{A}pplicable {P}artial {E}valuation",
+  school = 	 "University of Copenhagen",
+  year = 	 1990,
+  OPTkey = 	 {},
+  OPTaddress = 	 {},
+  OPTtype = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{Bondorf:89:ASelf-Applicable,
+  author =       "Anders Bondorf",
+  title =        "A Self-Applicable Partial Evaluator for Term Rewriting
+                 Systems",
+  booktitle =    "TAPSOFT '89. Proc. International Conf. Theory and Practice of
+                 Software Development, Barcelona, Spain. (Lecture Notes
+                 in Computer Science, Vol. 352)",
+  editor =       "J. Diaz and F. Orejas",    
+  publisher =    S-V,                        
+  pages =        "81--95",                   
+  year =         "1989",                     
+  semno =        "D-4",                      
+  summary =      "A self-applicable partial evaluator for restricted
+                 call-by-value term rewriting systems is described. The
+                 problem of partially evaluating pattern matching is
+                 solved by translating patterns into decision trees.",
+  keywords =     "self-application, partial evaluation, term rewriting
+                 systems",                   
+}                                            
+
+@Misc{ogi-tr-site,
+  key = 	 "Oregon Gradute Institute",
+  OPTauthor = 	 {},
+  title = 	 "{O}regon {G}raduate {I}nstitute
+                  {T}echnical {R}eports.  {P.O. Box 91000, Portland, OR 97291-1000,USA.}",
+  howpublished = "Available online from 
+                  \fr{ftp://cse.ogi.edu/pub/tech-reports/README.html}",
+  OPTyear = 	 {},
+  note = 	 "Last viewed August 1999",
+  OPTannote = 	 {},
+}
+
+@Misc{PhD, key = "{Resources for PhD Students}", OPTauthor = {}, title =
+  "{Resources for PhD Students}",
+  howpublished = "Available online from
+  \fr{http://www.cs.rice.edu/~taha/phd-reading.html}", year = 2003,
+  OPTnote = "", OPTannote = {}, }
+
+@Misc{MetaOCaml, key = "{MetaOCaml} Homepage", title =
+  "{M}eta{OC}aml: A Compiled, Type-safe Multi-stage Programming
+  Language", howpublished = "Available online from
+  \fr{http://www.cs.rice.edu/~taha/MetaOCaml/}", year = 2001,
+  OPTnote = "", OPTannote = {}, }
+
+
+@Misc{LVFPGA, 
+      key = "{LabVIEW FPGA Module}", author = "{National Instruments}", title =
+  "{LabVIEW FPGA Module}"
+  , howpublished = "Available online from
+  \fr{http://sine.ni.com/apps/we/nioc.vp?cid=11784\&lang=US}", year = 2003,
+}
+
+@Misc{LVRT, key = "{Introduction to LabVIEW Real-Time}", author = "{National Instruments}", title =
+  "{Introduction to LabVIEW Real-Time}"
+  , howpublished = "Available online from
+  \fr{http://volt.ni.com/niwc/labviewrt/lvrt\_intro.jsp?node=2381\&node=2381}", year = 2003,
+  OPTnote = "", OPTannote = {}, }
+
+@Misc{TwelfOnline, key = "{Twelf} Homepage", OPTauthor = {}, title =
+  "{Twelf}:  A Meta-Logical Framework", howpublished = "Available online from
+  \fr{http://www.twelf.org}", year = 2001,
+  OPTnote = "", OPTannote = {} }
+
+@TechReport{BMTS98TR,
+  author = 	 "Zine El-Abidine Benaissa and Eugenio Moggi and Walid Taha 
+                  and Tim Sheard",
+  title = 	 "A Categorical Analysis of Multi-Level Languages (Extended 
+                  Abstract)",
+  institution =  "Department of Computer Science, Oregon Graduate Institute",
+  year = 	 1998,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "CSE-98-018",
+  note  =        "Available from \cite{ogi-tr-site}",
+  OPTannote = 	 {}
+}
+
+@InProceedings{BMTS99,
+  author = 	 "Zine El-Abidine Benaissa and Eugenio Moggi and Walid Taha 
+                  and Tim Sheard",
+  title = 	 "Logical Modalities and Multi-Stage Programming",
+  booktitle = 	 "Federated Logic Conf. ({FLoC}) 
+                  Satellite Workshop on Intuitionistic
+                  Modal Logics and Applications ({IMLA})",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1999,
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTaddress = 	 {},
+  OPTpages = 	 {},
+  OPTannote = 	 {}
+}
+
+@TechReport{TS99TR,
+  author = 	 "Walid Taha and Tim Sheard",
+  title = 	 "{MetaML} and Multi-Stage Programming 
+                  with Explicit Annotations",
+  institution =  "Department of Computer Science, Oregon Graduate Institute",
+  year = 	 1999,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "CSE-99-007",
+  note  =        "Extended version of \cite{TS97}.  
+                  Available from \cite{ogi-tr-site}",
+  OPTannote = 	 {}
+}
+
+@Book{Boerger:89:Computability,
+  author = 	 "E. Boerger",
+  title = 	 "Computability",
+  publisher = 	 "North-Holland",
+  year = 	 1989,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  number = 	 128,
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+}
+
+@TechReport{AITR1427,
+       address =      MITad,
+       keywords =     "reflection, matching, equiation, reification,
+                      higher-order",
+       year =         1993,
+       pages =        "180",
+       author =       "Guillermo J. Rozas",
+       title =        "Translucent Procedures, Abstraction without Opacity",
+       contract =     "N00014-92-J-4097, MIP-9001651",
+       number =       "AI TR 1427",
+       abstract =     "This report introduces TRANSLUCENT PROCEDURES as a new
+                      mechanism for implementing behavioral abstractions.
+                      Like an ordinary procedure, a translucent procedure can
+                      be invoked, and thus provides an obvious way to capture
+                      a BEHAVIOR. Translucent procedures, like ordinary
+                      procedures, can be manipulated as first-class objects
+                      and combined using functional composition. But unlike
+                      ordinary procedures, translucent procedures have
+                      structure that can be examined in well-specified
+                      non-destructive ways, without invoking the procedure.",
+       institution =  MIT,
+       url =          "ftp://publications.ai.mit.edu/ai-publications/1993/AITR-1427.ps.Z",
+     }
+
+@TechReport{AITR901,
+       address =      MITad,
+       keywords =     "knowledge representation, representation languages,
+                      meta-representation, reflection, artificial
+                      intelligence, AI languages, RLL",
+       year =         1986,
+       pages =        "95",
+       author =       "Kenneth W. {Haase and Jr.}",
+       title =        "{ARLO}: Another Representation Language Offer",
+       number =       "AI TR 901",
+       institution =  MIT,
+     }
+
+
+@Misc{Amphion:Page,
+  OPTkey = 	 {},
+  OPTauthor = 	 {},
+  title = 	 "Amphion Home Page",
+  OPThowpublished = {},
+  OPTyear = 	 {},
+  note = 	 "\mc{http://ic-www.arc.nasa.gov/ic/projects/amphion/}",
+}
+
+@Unpublished{Appel:88:Reopening,
+  author = 	 "Andrew W. Appel",
+  title = 	 "Re-opening Closures",
+  note = 	 "(Unpublished manuscript)",
+  OPTkey = 	 {},
+  year = 	 1988,
+}
+
+
+@Book{Appel:92:Compiling,
+  author = 	 "Andrew W. Appel",
+  title = 	 "Compiling with Continuations",
+  publisher = 	 "Cambridge University Press",
+  year = 	 1992,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@Book{vanHeijenoort:1977,
+  editor =       "J. van Heijenoort",
+  title =        "From Frege to Goedel, a Source Book in Mathematical
+                 Logic, 1879-1931",
+  edition =      "3",
+  publisher =    "Harvard University Press",
+  address =      "Cambridge",
+  year =         1977,
+  ISBN =         "0-674-32449-8",
+  descriptor =   "Mathematische Logik",
+  annote =       "Eine Auswahl klassischer Arbeiten auf dem Gebiet der
+                 mathematischen Logik",
+}
+
+@InProceedings{Thiemann:96:Full,
+  author =       "Peter Thiemann",
+  title =        "Towards Partial Evaluation of Full {S}cheme",
+  pages =        "95--106", 
+  booktitle =    "Reflection'96",
+  year =         1996,
+  editor =       "Gregor Kiczales",
+  address =      "San Francisco",
+}
+
+@Book{Arnberg:87:Bilingually,
+  author = 	 "Lenore Arnber",
+  title = 	 "Raising Children Bilingually:  The Pre-school Years",
+  publisher = 	 "Multilingual Matter",
+  year = 	 1987,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  address = 	 "Bank House, 8a Hill Road, Clevedon, Avon BS21 7HH, UK",
+  OPTedition = 	 {},
+  note = 	 "ISBN 0-905028-70-8",
+}
+
+@TechReport{BOWEN81,
+       key =          "Bowen \& Kowalski",
+       author =       "K. A. Bowen and R. A. Kowalski",
+       title =        "Amalgamating Language and Meta-Language in Logic
+                      Programming",
+       institution =  "School of Computer and Information Science Syracuse
+                      University",
+       year =         1981,
+       keywords =     "Foundations, theory manipulation; reflection",
+       bibdate =      "Tue Jul 5 11:21:16 1983",
+     }
+
+@Book{Barendregt84,
+	Author = "Henk P. Barendregt",
+	Title = "The Lambda Calculus:  Its Syntax and Semantics",
+	Publisher = "North-Holland",
+	Edition =  "Revised",
+	Address = "Amsterdam",
+	Year = 1984,
+	Series = "Studies in Logic and the Foundations of Mathematics",
+	Volume = 103
+}
+
+@PhDThesis{Bates79,
+	Author = "Joseph L. Bates",
+	Title = "A Logic for Correct Program Development",
+	School = "Cornell University",
+	Address = "Ithaca",
+	Year = 1979
+}
+
+@TechReport{Bates86,
+	Author = "Joseph L. Bates",
+	Title = "***GET REF from TANYA***",
+	Institution = CUCS,
+	Year = 1985,
+	Number = "TR 85--684",
+	Address = "Ithaca"
+}
+
+@InProceedings{Batory:94:Reengineering,
+  author = 	 "Don Batory and Jeff Thomas and Marty Sirkin",
+  title = 	 "Reengineering a Complex Application Using a Scalable Data Structure Compiler",
+  booktitle = 	 "
+     Proc. ACM SIGSOFT '94 Conf.",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1994,
+  OPTorganization = {},
+  OPTpublisher = {},
+  address = 	 "New Orleans",
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+}
+
+Bibliography on sources for partial eval examples BibTeX format).
+Mostly based on bib on PE by Peter Sestoft.  (The annotations have all
+been added locally, though).
+		  
+The collections is mainly of papers containing concrete examples of
+partial evaluation, in addition to a few significant papers in partial
+evaluation and reflection.
+
+Author: Walid Taha.  Last update: Wed Dec 20 15:06:49 PST 1995
+		 
+NB:  This file needs the file abbreviations.bib.  (Also extracted from
+     the bib by Peter Sestoft.)
+		  
+
+
+
+@InProceedings{Bawden:acm:lfp:1988,
+       author =       "Alan Bawden",
+       title =        "Reification without Evaluation",
+       crossref =     "acm:lfp:1988",
+       pages =        "342--351",
+       refs =         "7",
+       checked =      "19940504",
+       source =       "dept. library",
+       keywords =     "reification, reflection, Scheme, source",
+       abstract =     "Constructing self-referential systems, such as Brian
+                      Smith's 3-Lisp language, is actually more
+                      straightforward than you think. Anyone can build an
+                      infinite tower of processors (where each processor
+                      implements the processor at the next level below) by
+                      employing some common sense and one simple trick. In
+                      particular, it is {\em not} necessary to re-design
+                      quotation, take a stand on the relative merits of
+                      evaluation vs. normalization, or treat continuations as
+                      meta-level objects. This paper presents a simple
+                      programming language interpreter that illustrates how
+                      this can be done. By keeping its expression evaluator
+                      entirely separate from the mechanisms that implement
+                      its infinite tower, this interpreter avoids many
+                      troublesome aspects of previous self-referential
+                      programming languages. Given these basically
+                      straightforward techniques, processor towers might be
+                      easily constructed for a wide variety of systems to
+                      enable them to manipulate and reason about
+                      themselves.",
+       sjb =          "Amongst other things, describes how the two versions
+                      of \fr{call/cc} defined
+                      in~\cite{Wand:Friedman:acm:lfp:1986} are incorrect.",
+     }
+
+@mastersthesis{Bell94,
+	Author = "Jeffrey M. Bell",
+	Title = "An Implementation of {Reynold's} Defunctionalization Method 
+		for a Modern Functional Language",
+	School = ogicse,
+	year = 1994
+}
+
+@misc{Bell95a,
+	author = "Jeffrey M. Bell",
+	title = "{MTV-G} System Documentation",
+	year = 1995,
+	note = intooldocs
+}
+		        
+@misc{Bell95b,
+	author = "Jeffrey M. Bell",
+	title = "Lambda-Lifter Tool Documentation",
+	year = 1995,
+	note = intooldocs
+}		  
+		  
+@misc{Bell95c,
+	author = "Jeffrey M. Bell",
+	title = "Firstify Tool Documentation",
+	year = 1995,
+	note = intooldocs
+}
+
+@misc{Bell95d,
+	author = "Jeffrey M. Bell",
+	title = "{MTV-G} Test Case Generator Tool Documentation",
+	year = 1995,
+	note = intooldocs
+}
+
+@techreport{Bellegarde90,
+        Author = {Francoise Bellegarde},
+        Title = {Program transformation and rewriting},
+        Institution = OGICSE,
+        Number = "CSE-90-021",
+  note  =        "Available from \cite{ogi-tr-site}",
+        Year = 1990
+}
+
+@techreport {Bellegarde94a,
+	Author = "Fran\c{c}oise Bellegarde",
+	Title = "Automatic Transformations by Rewriting Techniques",
+	Institution = ogicse,
+	Number = "CSE-94-009",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1994
+}
+		  
+
+
+@techreport {Bellegarde94b,
+	Author = "Fran\c{c}oise Bellegarde",
+	Title = "A Transformation System Combining Partial Evaluation with Term Rewriting",
+	Institution = ogicse,
+	Number = "CSE-94-010",
+	Year = 1994,
+  note  =        "Available from \cite{ogi-tr-site}",
+}
+
+@techreport {Bellegarde94c,
+	Author = "Fran\c{c}oise Bellegarde",
+	Title = "Induction and Synthesis for Automatic Program Transformation",
+	Institution = ogicse,
+	Number = "CSE-94-022",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1994
+}
+
+@techreport {Bellegarde94d,
+	Author = "Fran\c{c}oise Bellegarde",
+	Title = "Automating Synthesis by Completion",
+	Institution = ogicse,
+	Number = "CSE-94-020",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1994
+}
+		  
+@misc{Bellegarde94e,
+	author = "Fran\c{c}oise Bellegarde",
+	title = "Astre: A Transformation System for First-Order Functional Programs",
+	year = 1994
+}
+
+@techreport {Bellegarde94f,
+	Author = "Fran\c{c}oise Bellegarde",
+	Title = "ASTRE: Towards A Fully Automated Program Transformation System",
+	Institution = ogicse,
+	Number = "CSE-94-027",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1994
+}
+
+@techreport {Bellegarde94g,
+	Author = "Fran\c{c}oise Bellegarde",
+	Title = "Termination Issues in Automated Synthesis",
+	Institution = ogicse,
+	Number = "CSE-94-028",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1994
+}
+
+@Article{Beraducci:Venturini:93,
+  author = 	 "Berarducci, A. and Venturini Zilli, M.",
+  title = 	 "Generalization of Unification",
+  journal = 	 JSC,
+  year = 	 1993,
+  OPTkey = 	 {},
+  volume = 	 16,
+  number = 	 5,
+  pages = 	 "478--492",
+  note = 	 {},
+}
+
+@Article{Bird:84,
+  author = 	 "R. S. Bird",
+  title = 	 "The Promotion and Accumulation Strategies in
+		  Transformational Programming",
+  journal = 	 TOPLAS,
+  year = 	 1984,
+  OPTkey = 	 {},
+  volume = 	 6,
+  number = 	 4,
+  pages = 	 "487--504",
+  note = 	 {},
+}
+		  
+@PHDTHESIS{Boehm84,
+	AUTHOR = {Hans-Juergen Karl Hermann Boehm},
+	TITLE = {A Logic for the {Russell} Programming Language },
+	SCHOOL = {Cornell University},
+	YEAR = 1984,
+	ADDRESS = "Ithaca",
+}
+
+@ARTICLE{Boehm87,
+	AUTHOR = {Hans-Juergen Boehm},
+	TITLE = {Constructive Real Interpretation of Numerical Programs},
+	JOURNAL = {{SIGPLAN} Notices},
+	YEAR = 1987,
+	VOLUME = {22},
+	NUMBER = {7},
+	PAGES = {214--221},
+	NOTE = {Proc. Symposium on
+		Interpreters and Interpretive Techniques}
+}
+
+@Article{Boudet:93,
+  author = 	 "Alexandre Boudet",
+  title = 	 "Combining Unification Algorithms",
+  journal = 	 JSC,
+  year = 	 1993,
+  OPTkey = 	 {},
+  volume = 	 16,
+  number = 	 6,
+  pages = 	 "597--626",
+  note = 	 {},
+}
+
+@Book{Bramer:Bramer:84,
+  author = 	 "Max Bramer and Dawn Bramer",
+  title = 	 "The Fifth Generation:  An Annotated Bibliography",
+  publisher = 	 "Addison-Wesley Publishing Company",
+  year = 	 1984,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  note = 	 {},
+}
+
+@Book{Bridges:94:Computability,
+  author = 	 "Douglas S. Bridges",
+  title = 	 "Computability:  A Mathematical Sketchbook",
+  publisher = 	 "Springer-Verlag",
+  year = 	 1994,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  series = 	 "Graduate Texts in Mathematics",
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+}
+
+@article{Bruijn72,
+        author = "Bruijn, N. G. de",
+        title = "Lambda Calculus Notation with Nameless Dummies,
+                 a Tool for Automatic Formula Manipulation, with
+		 Application to the {Church-Rosser} Theorem",
+        journal = "Indagaciones Mathematische",
+        volume = 34,
+        year = 1972,
+        pages = "381--392",
+	NOTE = {This also appeared in the Proc.
+		Koninklijke Nederlandse Akademie van Wetenschappen,
+		Amsterdam, series A, 75, No. 5}
+}
+
+@INPROCEEDINGS{Bruijn78,
+	AUTHOR = {Bruijn, N. G. de},
+	TITLE = {Lambda calculus with namefree formulas involving
+		 symbols that represent reference transforming mappings},
+	BOOKTITLE = {Proc. Koninklijke Nederlandse
+		     Akaemie van Wetenschappen},
+	YEAR = 1978,
+	PAGES = {348--356},
+        volume = 81,
+        number = 3,
+	Address = "Amsterdam",
+	NOTE = {This paper was dedicated to A. Heyting at the occasion
+		of his 80th birthday on May 9, 1978}
+}
+		  
+@InCollection{Bruijn80,
+	Author = "Bruijn, N. G. de",
+	Title = "A Survey of the Project {AUTOMATH}",
+	BookTitle = "To {H.~B. Curry}:  Essays on Combinatory Logic,
+		Lambda Calculus and Formalism",
+	Editor = "J. P. Seldin and J. Roger Hindley",
+	Publisher = "Academic Press",
+	Address = "New York",
+	Year = 1980
+}
+
+@InCollection{Cardelli91,
+  key =          "Cardelli",
+  author =       "Luca Cardelli",
+  title =        "Typeful Programming",
+  booktitle =    "Formal Description of Programming Concepts",
+  publisher =    "Springer-Verlag",
+  year =         1991,
+  editor =       "E. J. Neuhold and M. Paul",
+  series =       "IFIP State-of-the-Art Reports",
+  pages =        "431--507",
+  address =      "New York",
+  annote =       "ISBN 0-387-53961-1. 52 references.",
+}
+
+@Article{Lescanne96,
+  title =        "{$\lambda\nu$}, a calculus of explicit substitutions
+                 which preserves strong normalisation",
+  author =       "Zine-El-Abidine Benaissa and Daniel Briaud and Pierre
+                 Lescanne and Jocelyne Rouyer-Degli",
+  pages =        "699--722",
+  journal =      "Journal of Functional Programming",
+  year =         1996,
+  volume =       "6",
+  number =       "5",
+}
+
+@InCollection{Cardelli97,
+  author =       "Cardelli, Luca",
+  publisher =    "CRC Press",
+  title =        "Type Systems",
+  editor="{Tucker, Jr.}, Allen B.",
+  booktitle =    "The Computer Science and Engineering Handbook",
+  year =         1997,
+}
+
+@TechReport{Cardelli86,
+	Author = "Luca Cardelli",
+	Title = "A Polymorphic lambda-calculus with Type:Type",
+	Institution = DECSRC,
+	Year = 1986,
+	Address = "Palo Alto"
+}
+		  
+@MISC{Cardelli87pc,
+	AUTHOR = {Luca Cardelli},
+	YEAR = 1987,
+	NOTE = {Personal communication.}
+}
+
+@unpublished{Chin93,
+	author = "Wei-Ngan Chin and John Darlington",
+	title = "Higher-order removal: A modular approach",
+	note = "Unpublished work",
+	year = 1993
+}
+		  
+@book{Church41,
+        author = "Alonzo Church",
+        title = "The Calculi of Lambda Conversion",
+        publisher = "Princeton University Press",
+        address = "Princeton",
+        year = 1941
+}
+
+
+@InProceedings{Consel:90:FromInterpreting,
+  author =       "Charles Consel and Olivier Danvy",
+  title =        "From Interpreting to Compiling Binding Times",
+  booktitle =    "ESOP '90. 3rd European Symposium on Programming,
+                 Copenhagen, Denmark, May 1990 (Lecture Notes in
+                 Computer Science, vol. 432)",
+  year =         1990,
+  editor =       "N. Jones",
+  pages =        "88--105",
+  publisher =    S-V,
+  note =         "",
+}
+
+@Article{H98,
+  author =       "R.J.M. Hughes",
+  title =        "Type specialization",
+  journal =      "ACM Computing Surveys",
+  volume =       "30",
+  number =       "3es",
+  year =         "1998",
+  coden =        "CMSVAN",
+  ISSN =         "0360-0300",
+  bibdate =      "Mon Jan 4 05:41:38 MST 1999",
+  acknowledgement = ack-nhfb,
+}
+
+@InProceedings{Consel:91:ForABetter,
+  author =       "Charles Consel and Olivier Danvy",
+  title =        "For a Better Support of Static Data Flow",
+  booktitle =    "Functional Programming Languages and Computer
+                 Architecture",
+  year =         1991,
+  editor =       "R.J.M. Hughes",
+  pages =        "496--519",
+  organization = ACM,
+  series = LNCS,
+  volume = 523,
+  publisher =    S-V,
+  address = "Cambridge",
+  note =         "",
+}
+
+
+
+@Article{Hilbert:MathematicsProblems,
+  author = 	 "David Hilbert",
+  title = 	 "Mathematics Problems",
+  journal = 	 "Bulletin of the American Mathematical Society",
+  year = 	 1901,
+  OPTkey = 	 {},
+  volume = 	 "8",
+  OPTnumber = 	 {},
+  pages = 	 "437--479",
+  note = 	 "Reproduced in \cite[Vol. I]{CampbellHiggins}",
+  OPTannote = 	 {}
+}
+
+
+
+
+@Proceedings{CampbellHiggins,
+  title = 	 "Mathematics:  People.  Problems.  Results.",
+  year = 	 1984,
+  OPTkey = 	 {},
+  editor = 	 "Douglas M. Campbell and John C. Higgins",
+  volume = 	 "I-III",
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  publisher =    "Wadsworth International",
+  OPTorganization = {},
+  OPTaddress = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{Consel:92:AProgramming,
+  author =       "Charles Consel and S. Pai",
+  title =        "A Programming Environment for Binding-Time Based
+                 Partial Evaluators",
+  booktitle =    PEPM92,
+  publisher =    Yale,
+  year =         1992,
+  pages =        "62--66",
+  note =         "",
+}
+
+@InProceedings{Consel:93:ATour,
+  author =       "Charles Consel",
+  title =        "A Tour of Schism: {A} Partial Evaluation System for
+                 Higher-Order Applicative Languages",
+  booktitle =    PEPM93,
+  year =         1993,
+  pages =        "145--154",
+  publisher =    ACM,
+  note =         "",
+}
+
+@InProceedings{Consel:93:IncrementalPartial,
+         author =       "Charles Consel and Calton Pu and Jonathan Walpole",
+         title =        "Incremental Partial Evaluation: The Key to High
+                        Performance, Modularity and Portability in {OP}erating
+                        Systems",
+         booktitle =    PEPM93,
+         year =         1993,
+         pages =        "44--46",
+         publisher =    ACM,
+       }
+
+@InProceedings{Consel:93:Tutorial,
+  author = 	 "Charles Consel and Olivier Danvy",
+  title = 	 "Tutorial Notes on Partial Evaluation",
+  booktitle = 	 POPL,
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1993,
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTaddress = 	 {},
+  pages = 	 "493--501",
+  OPTnote = 	 {},
+}
+
+@TechReport{Constable85,
+	Author = "Robert L. Constable",
+	Title = "The Semantics of Evidence",
+	Institution = CUCS,
+	Year = 1985,
+	Number = "85--684",
+	Address = "Ithaca"
+}
+		  
+@phdthesis{Coquand85,
+	Author = "Thierry Coquand",
+	Title = "Une Th{\'e}orie des Constructions",
+	Type = "Th{\`e}se de troisi{\`e}me cycle",
+	School = "Universit{\'e} Paris VII",
+	Year = 1985
+}
+
+@InProceedings{Coquand86a,
+	Author = "Thierry Coquand",
+	Title = "An Analysis of {Girard's} Paradox",
+	BookTitle = "Proc. Symposium on 
+			Logic in Computer Science",
+	Publisher = "IEEE Computer Society Press",
+	Address = "Washington",
+	Year = 1986,
+	pages = "227--236"
+}
+
+@unpublished{Coquand86b,
+        author = "Thierry Coquand",
+        title = "A Calculus of Constructions",
+        note = "Privately circulated.",
+        year = 1986
+}
+
+@phdthesis{Daalen80,
+        author = "Daalen, Diederik Ton von",
+        title = "The Language Theory of {AUTOMATH}",
+        school = "Technische Hogeschool Eindhoven",
+        year = 1980
+}
+
+
+@InProceedings{Danvy88,
+  author = 	 "Olivier Danvy",
+  title = 	 "Across the Bridge between Reflection and Partial Evaluation",
+  booktitle = 	 PEMC,
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  editor = 	 "D. Bjorner and A. P. Ershov and N. D. Jones" ,
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1988,
+  OPTorganization = {},
+  publisher =    "North-Holland",
+  OPTaddress = 	 {},
+  pages = 	 "83--116",
+  note = 	 "",
+}
+
+@InProceedings{Danvy:88:Intensions,
+       author =       "Olivier Danvy and Karoline Malmkj{\ae}r",
+       title =        "Intensions and Extensions in a Reflective Tower",
+       booktitle =    "Proc. 1988 ACM Conf. on {LISP} and
+                      Functional Programming",
+       year =         1988,
+       semno =        "D-9",
+       pages =        "327--341",
+       publisher =    ACM,
+       keywords =     "reflective language, denotational semantics,
+                      intensions, extensions, Tower of Interpreters",
+     }
+
+@TechReport{Danvy:95:EtaExpansion,
+  author = 	 "Olivier Danvy and Karoline Malmkjaer and Jens Palsberg",
+  title = 	 "Eta-Expansion Does The Trick",
+  institution =  "University of Aarhus",
+  year = 	 1995,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "RS-95-41",
+  address = 	 "Aarhus",
+  OPTnote = 	 {},
+  OPTannote = 	 "[Work Extending (The Essence)]",
+}
+
+@ARTICLE{Danvy:95:TheEssence,
+  author = 	 "Olivier Danvy and Karoline Malmkjaer and Jens Palsberg",
+  title = 	 "The Essence of Eta-Expansion in Partial Evaluation",
+  journal = 	 "{LISP} and Symbolic Computation",
+  year = 	 1995,
+  OPTkey = 	 {},
+  volume = 	 1,
+  number = 	 19,
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+}
+		  
+
+
+		  
+@InProceedings{Danvy:96:TypeDirected,
+  author = 	 "Olivier Danvy",
+  title = 	 "Type-Directed Partial Evaluation",
+  booktitle = 	 POPL,
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1996,
+  organization = ACM,
+  OPTpublisher = {},
+  address = 	 "Florida",
+  pages = 	 "242--257",
+  OPTnote = 	 {},
+}
+
+I am assuming that the names of POPL Conf.s are as regular as
+they appear.
+
+@String{ POPL17 ="Conf. Record of the Seventeenth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL16 ="Conf. Record of the Sixteenth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL15 ="Conf. Record of the Fifteenth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL14 ="Conf. Record of the Fourteenth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL13 ="Conf. Record of the Thirteenth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL12 ="Conf. Record of the Twelfth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL11 ="Conf. Record of the Eleventh Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL10 ="Conf. Record of the Tenth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL9 ="Conf. Record of the Ninth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL8 ="Conf. Record of the Eigth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL7 ="Conf. Record of the Seventh Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL6 ="Conf. Record of the Sixth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL5 ="Conf. Record of the Fifth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL4 ="Conf. Record of the Fourth Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL3 ="Conf. Record of the Third Annual
+		ACM Symposium on Principles of Programming Languages" }
+@String{ POPL2 ="Conf. Record of the Second Annual
+		ACM Symposium on Principles of Programming Languages" }
+
+@String{CuCS = "Cornell University, Department of Computer Science"}
+@String{DECSRC = "Digital Equipment Corporation, Systems Research Center"}
+@String{SRICSL = "SRI International, Computer Science Laboratory"}
+@String{ORA = "Odyssey Research Associates"}
+
+%GROUP(LICS87,
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1987,
+	PAGES = {7--17},
+	PUBLISHER = {{IEEE} Computer Society Press},
+	ADDRESS = "Washington",
+	NOTE = {The Conf. was held at Cornell University, Ithaca,
+		New York.}
+)
+
+
+
+@INPROCEEDINGS{Amadio&86,
+	AUTHOR = {Roberto Amadio and Kim B. Bruce and Giuseppe Longo},
+	TITLE = {The Finitary Projection Model of Second Order Lambda
+		 Calculus and Solutions to Higher Order Domain Equations},
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1987,
+	PAGES = {7--17},
+	PUBLISHER = {{IEEE} Computer Society Press},
+	ADDRESS = "Washington",
+	NOTE = {The Conf. was held at Cornell University, Ithaca,
+		New York.}
+}
+
+@Book{Davis:65:Undecidable,
+  author = 	 "Martin Davis (editor)" ,
+  title = 	 "The Undecidable:  Basic Papers On Undecidable
+		  Propositions, Unsolvable Problems, and Computable Functions",
+  publisher = 	 "Raven Press",
+  year = 	 1965,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+}
+@Article{Dershowitz:85,
+  author = 	 "Nachum Dershowitz",
+  title = 	 "Program Abstraction and Instantiation",
+  journal = 	 TOPLAS,
+  year = 	 1985,
+  OPTkey = 	 {},
+  volume = 	 7,
+  number = 	 3,
+  pages = 	 "446--477",
+  note = 	 {},
+}
+@Article{Dershowitz:85:Computing,
+  author = 	 "Nachum Dershowitz",
+  title = 	 "Computing with Rewrite Systems",
+  journal = 	 "Information and Control",
+  year = 	 1985,
+  OPTkey = 	 {},
+  volume = 	 65,
+  OPTnumber = 	 {},
+  pages = 	 "122--157",
+  OPTnote = 	 {},
+}
+
+@TECHREPORT{Boehm&80,
+	AUTHOR = {Hans-Juergen Boehm and Alan J. Demers and James E. Donahue},
+	TITLE = {An Informal Description of {Russell}},
+	INSTITUTION = CUCS,
+	YEAR = 1980,
+	NUMBER = {80--430},
+	ADDRESS = "Ithaca",
+	Note = {Revision of \cite{Demers&80a}}
+}
+
+
+@BOOK{Dijkstra76,
+	AUTHOR = {E. W. Dijkstra},
+	TITLE = {A Discipline of Programming},
+	PUBLISHER = {Prentice Hall},
+	YEAR = 1976,
+	ADDRESS = "Englewood Cliffs"
+}
+@ARTICLE{Boehm&86a,
+	AUTHOR = {Hans-Juergen Boehm and Alan J. Demers},
+	TITLE = {Implementing {Russell}},
+	JOURNAL = {{SIGPLAN} Notices},
+	YEAR = 1986,
+	VOLUME = {21},
+	NUMBER = {7},
+	PAGES = {186--195},
+	NOTE = {Proc. symposium on compiler
+		construction.}
+}
+
+@INPROCEEDINGS{Boehm&86b,
+	AUTHOR = {Hans-Juergen Boehm and Robert Cartwright and Michael
+		  J. {O'Donnell} and Mark Riggle},
+	TITLE = {Exact Real Arithmetic:  A Case Study in Higher Order
+		 Programming},
+	BOOKTITLE = {Proc. 1986 ACM Conf. on {LISP}
+		     and Functional Programming},
+	YEAR = 1986,
+	PAGES = {162--173},
+	ORGANIZATION = {ACM}
+}
+
+@ARTICLE{Donahue79,
+	AUTHOR = {James Donahue},
+	TITLE = {On the Semantics of ``Data Type''},
+	JOURNAL = sicomp,
+	YEAR = 1979,
+	VOLUME = {8},
+	NUMBER = {4},
+	PAGES = {546--560},
+}
+
+@TECHREPORT{Boehm&85,
+	AUTHOR = {Hans-Juergen Boehm and Alan J. Demers and James E. Donahue},
+	TITLE = {A Programmer's Introduction to Russell},
+	INSTITUTION = {Rice University},
+	YEAR = 1985,
+	NUMBER = {85-16}
+}
+
+@INPROCEEDINGS{Breazu-Tannen&87a,
+	AUTHOR = {Val Breazu-Tannen and Albert R. Meyer},
+	TITLE = {Computable Values Can Be Classical (Preliminary Report)},
+	BOOKTITLE = POPL14,
+	YEAR = 1987,
+	PAGES = {238--245},
+	ORGANIZATION = {ACM},
+}
+
+@INPROCEEDINGS{Breazu-Tannen&87b,
+	AUTHOR = {Val Breazu-Tannen and Albert R. Meyer},
+	TITLE = {Polymorphism is conservative over simple types
+		 (Preliminary Report) },
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1987,
+	PAGES = {7--17},
+	PUBLISHER = {{IEEE} Computer Society Press},
+	ADDRESS = "Washington",
+	NOTE = {The Conf. was held at Cornell University, Ithaca,
+		New York.}
+}
+
+@Article{Donahue:Demmers:85,
+  author = 	 "James Donahue and Alan Demers",
+  title = 	 "Data Types are Values",
+  journal = 	 TOPLAS,
+  year = 	 1985,
+  OPTkey = 	 {},
+  volume = 	 7,
+  number = 	 3,
+  pages = 	 "426--445",
+  note = 	 {},
+}
+
+
+@Article{Dougherty:Johann:92,
+  author = 	 "Daniel J. Dougherty and Patricia Johann",
+  title = 	 "An Improved General E-Unification Method",
+  journal = 	 JSC,
+  year = 	 1992,
+  OPTkey = 	 {},
+  volume = 	 14,
+  number = 	 4,
+  pages = 	 "303--320",
+  note = 	 {},
+}
+
+@misc{ESC94,
+	author = "Electronics Systems Center",
+	title = "Statement of Work: Software Design for Reliability and Reuse (SDRR) 
+	Phase II Project",
+	year = 1994
+}	
+@INPROCEEDINGS{Burstall&80,
+	AUTHOR = {R. M. Burstall and J. A. Goguen},
+	TITLE = {The semantics of {Clear}, a specification language},
+	BOOKTITLE = {Proceedings of Advanced Course on Abstract
+		     Software Specifications},
+	YEAR = 1980,
+	PAGES = {292--332},
+	PUBLISHER = {Springer-Verlag, Lecture Notes in Computer Science}
+}
+
+@InProceedings{Burstall&84,
+	Author = "R. Burstall and B. Lampson",
+	Title = "A Kernel Language for Abstract Data Types and Modules",
+	BookTitle = "Semantics of Data Types, 
+		International Symposium, Sophia-Antipolis, France",
+	Year = 1984,
+	Editor = "G. Kahn and D.B. MacQueen and G. Plotkin",
+	Publisher = "Springer-Verlag",
+	Address = "Berlin",
+	Series = LNCS,
+	Volume = 173
+}
+@Book{Enderton:72:Logic,
+  author = 	 "Herbert B. Enderton",
+  title = 	 "A Mathematical Introduction to Logic",
+  publisher = 	 "Academic Press",
+  year = 	 1972,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+}
+@Article{Feather:82,
+  author = 	 "Martin S. Feather",
+  title = 	 "A system for Assisting Program Transformation",
+  journal = 	 TOPLAS,
+  year = 	 1982,
+  OPTkey = 	 {},
+  volume = 	 4,
+  number = 	 1,
+  pages = 	 "1--20",
+  note = 	 {},
+}
+
+@INPROCEEDINGS{Floyd67,
+	AUTHOR = {R. Floyd},
+	TITLE = {Assigning meaning to programs},
+	BOOKTITLE = {Mathematical Asspects of Computer Science {XIX}},
+	YEAR = 1967,
+	PAGES = "19--32",
+	ORGANIZATION = {American Mathematical Society}
+}
+
+@article{Church&36,
+        author = "Alonzo Church and {J. B.} Rosser",
+        title = "Some Properties of Conversion",
+        journal = "Transactions of the American Mathematical Society",
+        volume = 39,
+        year = 1936,
+        pages = "472--482"
+}
+
+@BOOK{Clocksin,
+	AUTHOR = {W. F. Clocksin and C. S. Mellish},
+	TITLE = {Programming in Prolog},
+	PUBLISHER = {Springer-Verlag},
+	YEAR = 1981
+}
+
+@Article{Fradet:Metayer:91,
+  author = 	 "Pascal Fradet and Daniel Le Metayer",
+  title = 	 "Compilation of Functional Languages by Program
+		  Transformation",
+  journal = 	 TOPLAS,
+  year = 	 1991,
+  OPTkey = 	 {},
+  volume = 	 13,
+  number = 	 1,
+  pages = 	 "21--51",
+  note = 	 {},
+}
+
+@INPROCEEDINGS{Constable&85a,
+	AUTHOR = {Robert L. Constable and N. P. Mendlar},
+	TITLE = {Recursive Definitions in Type Theory},
+	BOOKTITLE = {Proceedings Logic of Programs, Lecture Notes in
+		     Computer Science Vol 193.},
+	YEAR = 1985,
+	PUBLISHER = {Springer-Verlag}
+}
+@article{Constable&85b,
+        author = "Robert L. Constable and Todd B. Knoblock and Joseph L. Bates",
+        title = "Writing Programs that Construct Proofs",
+        journal = "Journal of Automated Reasoning",
+        volume = 1,
+        year = 1985,
+        pages = "285--326"
+}
+
+@InProceedings{hils:2000,
+  author =       {Erik Hilsdale and Daniel P. Friedman},
+  title =        {Writing Macros in Continuation-passing Style},
+  booktitle =    {Proc. Workshop on Scheme and Functional
+Programming},
+  pages =        {53-60},
+  year =         {2000},
+  month =        sep,
+  annote =       {Rice University Technical Report 00-368}
+}
+
+@ARTICLE{Constable&84,
+	AUTHOR = {Rober L. Constable and Daniel R. Zlatin},
+	TITLE = {The type theory of {PL/CV3}},
+	JOURNAL = toplas,
+	YEAR = 1984,
+	VOLUME = {7},
+	NUMBER = {1},
+	PAGES = {72--93}
+}
+
+
+@Book{Constable&86,
+	Author = "Robert L. Constable and others",
+	Title ="Implementing Mathematics 
+		with the Nuprl Proof Development System",
+	Publisher = "Prentice Hall",
+	Address = "Englewood Cliffs",
+	Year = 1986
+}
+
+@INPROCEEDINGS{Constable&87,
+	AUTHOR = {Robert L. Constable and Scott Fraser Smith},
+	TITLE = {Partial Objects in Constructive Type Theory},
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1987,
+	PAGES = "183--193",
+	PUBLISHER = {{IEEE} Computer Society Press},
+	ADDRESS = "Washington",
+	NOTE = {The Conf. was held at Cornell University, Ithaca,
+		New York.}
+}
+
+@unpublished{Coquand&84,
+       author = "Thierry Coquand and G\'erard Huet",
+       title = "A Theory of Constructions",
+       note = "Presented at the International Symposium on
+               Semantics of Data Types, {Sophia-Antipolis}",
+       year = 1984
+}
+
+@unpublished{Coquand&85,
+       Author = "Thierry Coquand and G\'erard Huet",
+       Title = "Concepts Math\'ematiques et Informatiques Formalis\'es
+                  dans le Calcul des Constructions",
+       Note = "Colloque de Logique, Orsay (July 1985), North-Holland,
+               forthcoming"
+}
+
+@inproceedings{Coquand&86,
+       Author = "Thierry Coquand and G\'erard Huet",
+       Title = "Constructions: A Higher Order Proof System for Mechanizing
+                Mathematics",
+        Booktitle = "EUROCAL85",
+	Publisher = "Springer-Verlag",
+	Address = "Berlin",
+	Series = "Lecture Notes in Computer Science",
+	Volume = 203,
+	Year = 1986,
+        pages = "151--184"
+}
+@Article{Freudenberged:83,
+  author = 	 "Stefan M. Freudenberger, Jacob THE. Schwartz and
+		  Micha Sharir",
+  title = 	 "Experience with the SETL Optimizer",
+  journal = 	 TOPLAS,
+  year = 	 1983,
+  OPTkey = 	 {},
+  volume = 	 5,
+  number = 	 1,
+  pages = 	 "26--45",
+  note = 	 {},
+}
+@InProceedings{Friedman84a,
+       author =       "Daniel P. Friedman and Mitchell Wand",
+       title =        "Reification: Reflection Without Metaphysics",
+       booktitle =    "Conf. Record of the 1984 ACM Symposium on {LISP}
+                      and Functional Programming",
+       pages =        "348--355",
+       address =      "Austin",
+       year =         1984,
+     }
+
+@Article{Fuller:88:Mixed,
+  author = 	 "D. A. Fuller and S. Abramsky",
+  title = 	 "Mixed Computation of Prolog Programs",
+  journal = 	 "New Generation Computing",
+  year = 	 1988,
+  OPTkey = 	 {},
+  volume = 	 6,
+  number = 	 "2,3",
+  pages = 	 "119--142",
+  OPTnote = 	 {},
+}
+@misc{Cousineau&84,
+	title = "The {ML} Handbook, version 6.1",
+	author = "Guy Cousineau and G\'erard Huet and Larry Paulson",
+	note = "INRIA memeographed manuscript."
+}
+
+@Book{Curry&58,
+	Author = "H.  B. Curry and R. Feys",
+	Title = "Combinatory Logic",
+	Volume = "I",
+	Publisher = "North-Holland",
+	Address = "Amsterdam",
+	Year = 1958
+}
+@Article{Futamura:71:PartialEvaluation,
+  author = 	 "Yoshihiko Futamura",
+  title = 	 "Partial Evaluation of Computation Process -- an
+		  Approach to a Compiler-Compiler",
+  journal = 	 "Systems, Computers and Control",
+  year = 	 1971,
+  OPTkey = 	 {},
+  volume = 	 2,
+  number = 	 5,
+  pages = 	 "45--50",
+  note = 	 "[Via \cite{Jones:95:TenYears}]",
+}
+@INPROCEEDINGS{Demers&78,
+	AUTHOR = {Alan J. Demers and James E. Donahue and G. Skinner},
+	TITLE = {Data Types as Values:  Polymorphism, Type-checking,
+		Encapsulation},
+	BOOKTITLE = POPL5,
+	YEAR = 1978,
+	PAGES = "23--30",
+	PUBLISHER = {{ACM}}
+}
+
+@TECHREPORT{Demers&79,
+	AUTHOR = {Alan J. Demers and James E. Donahue},
+	TITLE = {Revised report on {Russell}},
+	INSTITUTION = CUCS,
+	YEAR = 1979,
+	NUMBER = {79--389},
+	ADDRESS = "Ithaca"
+}
+@TECHREPORT{Demers&80a,
+	AUTHOR = {Alan J. Demers and James E. Donahue and Hans-Juergen Boehm},
+	TITLE = {An Informal Description of {Russell}},
+	INSTITUTION = CUCS,
+	YEAR = 1980,
+	NUMBER = {80--430},
+	ADDRESS = "Ithaca",
+	Note = {Superceded by \cite{Boehm&80}, a revised version
+		prepared September}
+}
+@TECHREPORT{Demers&80b,
+	AUTHOR = {Alan J. Demers and James E. Donahue},
+	TITLE = {The Semantics of {Russell}:  An Exercise in Abstract
+		 Data Types},
+	INSTITUTION = CUCS,
+	YEAR = 1980,
+	NUMBER = {80--431},
+	ADDRESS = "Ithaca"
+}
+
+@INPROCEEDINGS{Demers&80c,
+	AUTHOR = {Alan J. Demers and James E. Donahue},
+	TITLE = {Data Types, Parameters and Type-Checking},
+	BOOKTITLE = POPL7,
+	YEAR = 1980,
+	PAGES = "12--23",
+	ORGANIZATION = {{ACM}}
+}
+@INPROCEEDINGS{Demers&80d,
+	AUTHOR = {Alan J. Demers and James E. Donahue},
+	TITLE = {Type Completeness as a Language Principle},
+	BOOKTITLE = POPL7,
+	YEAR = 1980,
+	PAGES = "234--244",
+	ORGANIZATION = {{ACM}}
+}
+
+@INPROCEEDINGS{Demers&83,
+	AUTHOR = {Alan J. Demers and James E. Donahue},
+	TITLE = {Making Variables Abstract: an Equational Theory for
+		 {Russell}},
+	BOOKTITLE = POPL10,
+	INSTITUTION = CUCS,
+	PAGES = "59--72",
+	YEAR = 1983,
+}
+
+@InCollection{Futamura:82:PartialComputation,
+  author = 	 "Yoshihiko Futamura",
+  title = 	 "Partial Computation of Programs",
+  booktitle = 	 "RIMS Symposia on Software Science and Engineering",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  publisher =    "Springer-Verlag",
+  year = 	 1982,
+  editor = 	 "Eiichi Goto and Koichi Furukawa and Reiji Nakajima
+		  and Ikuo Nakata and Akinori Yonezawa",
+  volume = 	 147,
+  OPTnumber = 	 {},
+  series = 	 LNCS,
+  OPTchapter = 	 {},
+  OPTtype = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  pages = 	 "1--31",
+  OPTnote = 	 {},
+}
+
+@article{Gentzen34,
+        author = "Gerhard Gentzen",
+        title = "Untersuchungen {{\"u}ber} das logische {Schliessen}",
+        journal = "Mathematische Zeitschrift",
+        volume = 39,
+        year = 1934,
+        pages = "176--210, 405--431",
+        note = "Translated in Sabo (ed.), {\em The Collected Papers
+                of Gerhard Gentzen} as ``Investigations into Logical
+                Deduction''"
+}
+@misc{Eichenlaub&88,
+	Author = {Carl Eichenlaub and James Hook},
+	title = {Preliminary Manual for Theory Manager Interface},
+	note = {Odyssey Research Associates, internal report.},
+	year = 1988
+}
+
+@incollection{Gentzen69,
+        author = "Gerhard Gentzen",
+        title = "Investigations into Logical Deduction",
+        booktitle = "The Collected Papers of Gerhard Gentzen",
+        editor = "M. E. Szabo",
+        publisher = "North-Holland Publishing Company",
+        address = "Amsterdam and London",
+        year = 1969,
+        pages = "68--131"
+}
+
+@Article{Fortune&83,
+	Author = "Steven Fortune and Daniel Leivant and Michael {O'Donnell}",
+	Title = "The Expressiveness of Simple and Second-Order Type 
+		 Structures",
+	Journal = JACM,
+	Year = 1983,
+	Volume = 30,
+	pages = "151--185"
+}
+@INPROCEEDINGS{Futasugi&85,
+	AUTHOR = {Kokichi Futasugi and Joseph A. Goguen and
+		  {Jean-Pierre} Jouannaud and {Jos\'e} Meseguer},
+	TITLE = {Principles of {OBJ2}},
+	BOOKTITLE = POPL12,
+	YEAR = 1985,
+	PAGES = "52--66",
+	ORGANIZATION = {ACM},
+}
+
+@InProceedings{Girard71,
+	Author = "{J.-Y.} Girard",
+	Title = "Une Extension de l'interpr{\'e}tation de {G\"odel} {\`a}
+		{l'analyse}, et son application {\`a} {l'\'elimination} des 
+		coupures dans {l'analyse} et la {th\'eorie} des types",
+	BookTitle = "Second Scandinavian Logic Symposium",
+	Editor = "J. E. Fenstad",
+	Publisher = "North-Holland",
+	Address = "Amsterdam",
+	Year = 1971,
+	pages = "63--92"
+}
+
+@phdthesis{Girard72,
+	Author = "{J.-Y.} Girard",
+	Title = "Interpr{\'e}tation fonctionelle et {\'e}limination 
+		des coupures dans l'arithm{\'e}tique d'ordre sup{\'e}rieur",
+	Type = "Th{\`e}se de Doctorat d'Etat" ,
+	School = "University of Paris {VII}",
+	Year = 1972
+}
+@Article{Gomard:92,
+  author = 	 "Carsten K. Gomard",
+  title = 	 "A Self-Applicable Partial Evaluator for the Lambda
+		  Calculus:  Correctness and Pragmatics",
+  journal = 	 TOPLAS,
+  year = 	 1992,
+  OPTkey = 	 {},
+  volume = 	 14,
+  number = 	 2,
+  pages = 	 "147--172",
+  note = 	 {},
+}
+@INPROCEEDINGS{Goguen&75,
+	AUTHOR = {Joseph A. Goguen and James Thatcher and Eric Wagner and
+		  J.B. Wright },
+	TITLE = {Abstract Types as Initial Algebras and Correctness of
+		 Data Representations},
+	BOOKTITLE = {Proceedings from the Conf. on Computer
+		     Graphics, Pattern Recognition and Data Structures},
+	YEAR = 1975,
+	PAGES = "89--93",
+	ORGANIZATION = {ACM},
+}
+
+@Article{Masini93,
+  title =        "2-{Sequent} Calculus: Intuitionism and Natural
+                 Deduction",
+  author =       "Masini, A.",
+  journal =      "Journal of Logic and Computation",
+  year =         1993,
+  volume =       "3",
+  number =       "5"
+}
+		  
+@InCollection{Masini96,
+  title =        "A computational interpretation of modal proofs",
+  booktitle =	 "Proof Theory of Modal Logic",
+  author =       "Martini, S. and Masini, A.",
+  editor =       "Wansing, H.",
+  publisher =    "Kluwer",
+  year =         1996
+}
+		  
+@InProceedings{Benton:1995:MLN,
+  author =       "Nick Benton",
+  title =        "A Mixed Linear and Non-Linear Logic: Proofs, Terms and
+                 Models",
+  series =       LNCS,
+  volume =       "933",
+  year =         1995,
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Sat May 11 13:45:32 MDT 1996",
+  acknowledgement = ack-nhfb,
+}
+
+
+
+@InProceedings{GHJ:99,
+  AUTHOR       = {Gl{\"u}ck, Robert and Hatcliff, John and J{\o}rgensen, Jesper},
+  YEAR         = 1999,
+  TITLE        = {Generalization in Hierarchies of Online Program Specialization
+                  Systems},
+  BOOKTITLE    = {Logic-Based Program Synthesis and Transformation},
+  editor       = {Flener, P.},
+  publisher    = {Springer-Verlag},
+  series       = {Lecture Notes in Computer Science},
+  volume       = {1559},
+  pages        = "179--198",
+  keywords     = {program transformation, metasystem transition, self-application,  
+                  generalization, program specialization},
+  summary      = {In recent work, we proposed a simple functional language S-graph-n 
+      to study meta-programming aspects of self-applicable online program 
+      specialization. The primitives of the language provide support for multiple 
+      encodings of programs. An important component of online program specialization
+      is the termination strategy. In this paper we show that such a representation 
+      has the great advantage of simplifying generalization of multiply encoded data.
+      We extend two basic methods to multiply encoded data: most specific 
+      generalization and the homeomorphic embedding relation. Examples illustrate 
+      their working in hierarchies of programs.},
+  supersedes   = {},
+  SEMNO        = {D-380},
+  PUF          = {Artikel i proceedings (med censur)},
+  ID           = {KonR}
+ }
+
+@InProceedings{Lazysml98,
+  author =       "Philip Wadler and Walid Taha and David B. MacQueen",
+  title =        "How to add laziness to a strict language withouth even
+                 being odd",
+  booktitle =    "Proc. 1998 ACM Workshop on {ML}",
+  address =      "Baltimore",
+  year =         1998,
+  pages =        "24--30",
+}
+
+@InProceedings{BW96,
+  title =        "Linear Logic, Monads and the Lambda Calculus",
+  author = "Nick Benton and Phil Wadler",
+  OPTpages =        "420--431",
+  booktitle =    "the Symposium on Logic in Computer Science ({LICS} '96)",
+  year =         1996,
+  address =      "New Brunswick",
+  organization = "IEEE Computer Society Press",
+  references =   "\cite{JFP::AchtenP1995} \cite{IC::CroleP1992}
+                 \cite{TCS::Girard1987} \cite{LICS::LincolnM1992}
+                 \cite{IC::Moggi1991} \cite{TCS::Plotkin1975}
+                 \cite{MSCS::Wadler1992}",
+}
+
+@InSeries{Bierman:95,
+  author =       "G. M. Bierman",
+  title =        "What is a categorical model of intuitionistic linear
+                 logic?",
+  series =      LNCS,
+  volume =       "902",
+  year =         1995,
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743"
+}
+		  
+@TECHREPORT{Goguen&76,
+	AUTHOR = {Joseph A. Goguen and James Thatcher and Eric Wagner},
+	TITLE = {An Initial Algebra Approach to the Specification,
+		 Correctness and Implementation of Abstract Data Types},
+	INSTITUTION = {IBM T.~J.~Watson Research Center},
+	YEAR = 1976,
+	TYPE = {RC},
+	NUMBER = {6487},
+	NOTE = {Appears in {\em Current Trends in Programming
+		Methodology, {IV}}, Raymond Yeh, Editor, 
+		Prentice-Hall, 1978, pages {80--149}}
+}
+
+@INCOLLECTION{Goguen&79,
+	AUTHOR = {Joseph A. Goguen and J. Tardo},
+	TITLE = {An Introduction to {OBJ}:  A Language for Writing
+		   and Testing Software},
+	BOOKTITLE = {Specification of Reliable Software},
+	PUBLISHER = {{IEEE} Press},
+	YEAR = 1979,
+	PAGES = "170--189"
+}
+
+@ARTICLE{Goguen&82,
+	AUTHOR = {Joseph A. Goguen and {Jos\'e} Meseguer},
+	TITLE = {Rapid Prototyping in the {OBJ} Executable
+		 Specification Language},
+	JOURNAL = {Software Engineering Notes},
+	YEAR = 1982,
+	VOLUME = {7},
+	NUMBER = {5},
+	PAGES = "75--84",
+	NOTE = {Proceedings of Rapid Prototyping Workshop.}
+}
+
+@INCOLLECTION{Goguen&83,
+	AUTHOR = {Joseph A. Goguen and {Jos\'e} Meseguer and D. Plaisted},
+	TITLE = {Programming with Parameterized Abstract Objects in {OBJ}},
+	BOOKTITLE = {Theory and Practice of Software Technology},
+	PUBLISHER = {North-Holland},
+	YEAR = 1983,
+	EDITOR = {D. Ferrari and M Bolognani and J. Goguen},
+	PAGES = "163--193"
+}
+
+@INPROCEEDINGS{Goguen&87,
+	AUTHOR = {Joseph A. Goguen and {Jos\'e} Meseguer},
+	TITLE = {Order-Sorted Algebra Solves the Constructor-Selector,
+		 Multiple Representation and Coercion Problems},
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1987,
+	PAGES = "18--29",
+	PUBLISHER = {{IEEE} Computer Society Press},
+	ADDRESS = "Washington",
+	NOTE = {The Conf. was held at Cornell University, Ithaca,
+		New York.}
+}
+
+@TechReport{Good84,
+	Author = "Donald Good",
+	Title = "Revised Report on Gypsy 2.1 (draft)",
+	Institution = "University of Texas",
+	Year = 1984
+}
+@Misc{Good86,
+	Author = "Donald Good",
+	Title = "The Foundations of Computer Security---We Need Some",
+	Note = "{ARPANET} Computer Security Forum, 29 {September} 1986."
+}
+@Book{Gordon&79,
+	Author = "Michael J. Gordon and 
+		Robin Milner and 
+		Christopher P. Wadsworth",
+	Title = "Edinburgh LCF",
+	Publisher = "Springer-Verlag",
+	Address = "Berlin",
+	Series = LNCS,
+	Volume = 78,
+	Year = 1979
+}
+@BOOK{Gries81,
+	AUTHOR = {David Gries},
+	TITLE = {The Science of Programming},
+	PUBLISHER = {Springer-Verlag},
+	YEAR = 1981
+}
+@misc{Gries87,
+	author = "David Gries",
+	title = "What Programmers Don't and Should Know",
+	year = 1987,
+	institution = CUCS,
+	address = "Ithaca",
+	note = "Paper prepared for the Twentieth University of Newcastle upon
+		Tyne International Seminar on the Teaching of Computing Science at
+		University Level, titled Logic and its Application to Computing Science."
+}
+
+@Misc{Griffin,
+	Author = "Tim Griffin",
+	Note = "Personal Communication."
+}
+
+@TECHREPORT{Griffin87,
+	AUTHOR = {Timothy G. Griffin},
+	TITLE = {An Environment for Formal Systems},
+	INSTITUTION = CUCS,
+	YEAR = 1987,
+	NUMBER = {87-846},
+	ADDRESS = "Ithaca",
+}
+@TECHREPORT{Griffin88,
+        AUTHOR = {Griffin, Timothy G.},
+        TITLE = {A formal account of notational definition},
+        INSTITUTION = {Department of Computer Science, Cornell University},
+        YEAR = 1988,
+        NUMBER = {88-901}
+}
+
+@INPROCEEDINGS{Griffin88b,
+        AUTHOR = {Griffin, Timothy G.},
+        TITLE = {Notational definitions --- a formal account},
+        BOOKTITLE = {Proc. Third Symposium 
+                on Logic in Computer Science},
+        YEAR = 1988,
+}
+@PhDThesis{Griffin88c,
+	Author = {Griffin, Timothy George},
+	Title = "Notational Definition and Top-Down Refinement for Interactive Proof Development Systems",
+	School = "Cornell University",
+	Address = "Ithaca",
+	Year = 1988,
+	Note = "Available as Cornell University Department of 
+		Computer Science Technical Report {TR 88-937}."
+}
+
+@TechReport{Grue:87:AnEfficientFormalTheory,
+       semno =        "D-73",
+       author =       "Klaus E. Grue",
+       title =        "An Efficient Formal Theory",
+       institution =  DIKU,
+       year =         1987,
+       number =       "87/14",
+       keywords =     "proof system, reflection, metamathematics, syntax",
+     }
+@Inproceedings{Harper&87,
+	Author = "Robert Harper and Furio Honsell and Gordon Plotkin",
+	Title = "A framework for defining logics",
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1987,
+	PAGES = "194--204",
+	PUBLISHER = {{IEEE} Computer Society Press},
+	ADDRESS = "Washington",
+	NOTE = {The Conf. was held at Cornell University, Ithaca,
+		New York.}
+}
+@Inproceedings{Harper&87a,
+	Author = "Robert Harper and Robin Milner and Mads Tofte",
+	Title = "A Type Discipline for Program Modules",
+	BOOKTITLE = {{TAPSOFT '87}},
+	YEAR = 1987,
+	PAGES = "308--319",
+	PUBLISHER = {Springer-Verlag},
+}
+@Misc{Harper&89a,
+	Author = "Robert Harper and Donnald Sannella and Andrzej Tarlecki",
+	Title = "Logic Representation, Report on work in progress",
+	Year = 1989
+}
+@INPROCEEDINGS{Harper&89b,
+	AUTHOR = "Robert Harper and Donnald Sannella and Andrzej Tarlecki",
+	TITLE = "Structure and Representation in {LF}",
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1989,
+	PUBLISHER = {{IEEE} Computer Society Press},
+	ADDRESS = "Washington",
+}
+@inproceedings{Harper&90,
+	author = "Robert Harper and John C. Mitchell and Eugenio Moggi",
+	title = "Higher-Order Modules and the Phase Distinction",
+	booktitle = POPL17,
+	year = 1990,
+	pages = "341--354",
+	organization = {ACM}
+}
+@InProceedings{Hansen:89:ExperimentsWithImplementations,
+       author =       "Torben Amtoft Hansen and Thomas Nikolajsen and Jesper
+                      Larsson Tr{\"a}ff and Neil D. Jones",
+       title =        "Experiments with Implementations of two Theoretical
+                      Constructions",
+       booktitle =    "Lecture Notes in Computer Science 363",
+       year =         1989,
+       semno =        "D-19",
+       pages =        "119--133",
+       publisher =    "Springer Verlag",
+       keywords =     "S-M-N theorem, recursion theorem, 2 way pushdown
+                      automata, partial evaluation, reflection",
+     }
+@Book{Harel:87:Algorithmics,
+  author = 	 "David Harel",
+  title = 	 "Algorithmics:  The Spirit of Computing",
+  publisher = 	 "Addison-Wesley Publishing Company",
+  year = 	 1987,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+}
+
+@PhDThesis{Harper85,
+	Author = "Harper, Jr., Robert William",
+	Title = "Aspects of the Implementation of Type Theory",
+	School = "Cornell University",
+	Address = "Ithaca",
+	Year = 1985
+}
+@TECHREPORT{Hook&86,
+	AUTHOR = {James G. Hook and Douglas J. Howe},
+	TITLE = {Impredicative Strong Existential Equivalent to {Type:Type}},
+	INSTITUTION = CUCS,
+	YEAR = 1986,
+	NUMBER = {86-760},
+	ADDRESS = "Ithaca",
+}
+@techreport{Hook&89,
+       author = "James Hook and Garrel Pottinger",
+       title = "Ulysses Theories:  The modular implementation of mathematics",
+       institution = "Odyssey Research Associates",
+       number = "TR 11-14",
+       year = 1989
+}
+@Article{Hindley69,
+	Author = "J. Roger  Hindley",
+	Title = "The Principal Type-Scheme of an Object in 
+		Combinatory Logic",
+	Journal = TAMS,
+	Year = 1969,
+	Volume = 146,
+	pages = "29--60"
+}
+@misc{Hook&88,
+       author = "James Hook and Carl Eichenlaub",
+       title = "Prototype Environment for Tactics Users Manual",
+       note = "Odyssey Research Associates internal report.",
+       year = 1988
+}
+@unpublished{Hook&89b,
+        author = "James Hook and Garrel Pottinger",
+        title = "Natural {L}-systems",
+        note = "Presented to the meeting of the Association for Symbolic Logic
+		held at UCLA in January 1989.  An abstract will appear in the 
+		{\em Journal of Symbolic Logic}.",
+        year = 1989
+}
+
+@Book{Hopcroft&79,
+	Author = "John E. Hopcroft and Jeffrey D. Ullman",
+	Title = "Introduction to Automata Theory, Languages, and 
+		Computation",
+	Publisher = "Addison Wesley",
+	Year = 1979,
+	Address = "Reading"
+}
+@Book{Hindley:86,
+  author = 	 "J. Roger Hindley and Jonathan P. Seldin",
+  title = 	 "Introduction to Cobminators and $\lambda$-Calculus" ,
+  publisher = 	 "Cambridge University Press",
+  year = 	 1986,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  number = 	 1,
+  series = 	 "London Mathematical Society Student Texts",
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+}	
+
+@ARTICLE{Hoare69,
+	AUTHOR = {C. A. R. Hoare},
+	TITLE = {An Axiomatic basis for Computer Programming },
+	JOURNAL = cacm,
+	YEAR = 1969,
+	VOLUME = {12},
+	PAGES = "576--580, 583",
+}
+@Article{Hoffmann:Odonnell:82,
+  author = 	 "Christoph M. Hoffmann and Michael J. O'Donnell",
+  title = 	 "Programming with Equations",
+  journal = 	 TOPLAS,
+  year = 	 1982,
+  OPTkey = 	 {},
+  volume = 	 4,
+  number = 	 1,
+  pages = 	 "1--20",
+  note = 	 {},
+}
+@InProceedings{Holst:91:PartialEvaluation,
+  author =       "C. K. Holst and Carsten K. Gomard",
+  title =        "Partial Evaluation is Fuller Laziness",
+  booktitle =    PEPM91,
+  year =         1991,
+  pages =        "223--233",
+  publisher =    ACM,
+  note =         "",
+}
+
+@InProceedings{Hook84,
+	Author = "James G. Hook",
+	Title = "Understanding {Russell}---A First Attempt",
+	BookTitle = "Semantics of Data Types, 
+		International Symposium, Sophia-Antipolis, France",
+	Year = 1984,
+	Editor = "G. Kahn and D.B. MacQueen and G. Plotkin",
+	Publisher = "Springer-Verlag",
+	Address = "Berlin",
+	Series = LNCS,
+	Volume = 173
+}
+@PhDThesis{Hook88,
+	Author = "Hook, James Garvin",
+	Title = "Abstract Types and Dependence in Programming Languages",
+	School = "Cornell University",
+	Address = "Ithaca",
+	Year = 1988,
+}
+
+@Book{Jensen&75,
+	Author = "K. Jensen and N. Wirth",
+	Title = "Pascal User Manual and Report",
+	Publisher = "Springer-Verlag",
+	Address = "Berlin",
+	Year = 1975
+}
+@InProceedings{Knoblock&86,
+	Author = "Todd B. Knoblock and Robert L. Constable",
+	Title = "Formalized Metareasoning in Type Theory",
+	BookTitle = "Proc. Symposium on 
+			Logic in Computer Science",
+	Publisher = "IEEE Computer Society Press",
+	Address = "Washington",
+	Year = 1986,
+	pages = "237--248"
+}
+@InCollection{Howard80,
+	Author = "W. A. Howard",
+	Title = "The Formulae-as-types Notion of Construction",
+	BookTitle = "To {H.~B. Curry}:  Essays on Combinatory Logic,
+		Lambda Calculus and Formalism",
+	Editor = "J. P. Seldin and J. Roger  Hindley",
+	Publisher = "Academic Press",
+	Address = "New York",
+	Year = 1980,
+	Note = "A version of this paper was privately circulated in 
+		1969."
+}
+
+@INPROCEEDINGS{Howe87,
+	AUTHOR = {Douglas J. Howe},
+	TITLE = {The Computational Behaviour of {Girard's} Paradox},
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1987,
+	PAGES = "205--221",
+	PUBLISHER = {{IEEE} Computer Society Press},
+	ADDRESS = "Washington",
+	NOTE = {The Conf. was held at Cornell University, Ithaca,
+		New York.}
+}
+@PHDTHESIS{Howe88,
+	AUTHOR = {Douglas J. Howe},
+	TITLE = {Automating Reasoning in an Implementation of
+		 Constructive Type Theory},
+	SCHOOL = {Cornell University},
+	YEAR = 1988,
+	ADDRESS = "Ithaca",
+}
+@InProceedings{ICFP::SabryW1996,
+  title =        "A Reflection on Call-by-Value",
+  author =       "Amr Sabry and Philip Wadler",
+  pages =        "13--24",
+  booktitle =    "Proc. International
+                 Conf. on Functional Programming",
+  year =         1996,
+  address =      "Philadelphia",
+  references =   "\cite{POPL::AriolaFMOW1995} \cite{POPL::HatcliffD1994}
+                 \cite{POPL::LawallD1993} \cite{LICS::Moggi1989}
+                 \cite{IC::Moggi1991} \cite{TCS::Plotkin1975}",
+}
+@Article{Hudak:92:Report,
+         author =       "Paul Hudak Simon {Peyton Jones} and
+		         Philip Wadler
+			 and Brian
+			 Boutel and John Fairbairn and Joseph Fasel 
+			 and Maria M. Guzman and Kevin Hammond 
+		         and John Hughes and Thomas Johnsson
+ 		         and Dick Kieburtz and Rishiyur Nikhil 
+			 and Will Partain and John Peterson",
+         title =        "Report on the programming language {Haskell}",
+         journal =      "SIGPLAN Notices",
+         volume =       "27",
+         number =       "5",
+         year =         1992,
+         pages =        "Section R",
+         note =         "",
+       }
+@unpublished{Huet86,
+        author = "G\'erard Huet",
+        title = "Formal Structures for Computation and Deduction",
+        note = "Notes prepared for a graduate-level course given in the Computer 
+	        Science Department of Carnegie Mellon University during the 
+		Spring of 1986.",
+        year = 1986
+}
+
+@Article{Landwehr&84,
+	Author = "Carl E. Landwehr and Constance L. Heitmeyer and John McLean",
+	Title = "A Security Model for Military Message Systems",
+	Journal = "ACM Transactions on Computer Systems",
+	Volume = 2,
+	Number = 3,
+	Year = 1984,
+	pages = "198--222"
+}
+@Book{Liskov&81,
+	Author = "B. Liskov and R. Atkinson and T. Bloom and 
+		E. Moss and J. C. Schaffert and R. Scheifler 
+		and A. Snyder",
+	Title = "CLU Reference Manual",
+	Publisher = "Springer-Verlag",
+	Address = "Berlin",
+	Series = LNCS,
+	Volume = 114,
+	Year = 1981
+}
+@unpublished{Huet87,
+        author = "G\'erard Huet",
+        title = "A Uniform Approach to Type Theory",
+        note = "Notes distributed at the University of Texas Institute
+               on Logical Foundations of Functional Programming.",
+        year = 1987
+}
+
+
+@MISC{Huet87pc,
+	AUTHOR = { G\'erard Huet},
+	YEAR = 1987,
+	NOTE = {Personal Communication.}
+}
+@InProceedings{MacQueen&84,
+	Author = "David B. MacQueen and Gordon Plotkin and Ravi Sethi",
+	Title = "An Ideal Model of Types",
+	BookTitle = POPL11,
+	Year = 1984
+}
+@Misc{MacQueen&86,
+	Author= "David B. MacQueen and Gordon Plotkin and Ravi Sethi",
+	Note = "Forthcomming"
+}
+@PhdThesis{JamesHook,
+  author = 	 "James Garvin Hook",
+  title = 	 "Type Dependencies and Programming Languages",
+  school = 	 "Cornell University",
+  year = 	 1988,
+  OPTkey = 	 {},
+  OPTaddress = 	 {},
+  OPTtype = 	 {},
+  note = 	 "(Chapter 2)[*]",
+}	
+@InProceedings{Joerring:86:Compilers,
+       author =       "U. J{\o}rring and W. L. Scherlis",
+       title =        "Compilers and Staging Transformations",
+       booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+       address = "St. Petersburg, Florida",
+       year =         1986,
+       pages =        "86--96",
+       publisher =    ACM,
+     }	
+@inproceedings{Johnsson_lambda_lift,
+        Author = {Thomas Johnsson},
+        Title = {Lambda lifting: transforming programs to recursive equations},
+        Booktitle = {Functional Programming Languages and Computer Architecture},
+        Editor = {J-P. Jouannaud},
+        Publisher = {Springer-Verlag},
+        Series = LNCS,
+        Volume = 201,
+        Year = 1985,
+        Pages = "190--203"
+}
+@InCollection{Jones:85:AnExperiment,
+  author = 	 "Neil D. Jones and Peter Sestoft and Harald Sondergraard",
+  title = 	 "An Experiment in Partial Evaluation:  The Generation
+		  of a Compiler Generator",
+  booktitle = 	 "Rewriting Techniques and Applications",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  publisher =    "Springer-Verlag",
+  year = 	 1985,
+  editor = 	 "Jean-Pierre Jouannaud",
+  volume = 	 "202",
+  OPTnumber = 	 {},
+  series = 	 LNCS,
+  OPTchapter = 	 {},
+  OPTtype = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  pages = 	 "124--140",
+  OPTnote = 	 {},
+}
+@Book{Jones:93:Partial,
+  author = 	 "Neil D. Jones and Carsten K. Gomard and Peter Sestoft",
+  title = 	 "Partial Evaluation and Automatic Program Generation",
+  publisher = 	 "Prentice-Hall",
+  year = 	 1993,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  note = 	 "",
+}
+
+@InProceedings{Jones:95:TenYears,
+  author = 	 "Neil D. Jones",
+  title = 	 "Mix Ten Years Later",
+  booktitle = 	 "Proc. {S}ymposium on
+                 {P}artial {E}valuation and {S}emantics-{B}ased {P}rogram
+                 {M}anipulation",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1995,
+  publisher =    ACM,
+  OPTaddress = 	 {},
+  pages = 	 "24--38",
+  OPTnote = 	 {},
+}
+
+@INPROCEEDINGS{Mendler&86,
+	AUTHOR = {N. P. Mendler and P. Pananganden and R. L. Constablee},
+	TITLE = {Infinite Objects in Type Theory},
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1986,
+	PAGES = "249--255",
+	PUBLISHER = {{IEEE} Computer Society press},
+	ADDRESS = "Washington",
+	NOTE = {The Conf. was held in Cambridge, Massachusetts.}
+}
+
+@InCollection{Jones:Sheeran,
+  author = 	 "Geraint Jones and Mary Sheeran",
+  title = 	 "Designing arithmetic circuits by refinement in Ruby",
+  booktitle = 	 "Mathematics of Program Construction",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  publisher =    "Springer Verlag",
+  year = 	 1993,
+  editor = 	 "R. S. Bird, C. C. Morgan and J. C. P. Woodcock",
+  volume = 	 "669",
+  OPTnumber = 	 {},
+  series = 	 LNCS,
+  OPTchapter = 	 {},
+  OPTtype = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+}
+
+@Article{Kamin:83,
+  author = 	 "Samuel Kamin",
+  title = 	 "Final Data Types and Their Specification",
+  journal = 	 TOPLAS,
+  year = 	 1983,
+  OPTkey = 	 {},
+  volume = 	 5,
+  number = 	 1,
+  pages = 	 "97--123",
+  note = 	 {},
+}
+
+@INPROCEEDINGS{Meyer&87,
+	AUTHOR = {Albert R. Meyer and John C. Mitchell and Eugenio
+		  Moggi and Richard Statman},
+	TITLE = {Empty Types in Polymorphic Lambda Calculus
+		 (Preliminary Report)}, 
+	BOOKTITLE = POPL14,
+	YEAR = 1987,
+	PAGES = "253--262",
+	ORGANIZATION = {ACM},
+	NOTE = {The Conf. was held in Munich, West Germany}
+}
+
+@InProceedings{Meyer&86,
+	Author = "Albert R. Meyer and Mark B. Reinhold",
+	Title = "`Type' Is Not a Type",
+	BookTitle = POPL13,
+	Year = 1986,
+	Organization = "Association for Computing Machinery, SIGACT, SIGPLAN"
+}
+
+@TechReport{Keppel:91:ACase,
+  author = 	 "David Keppel and Susan J. Eggers and Robert R. Henry",
+  title = 	 "A Case for Runtime Code Generation",
+  institution =  "University of Washington",
+  year = 	 1991,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "91-11-04",
+  OPTaddress = 	 {},
+  OPTnote = 	 {},
+}
+@InProceedings{Mitchell&M85,
+	Author = "John C. Mitchell and Albert R. Meyer",
+	Title = "Second-order logical relations (extended abstract)",
+	BookTitle = "Logics of Programs, Brooklyn",
+	Year = 1985,
+	Editor = "Rohit Parikh",
+	Publisher = "Springer-Verlag",
+	Address = "Berlin",
+	Series = LNCS,
+	Volume = 193
+}
+@InProceedings{Mitchell&85,
+	Author = "John C. Mitchell and Gordon Plotkin",
+	Title = "Abstract types have existential type",
+	BookTitle = POPL12,
+	Year = 1985,
+	Organization = "Association for Computing Machinery, SIGACT, SIGPLAN"
+}
+@Misc{Mitchell&pc86,
+	Author = "John C. Mitchell and Robert W. Harper",
+	Note = "Personal communication"
+}
+@InProceedings{Mitchell&88,
+	Author = "John C. Mitchell and Robert Harper",
+	Title = "The Essence of {ML}",
+	BookTitle = POPL15,
+	Year = 1988,
+	Pages = "28--46",
+	Organization = "Association for Computing Machinery, SIGACT, SIGPLAN"
+}
+
+
+@Misc{Kiczales:96:Open,
+  OPTkey = 	 {},
+  author = 	 "Gregor Kiczales and Andreas Paepcke",
+  title = 	 "Open Implementations and Metaobject Protocols",
+  OPThowpublished = {},
+  year = 	 1996,
+  note = 	 "Available at \cite{Kiczales:Page}",
+}
+@Misc{Kiczales:Page,
+  OPTkey = 	 {},
+  OPTauthor = 	 {},
+  title = 	 "Gregor {K}iczales' Home Page",
+  OPThowpublished = {},
+  OPTyear = 	 {},
+  note = 	 "\mc{http://www.parc.xerox.com/spl/members/gregor/}",
+}
+
+@techreport {Kieburtz93,
+	Author = "Richard Kieburtz",
+	Title = "Software Design for Reliability and Reuse---Preliminary Method Definition",
+	Institution = ogicse,
+	Number = "CSE-93-021",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1993
+}
+
+@unpublished {Kieburtz94,
+	Author = "Richard Kieburtz",
+	Title = "Generating Programs from Specifications",
+	Note = "",
+	Year = 1994
+}
+@book{milner&90,
+	author = "Robin Milner and Mads Tofte and Robert Harper",
+	title = "The Definition of Standard {ML}",
+	publisher = "{MIT} Press",
+	address = "Cambridge",
+	year = 1990
+}
+@misc{Kieburtz95,
+	author = "Richard B. Kieburtz",
+	title = "Software Design for Reliability and Reuse---{Method} Definition",
+	year = 1995,
+	note = "In \cite{Pacsoft95}"
+}
+@InProceedings{Moriconi&85,
+	Author = "Mark Moriconi and Dwight F. Hare",
+	Title = "The {PegaSys} System:  Using Pictures as Formal 
+		Documentation",
+	BookTitle = "Proceedings of Symposium on 
+		Language Issues in Programming Environments", 
+	Year = 1985,
+	Organization = "Association for Computing Machinery, SIGPLAN",
+	Address = "Seattle",
+	pages = "148--160"
+}
+@Article{Moriconi&85b,
+	Author = "Mark Moriconi and Dwight F. Hare",
+	Title = "Visualizing Program Designs Through {PegaSys}",
+	Journal = "IEEE Computer",
+	Volume = 18,
+	Number = 8,
+	Pages = "72--85",
+	Year = 1985
+}
+@misc{Kieburtz95b,
+	author = "Richard B. Kieburtz",
+	title = "Results of the SDRR Validation Experiment",
+	year = 1995,
+	note = "In \cite{Pacsoft95}"
+}
+@Article{Kieburtz:Silberschatz:83,
+  author = 	 "Richard B. Kieburtz and Abraham Silberschatz",
+  title = 	 "Access-Right Expressions",
+  journal = 	 TOPLAS,
+  year = 	 1983,
+  OPTkey = 	 {},
+  volume = 	 5,
+  number = 	 1,
+  pages = 	 "78--96",
+  note = 	 {},
+}
+@PHDTHESIS{Knoblock87,
+	AUTHOR = {Todd B. Knoblock},
+	TITLE = {Mathematical Extensibility in Type Theory, Correct
+		 Programs that Construct Proofs},
+	SCHOOL = {Cornell University},
+	YEAR = 1988,
+	ADDRESS = "Ithaca",
+}
+
+@INPROCEEDINGS{Korelski88,
+	AUTHOR = {Tanya Korelsky and others},
+	TITLE = {Ulysses: a computer-security modeling environment},
+	BOOKTITLE = {Proc. 11th National Computer Security Conf. },
+	YEAR = 1988,
+}
+@techreport {Kotov94,
+	Author = "Alexei Kotov",
+	Title = "Application of a New Software Metric in a Research Environment",
+	Institution = ogicse,
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1994
+}
+@misc{Kotov95,
+	author = "Alexei Kotov",
+	title = "Measurement Final Report",
+	year = 1995,
+	note = "In \cite{Pacsoft95}"
+}
+@TECHREPORT{Kreitz86,
+	AUTHOR = {Christoph Kreitz},
+	TITLE = {Constructive Automata Theory Implemented with the
+		 Nuprl Proof Development System},
+	INSTITUTION = cucs,
+	YEAR = 1986,
+	NUMBER = {86-779},
+	ADDRESS = "Ithaca",
+}
+@Article{Laeufer:Odersky,
+  author = 	 "Konstantin Laeufer and Martin Odersky",
+  title = 	 "Polymorphic Type Inference and Abstract",
+  journal = 	 "ACM Transaction of Programming Languages and Systems",
+}
+@TechReport{Platek&87,
+	Author = "Richard Platek and James Hook and 
+		  Tanya Korelsky and Daryl McCullough",
+	Title = "Ulysses:  A Computer Security Modelling Environment",
+	Institution = ORA,
+	Year = 1987,
+	Note = "Submitted to 1987 NBS Computer Security Conf.."
+}
+@ARTICLE{Lamport78,
+	AUTHOR = {Leslie Lamport},
+	TITLE = {Time, clocks and the ordering of events in a distributed system},
+	JOURNAL = cacm,
+	YEAR = 1978,
+	VOLUME = {21},
+	NUMBER = {7}
+}
+
+@ARTICLE{Landin66,
+	AUTHOR = {P. J. Landin},
+	TITLE = {The next 700 programming languages},
+	JOURNAL = cacm,
+	YEAR = 1966,
+	VOLUME = {9},
+	NUMBER = {3}
+}
+@misc{Launchbury95,
+	author = "John Launchbury",
+	title = "Phase II Technology Transition Plan",
+	year = 1995,
+	note = "In \cite{Pacsoft95}"
+}
+@PhdThesis{Launchbury:90:Thesis,
+  author = 	 "John Launchbury",
+  title = 	 "Projection Factorisations in Partial Evaluation",
+  school = 	 "University of Glasgow",
+  year = 	 1990,
+  OPTkey = 	 {},
+  address = 	 "Glasgow",
+  OPTtype = 	 {},
+  OPTnote = 	 "(Also published in Distinguished Disertations series)",
+}
+@misc{Pottinger&88,
+	author = "Garrel Pottinger and James Hook and Carl Eichenlaub and Carl Klapper",
+	title = "Ulysses: Theories",
+	year = 1988,
+	note = "Odyssey Research Associates internal report."
+}
+@InProceedings{Launchbury:95:WarmFusion,
+  author = 	 "John Launchbury and Tim Sheard",
+  title = 	 "Warm Fusion: Deriving Build-Catas from Recursive
+		  Definitions",
+  booktitle = 	 "Functional Programming Languages and Computer Architecture",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1995,
+  OPTorganization = {},
+  publisher =    ACM,
+  OPTaddress = 	 {},
+  pages = 	 "314--323",
+  OPTnote = 	 {},
+} 
+@Article{Lescanne:92,
+  author = 	 "Pierre Lescanne",
+  title = 	 "Well rewrite orderings and well quasi-orderings",
+  journal = 	 JSC,
+  year = 	 1992,
+  OPTkey = 	 {},
+  volume = 	 14,
+  number = 	 5,
+  pages = 	 "419--435",
+  note = 	 {},
+}
+@Article{Levy:86:AMeta,
+  author = 	 "Leon S. Levy",
+  title = 	 "A Meta-programming Method and Its Economic Justification",
+  journal = 	 TSE,
+  year = 	 1986,
+  OPTkey = 	 {},
+  volume = 	 12,
+  number = 	 2,
+  pages = 	 "272--277",
+  OPTnote = 	 {},
+}
+@techreport {Lewis94,
+	Author = "Jeffrey R. Lewis",
+	Title = "A Specification for an {MTV} Generator",
+	Institution = ogicse,
+	Number = "CSE-94-003",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1994
+}
+@unpublished{Lewis95a,
+	Author = "Jeffrey R. Lewis",
+	Title = "The {P}acSoft {SML} Library",
+	Year = 1995,
+	note = intooldocs
+}	
+@InProceedings{Reps&84,
+	Author = "Thomas Reps and Tim Teitelbaum",
+	Title = "The Synthesizer Generator",
+	BookTitle = "Proc.   
+		Software Engineering Symposium on Practical 
+		Software Development Environments",
+	Year = 1984,
+	Organization = "Association for Computing Machinery, SIGPLAN",
+	Address = "Baltimore",
+	pages = "42--48"
+}
+
+@misc{Lewis95b,
+	author = "Jeffrey R. Lewis",
+	title = "{ADL} Translator Tool Documentation",
+	year = 1995,
+	note = intooldocs
+}
+
+@InProceedings{Amphion,
+  author = 	 "Michael Lowry and Andrew Philpot and Thomas Pressburger and Ian Underwood",
+  title = 	 "Amphion:  Automatic Programming for Scientific 
+                  Subroutine Libraries",
+  booktitle = 	 "Proc. 8th Intl. Symp. on Methodologies for 
+                  Intelligent Systems",
+  year = 	 1994,
+  address = 	 "Charlotte",
+  pages = 	 "326--335",
+}
+
+@Article{Lowry:94:Amphion,
+  author = 	 "", 
+  title = 	 "{AMPHION}:  Automatic Programming for Scientific Subroutine Libraries",
+  journal = 	 "{NASA} Science Information Systems Newsletter",
+  year = 	 1994,
+  OPTkey = 	 {},
+  volume = 	 31,
+  OPTnumber = 	 {},
+  pages = 	 "22--25",
+  OPTnote = 	 "Available at \cite{Amphion:Page}",
+}
+
+@Book{MacLennan87,
+  author = 	 "Bruce J. MacLennan",
+  title = 	 "Principles of Programming Languages:  Design,
+		  Evaluation, and Implementation",
+  publisher = 	 "Holt, Rinehart and Winston",
+  year = 	 1987,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  edition = 	 "Second",
+  OPTnote = 	 {},
+}
+@inproceedings{Sannella&83,
+	author = "D. T. Sannella and R. M. Burstall",
+	title = "Structured theories in {LCF}",
+	booktitle = "Proc. 8th Colloquium on Algebra and
+			Trees in Programming",
+	pages = "377--391",
+	address = "L'Aquila",
+	year = 1983
+}
+@inproceedings{Sannella&83,
+	author = "D. T. Sannella and R. M. Burstall",
+	title = "Structured theories in {LCF}",
+	booktitle = "Proc. 8th Colloquium on Algebra and
+			Trees in Programming",
+	pages = "377--391",
+	address = "L'Aquila",
+	year = 1983
+}
+@inproceedings{Sannella&85,
+	author = "Donald Sannella and Andrzej Tarlecki",
+	Title = "Program specification and development in standard {ML}",
+	Booktitle = POPL12,
+	pages = "67--77",
+	year = 1985,
+	organization = {ACM},
+}
+@inproceedings{Sannella&86,
+	author = "Donald Sannella and Andrzej Tarlecki",
+	Title = "Extended {ML}:  an institution-indepdendent framework for formal program development",
+	Booktitle = "Category Theory and Computer Programming Tutorial and Workshop",
+	pages = "364--389",
+	year = 1986,
+	Editor = "David Pitt and Samson Abramsky and Axel Poign\'e and David Rydeheard",
+	Publisher = "Springer-Verlag",
+	Address = "Berlin",
+	Series = LNCS,
+	Volume = 240,
+	Note = "Meeting was held in September 1985 in Guildford, UK."
+}
+@InProceedings{MacQueen86,
+	Author = "David B. MacQueen",
+	Title = "Using Dependent Types to Express Modular Structure",
+	BookTitle = POPL13,
+	Year = 1986,
+	Pages = "277--286"
+}
+@InProceedings{Maeda92,
+       author =       "Munenori Maeda",
+       title =        "Implementing a Process Oriented Debugger with
+                      Reflection and Program Transformation",
+       pages =        "961--968",
+       crossref =     "FGCS92",
+     }
+
+
+@TechReport{Maes87,
+       author =       "Pattie Maes",
+       title =        "Computational Reflection",
+       institution =  "Vrije Universiteit Br{\"u}ssel",
+       address =      "Br{\"u}ssel",
+       number =       "87-2",
+       keywords =     "Meta-Knowledge, Object-Oriented Language, Programming
+                      Language, Reflection, Refletive Architecture,
+                      Self-Reference",
+       year =         1987,
+     }
+
+@InProceedings{Maes87b,
+       author =       "Patti Maes",
+       title =        "Concepts and Experiments in Computational Reflection",
+       booktitle =    "OOPSLA-87Proceedings",
+       address =      "Florida",
+       keywords =     "LISP",
+       year =         1987,
+     }
+
+@InProceedings{Malmkjaer:90:OnSomeSemanticIssues,
+       semno =        "D-63",
+       author =       "Karoline Malmkj{\ae}r",
+       title =        "On Some Semantic Issues in the Reflective Tower",
+       booktitle =    "Mathematical Foundations of Programming Semantics.
+                      (Lecture Notes in Computer Science, vol. 442)",
+       year =         1989,
+       editor =       "M. Main and A. Melton and M. Mislove and D. Schmidt",
+       pages =        "229--246",
+       keywords =     "reflection, semantics, reification",
+     }
+@InProceedings{Malmkjaer:93:TowardsEfficient,
+  author =       "K. Malmkj{\ae}r",
+  title =        "Towards Efficient Partial Evaluation",
+  booktitle =    PEPM93,
+  year =         1993,
+  pages =        "33--43",
+  publisher =    ACM,
+  note =         "",
+}
+@InProceedings{Malmkjaer:95:Polyvariant,
+  author = 	 "Karoline Malmkjaer and Peter Orbaek",
+  title = 	 "Polyvariant Specialisation for Higher-Order,
+		  Block-Structured Languages",
+  booktitle = 	 "Proc. {S}ymposium on
+                 {P}artial {E}valuation and {S}emantics-{b}ased {P}rogram
+                 {M}anipulation",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1994,
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTaddress = 	 {},
+  pages = 	 "66--76",
+  OPTnote = 	 {},
+}
+@Unpublished{Martin-Lof71,
+	Author = "Per {Martin-L\"of}",
+	Title = "A Theory of Types",
+	Note = "Mimeographed manuscript.",
+	Year = 1971
+}
+@Unpublished{Martin-Lof72,
+	Author = "Per {Martin-L\"of}",
+	Title = "An Intuitionistic Theory of Types",
+	Note = "Mimeographed manuscript. This is an unpublished
+		version of {\cite{Martin-Lof75}}.  It contains a
+		presentation of Girard's paradox that does not
+		appear in the final version.",
+	Year = 1972
+}
+@InCollection{Martin-Lof75,
+	Author = "Per {Martin-L\"of}",
+	title = "An Intuitionistic Theory of Types: Predicative Part",
+	BookTitle = "Logic Colloquium '73",
+	Editor = "H. E. Rose and J. C. Shepherdson",
+	Pages = "73--118",
+	Publisher = "North Holland",
+	year = 1975
+}
+@InProceedings{Martin-Lof82,
+	Author = "Per {Martin-L\"of}",
+	title = "Constructive Mathematics and Computer Programming",
+	BookTitle = "Sixth International Congress for Logic, Methodology,
+		and Philosophy of Science",
+	Pages = "153--175",
+	Publisher = "North Holland",
+	year = 1982
+}
+@BOOK{Whitehead&25,
+	AUTHOR = {Alfred North Whitehead and Bertrand Russell },
+	TITLE = {Principia mathematica},
+	PUBLISHER = {Cambridge University Press},
+	YEAR = 1925,
+	VOLUME = {1},
+	ADDRESS = "Cambridge",
+	EDITION = "Second"
+}
+
+@PHDTHESIS{Matthews83,
+	AUTHOR = {David Charles James Matthews},
+	TITLE = {Programming Language Design with Polymorphism},
+	SCHOOL = {University of Cambridge},
+	YEAR = 1983,
+	NOTE = "This dissertation is availiable as technical report
+		number 49 from the University of Cambridge computer
+		laboratory, Corn Exchange Street, Cambridge CB2 3QG,
+		UK."
+}
+
+@TECHREPORT{Matthews85,
+	AUTHOR = {David C. J. Matthews},
+	TITLE = {{POLY} Manual},
+	INSTITUTION = {University of Cambridge Computer Laboratory},
+	YEAR = 1985,
+	NUMBER = {63},
+	ADDRESS = "Cambridge",
+}
+
+@InProceedings{Mauny:92:ParsersInML,
+  author =       "Michel Mauny and Daniel de Rauglaudre",
+  title =        "",
+  booktitle =    LFP,
+  publisher =    ACM,
+  year =         1992,
+  pages =        "76--85",
+  note =         "",
+}
+
+@Article{Freese:Jezek:Nation:93,
+  author = 	 "Ralph Freese, J. Jezek and J. B. Nation",
+  title = 	 "Term Rewrite Systems for Lattice Theory",
+  journal = 	 JSC,
+  year = 	 1993,
+  OPTkey = 	 {},
+  volume = 	 16,
+  number = 	 3,
+  pages = 	 "279--288",
+  note = 	 {},
+}
+
+		  
+@PHDTHESIS{McCracken79,
+	AUTHOR = {Nancy Jean McCracken},
+	TITLE = {An investigation of a programming language with a
+		 polymorphic type structure},
+	SCHOOL = {Syracuse University},
+	YEAR = 1979
+}
+
+@Article{McGraw:82,
+  author = 	 "James R. McGraw",
+  title = 	 "The VAL Language:  Description and Analysis",
+  journal = 	 TOPLAS,
+  year = 	 1982,
+  OPTkey = 	 {},
+  volume = 	 4,
+  number = 	 1,
+  pages = 	 "1--20",
+  note = 	 {},
+}
+
+@misc{McKinney95,
+	author = "Laura McKinney",
+	title = "Tool Survey",
+	year = 1995,
+	note = "In \cite{Pacsoft95}"
+}
+
+@Misc{Church:35:Unsolvable,
+  OPTkey = 	 {},
+  author = 	 "Alonzo Church",
+  title = 	 "An Unsolvable Problem of Elementry Number Theory",
+  howpublished = "Presented to the American Mathematical Society,
+		  April 9, 1935",
+  year = 	 1935,
+  note = 	 "Available in \cite{Davis:65:Undecidable}",
+  OPTannote = 	 {}
+}
+
+@INPROCEEDINGS{Mendler87,
+	AUTHOR = {N. P. Mendler},
+	TITLE = {Recursive Types and Type Constraints in Second-Order
+		 Lambda Calculus},
+	BOOKTITLE = {Proceedings Symposium on Logic in Computer Science},
+	YEAR = 1987,
+	PAGES = "30--36",
+	PUBLISHER = {{IEEE} Computer Society Press},
+	ADDRESS = "Washington",
+	NOTE = {The Conf. was held at Cornell University, Ithaca,
+		New York.}
+}
+
+@PHDTHESIS{Mendler88,
+	AUTHOR = {Paul Francis Mendler},
+	TITLE = {Inductive Definition in Type Theory},
+	SCHOOL = {Cornell University},
+	YEAR = 1988,
+	ADDRESS = "Ithaca",
+	NOTE = {This thesis is available as Cornell University
+		computer science department technical report number
+		87-870 (September 1987).  Paul Francis Mendler prefers
+		the name ``Nax'' and generally uses the initials ``N. P.''}
+}
+
+
+@Article{Mitchell&88,
+	Author = "John C. Mitchell and Gordon Plotkin",
+	Title = "Abstract Types Have Existential Type",
+	Journal = toplas,
+	Year = 1988,
+	volume = 10,
+	number = 3,
+	pages = "470--502",
+        contribution = "
+		  
+		  The observation that data abstract types (or, more
+		  precisely, their ``data algebras'')  have existential
+		  types. \\
+		  
+		  "
+}		  
+		  
+@Article{Metayer:88,
+  author = 	 "Daniel Le Metayer",
+  title = 	 "ACE:  An Automatic Complexity Evaluator",
+  journal = 	 TOPLAS,
+  year = 	 1988,
+  OPTkey = 	 {},
+  volume = 	 10,
+  number = 	 2,
+  pages = 	 "248--266",
+  note = 	 {},
+}
+@Article{Middeldorp:Toyama:93,
+  author = 	 "Aart Middeldorp and Yoshihito Toyama",
+  title = 	 "Completeness of Combinations of Constructor Systems",
+  journal = 	 JSC,
+  year = 	 1993,
+  OPTkey = 	 {},
+  volume = 	 15,
+  number = 	 3,
+  pages = 	 "331--348",
+  note = 	 {},
+}
+
+@TECHREPORT{Milner72a,
+	AUTHOR = {Robin Milner},
+	TITLE = {Logic for Computable Functions:  description of a
+		 machine implementation},
+	INSTITUTION = {Stanford University},
+	YEAR = 1972,
+	TYPE = {Memo},
+	NUMBER = {AIM-169}
+}
+@INPROCEEDINGS{Milner72b,
+	AUTHOR = {Robin Milner},
+	TITLE = {Implementation and application of {Scott's} logic for
+		 computable functions},
+	BOOKTITLE = {Proceedings {ACM} Conf. on Proving
+		     Assertions about Programs},
+	YEAR = 1972,
+	ORGANIZATION = {SIGPLAN},
+	PUBLISHER = {ACM},
+	NOTE = {SIGPLAN notices 7,1}
+}
+@Article{Milner78,
+	Author = "Robin Milner",
+	Title = "A Theory of Type Polymorphism in Programming",
+	Journal = jcss,
+	Volume = 17,
+	Pages = "348--375",
+	Year = 1978
+}
+@TechReport{Milner84,
+	Author ="Robin Milner",
+	Title = "{S}tandard {ML} Report",
+	Institution = "University of Edinburgh, Department of Computer Science",
+	Year = 1984
+}
+
+@Book{Milner:90:TheDefinition,
+  author = 	 "Robin Milner and Mads Tofte and Robert Harper",
+  title = 	 "The Definition of {Standard ML}",
+  publisher = 	 "MIT Press",
+  year = 	 1990,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+}
+@Article{Mitchell-ATHET,
+  author = 	 {John C. Mitchell and Gordon D. Plotkin},
+  title = 	 {Abstract Types Have Existential Type},
+  journal = 	 {TOPLAS},
+  year = 	 1988,
+  volume =	 {10(3)},
+  pages =	 "470--502",
+}
+
+@InProceedings{Mitchell86,
+	Author = "John C. Mitchell",
+	Title = "Representation Independence",
+	BookTitle = POPL13,
+	Year = 1986,
+	Organization = "Association for Computing Machinery, SIGACT, SIGPLAN",
+}
+@Article{Mitchell:88,
+        Author = "John C. Mitchell and Gordon D. Plotkin",
+        Title = "Abstract Types Have Existential Type",
+        Journal = toplas,
+        Year = 1988,
+        volume = 10,
+        number = 3,
+        pages = "470--502"
+}
+@InProceedings{Mogensen:89:BindingTimeAnalysis,
+  author =       "T. Mogensen",
+  title =        "Binding Time Analysis for Polymorphically Typed Higher
+                 Order Languages",
+  booktitle =    "TAPSOFT '89. Proc. International Conf. Theory and Practice of
+                 Software Development, Barcelona, Spain, March 1989
+                 (Lecture Notes in Computer Science, vol. 352)",
+  editor =       "J. Diaz and F. Orejas",
+  publisher =    S-V,
+  pages =        "298--312",
+  year =         1989,
+  note =         "",
+}
+@Unpublished{Moriconi85,
+	Author = "Mark Moriconi",
+	Title = "Formal Documentation and Analysis of Dependencies in 
+		Large Programs",
+	Note = "Submitted for publication.",
+	Year = 1985
+}
+@Article{Nielson:85,
+  author = 	 "Flemming Nielson",
+  title = 	 "Program Transformations in a Denotational Setting",
+  journal = 	 TOPLAS,
+  year = 	 1985,
+  OPTkey = 	 {},
+  volume = 	 7,
+  number = 	 3,
+  pages = 	 "359--379",
+  note = 	 {},
+}
+
+@TechReport{ORAAda,
+	Author = "Staff",
+	Title = "Formal Verification of {Ada} Programs for Mission Critical
+		{SDI} Software",
+	Institution = ORA,
+	Year = 1986,
+	Number = "ORA PR 8502-1",
+	Note = "Revised version"
+}
+@Unpublished{Odersky:Laeufer,
+  author = 	 "Martin Odersky and Konstantin Laeufer",
+  title = 	 "Putting Type Annotations To Work",
+  note = 	 "(Preliminary)",
+  OPTkey = 	 {},
+  OPTyear = 	 {},
+}
+@misc{Oliva95a,
+	author = "Dino P. Oliva",
+	title = "Program Instantiator Tool Documentation",
+	year = 1995,
+	note = intooldocs
+}
+@misc{Oliva95b,
+	author = "Dino P. Oliva",
+	title = "Program Instantiator Templates Documentation",
+	year = 1995,
+	note = intooldocs
+}
+@misc{Oliva95c,
+	author = "Dino P. Oliva",
+	title = "Baseline Performance Measurements for Unoptimized Generated Code",
+	year = 1995,
+	note = "In \cite{Pacsoft95}"
+}
+@Article{Oliva:96:Generating,
+  author = 	 "D.P. Oliva  and A.P. Tolmach",
+  title = 	 "Generating Typed Imperative Language Components from
+		  Functional Code",
+  year = 	 1196,
+  OPTkey = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+}
+@TechReport{PWMNIPKRHCmar92,
+       author =       "Peter W. Madany and Nayeem Islam and Panos Kougiouris
+                      and Roy H. Campbell",
+       title =        "Reification and Reflection in {C}++: an operating
+                      systems perspective",
+       institution =  "University of Illinois",
+       address =      "Department of Computer Science, Urbana-Champaign, 
+                       IL, USA",
+       number =       "{UIUCDCS--R--92--1736}",
+       year =         1992,
+       abstract =     "The paper discusses using reification (the
+                      representation of an attribute of an object-oriented
+                      program such as method dispatch, inheritance, or object
+                      structure within the program) and reflection (the
+                      ability to make attributes like method invocation,
+                      interface, inheritance, object implementation the
+                      subject of computation) in Choices. Reification is
+                      used, for example, to modify the behaviour of pointers
+                      so reference-counting can be done safely. The system
+                      includes inheritance and classes as run-time entities,
+                      allowing dynamic extension of the system functions.",
+       keyword =      "Choices, garbage collection, object-oriented
+                      programming, inheritance, class structure, run-time
+                      extension",
+     }
+@misc{PacSoft93a,
+	Author = "Pacific Software Research Center",
+	Title = "Measurement Plan for the {OGI} {SDRR} Technology Development 
+	and Validation Program",
+	Year = 1993
+}
+
+@misc{PacSoft93b,
+	Author = "Pacific Software Research Center",
+	Title = "Management Plan for the {OGI} {SDRR} Technology Development 
+	and Validation Program",
+	Year = 1993
+}
+@misc{PacSoft93c,
+	Author = "Pacific Software Research Center",
+	Title = "Technical Plan for the {OGI} {SDRR} Technology Development 
+	and Validation Program",
+	Year = 1993
+}
+@misc{PacSoft93d,
+	Author = "Pacific Software Research Center",
+	Title = "Technology Transition Plan for the {OGI} {SDRR} Technology Development 
+	and Validation Program",
+	Year = 1993
+}
+@misc{PacSoft94,
+	Author = "Pacific Software Research Center",
+	Title = "Software Design for Reliability and Reuse---Phase II Project Proposal",
+	Year = 1994
+}
+
+		  
+@Misc{CardelliPhase,
+  author =       "L. Cardelli",
+  title =        "Phase Distinctions in Type Theory",
+  howpublished = "(Unpublished manuscript.)  Available online
+                  from \fr{http://www.luca.demon.co.uk/Bibliography.html}",
+  year =         1988,
+}
+
+@misc{PacSoft95,
+	Author = "Pacific Software Research Center",
+	Title = "{SDRR} Project {Phase I} Final Scientific and Technical Report",
+	Year = 1995
+}
+
+
+@Article{ParlamentoP:JAR91,
+       author =       "Franco Parlamento and Alberto Policriti",
+       title =        "Decision Procedures for Elementary Sublanguages of Set
+                      Theory:{XIII. M}odel Graphs, Reflection and
+                      Decidability",
+       journal =      JAR,
+       volume =       "7",
+       number =       "2",
+       year =         1991,
+       pages =        "271--284",
+     }
+
+
+@INPROCEEDINGS{Paulin-Mohring89,
+	AUTHOR = {Christine Paulin-Mohring},
+	TITLE = {Extracting {$F_\omega$}'s Programs from Proofs
+		in the Calculus of Constructions},
+	BOOKTITLE = POPL16,
+	YEAR = 1989,
+	PAGES = "89--104",
+	ORGANIZATION = {ACM},
+}
+
+@Article{Paulson86,
+	Author = "Lawrence C. Paulson",
+	Title = "Natural Deduction as Higer-order Resolution",
+	Journal = "The Journal of Logic Programming",
+	Volume = 3,
+	Pages = "237--258",
+	Year = 1986
+}
+		  
+@Article{Paulson89,
+	Author = "Lawrence C. Paulson",
+	Title = "The foundation of a generic theorem prover",
+	Journal = "The Journal of Automated Reasoning",
+	Volume = 5,
+	Pages = "363--397",
+	Year = 1989
+}
+
+		  
+		  
+		  
+		  
+		  
+@TechReport{PegaSys,
+	Author = "Mark Moriconi and Dwight F. Hare",
+	Title = "The {PegaSys} System: Three Papers",
+	Institution = SRICSL,
+	Year = 1985,
+	Number = 145,
+	Address = "Menlo Park",
+	Note = "This is a collection of three papers:  revised versions of 
+		{\cite{Moriconi&85}} and {\cite{Moriconi&85b}} and a complete
+		version of {\cite{Moriconi85}}."
+}
+
+@Unpublished{PfenningLee89,
+       author =       "Pfenning Frank and Peter Lee",
+       title =        "Reflection in the polymorphic lambda-calculus",
+       note =         "manuscript",
+       year =         1989,
+     }
+
+
+		  
+		  This is basically the bibliography I prepared for the rpe paper.
+		  
+		  
+@InCollection{Phillips:92:Recursion,
+  author = 	 "I. C. C. Phillips",
+  title = 	 "Recursion Theory",
+  booktitle = 	 "Handbook of Logic in Computer Science",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  publisher =    "Oxford University Press",
+  year = 	 1992,
+  editor = 	 "S. Abramsky and Dov M. Gabbay and T. S. E. Maibaum",
+  volume = 	 1,
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTchapter = 	 {},
+  OPTtype = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  pages = 	 "83, 133--135",
+  OPTnote = 	 {},
+}
+@techreport{Plinta89,
+    	    Author = "Plinta, Charles and Lee, Kenneth and Rissman, Michael",
+    	    Title = "A Model Solution for {C$^{3}$I} Message Translation and
+Validation", 
+    	    Institution= "Software Engineering Institute, Carnegie Mellon
+University", 
+    	    Year = 1989,
+    	    Note= "CMU/SEI-89-TR-12 ESD-89-TR-20"
+}
+
+@Misc{Plotkin-personal,
+	Author ="Plotkin, Gordon D.",
+	Note = "Personal Communication"
+}
+
+
+@Unpublished{Plotkin78,
+	Author ="Gordon D. Plotkin",
+	Title = "Domain Theory",
+	Note = "Pisa Sumer school lecture notes", 
+	Year = 1978
+}
+
+@TechReport{Plotkin81,
+	Author ="Gordon D. Plotkin",
+	Title = "A Structural Approach to Operational Semantics",
+	Institution = "Computer Science Department, Aarhus University",
+	Year = 1981
+}
+
+@TechReport{Plotkin82,
+	Author ="Gordon D. Plotkin",
+	Title = "An Operational Semantics for {CSP}",
+	Institution = "University of Edinburgh, Department of Computer Science",
+	Year = 1982
+}
+@techreport{Bell&94a,
+	Author = "Jeffrey M. Bell and James  Hook",
+	Title = "Defunctionalization of Typed Programs",
+	year = 1994,
+	institution = ogicse,
+	number = "CSE-94-025"
+}
+@inproceedings{Bell&94b,
+	author = "Jeffrey Bell and others",
+	title = "Software Design for Reliability and Reuse: 
+		A proof-of-concept demonstration",
+	booktitle = "{TRI-Ada} '94 Proceedings",
+	Publisher = ACM,
+	year = 1994,
+	pages = "396--404"
+}
+@techreport{Pottinger87,
+       author = "Garrel Pottinger",
+       title = "Strong Normalization for Terms of the Theory of
+                Constructions",
+       institution = "Odyssey Research Associates",
+       number = "TR 11-7",
+       year = 1987
+}
+@techreport{Pottinger88a,
+       author = "Garrel Pottinger",
+       title = "Ulysses:  Logical Foundations of the Definition Facility",
+       institution = "Odyssey Research Associates",
+       number = "TR 11-9",
+       year = 1988
+}
+@techreport{Pottinger88b,
+       author = "Garrel Pottinger",
+       title = "Ulysses:  Logical and Computational Foundations of the
+               Primitive Inference Engine",
+       institution = "Odyssey Research Associates",
+       number = "TR 11-8",
+       year = 1988
+}
+@misc{Pottinger88c,
+	author = "Garrel Pottinger",
+	title = "Meta-{TOC}",
+	year = 1988,
+	note = "Odyssey Research Associates internal report, in preparation."
+}
+@book{Prawitz65,
+       author = "Dag Prawitz",
+       title = "Natural Deduction",
+       publisher = "Almqvist $\&$ Wiksell",
+       address = "Stockholm, {G\"{o}teborg}, and Uppsala",
+       year = 1965
+}
+@inproceedings{Bellegarde&93,
+	author = "Fran\c{c}oise Bellegarde and James Hook",
+	title = "Monads, Indexes, and Transformations",
+	date = Apr,
+	year = 1993,
+	Booktitle = "{TAPSOFT} '93:  Theory and Practice of Software
+		Development", 
+	publisher = "Springer-Verlag",
+	series = LNCS,
+	volume = 668,
+	pages = "314--327"
+}
+@inproceedings{Prawitz71,
+       Author = "Dag Prawitz",
+       Title = "Ideas and Results in Proof Theory",
+       Booktitle = "Proc. Second Scandinavian Logic Symposium",
+       editor = "{J. E.} Fenstad",
+       year = 1971,
+       publisher = "North-Holland",
+       address = "Amsterdam",
+       pages = "235--307"
+}
+@InCollection{Pressburger:96:Amphion,
+  author = 	 "Thomas Pressburger and Michael Lowry",
+  title = 	 "Automating Software Reuse with Amphion",
+  booktitle = 	 "NASA Workshop on Software Reuse",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpublisher = {},
+  year = 	 1996,
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTchapter = 	 {},
+  OPTtype = 	 {},
+  address = 	 "Fairfax",
+  OPTedition = 	 {},
+  OPTpages = 	 {},
+  note = 	 "Available at \cite{Amphion:Page}",
+}
+@InProceedings{Pu:95:Optimistic,
+  author = 	 "Calton Pu and Tito Autrey and Andrew Black and 
+		  Charles Consel and Crispin Cowan and
+		  Jon Inouye and Lakshmi Kethana and 
+		  Jonathan Walpole and and Ke Zhang",
+  title = 	 "Optimistic Incremental Specialization:
+		  Streamlining a Commercial Operating System",
+  booktitle = 	 "ACM Symposium on Operating Systems Principles (SOSP'95)",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1995,
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTaddress = 	 {},
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+}
+@Article{Puel:Suarez:93,
+  author = 	 "Laurence Puel and Ascander Suarez",
+  title = 	 "Compiling Pattern Matching by Term Decomposition",
+  journal = 	 JSC,
+  year = 	 {},
+  OPTkey = 	 {},
+  volume = 	 15,
+  number = 	 1,
+  pages = 	 "1--26",
+  note = 	 {},
+}
+@InProceedings{Queinnec:Cointe:acm:lfp:1988,
+       author =       "Christian Queinnec and Pierre Cointe",
+       title =        "An Open Ended Data Representation Model for {\sc
+                      Eu\_Lisp}",
+       email =        "{queinnec,cointe}@inria.inria.fr",
+       crossref =     "acm:lfp:1988",
+       pages =        "298--308",
+       refs =         "18",
+       checked =      "19940504",
+       source =       "dept. library",
+       keywords =     "reflection, metatype, EuLisp",
+       abstract =     "The goal of this paper is to describe an open-ended
+                      type system for Lisp with explicit and full control of
+                      bit-level data representations. This description uses a
+                      reflective architecture based on a metatype facility.
+                      This low-level formalism solves the problem of an
+                      harmonious design of a class taxonomy inside a type
+                      system. A prototype for this framework has been written
+                      in Le-Lisp and is used to built the integrated type and
+                      object systems of the {\sc Eu\_Lisp} proposal.",
+     }
+@InProceedings{Ramsey89,
+	Author = "Norman Ramsey",
+	Title = "Developing fromally verified {Ada} programs",
+	BookTitle = "Proc. fifth International 
+		Conf. on Software Specificationand Design",
+	Year = 1989
+}
+@TechReport{Rees:91:Scheme,
+       title =        "$\mbox{Revised}^4$ Report on the Algorithmic
+                      Language {S}cheme",
+       year =         1992,
+       number =       "AI Memo 848b",
+       pages =        "69",
+       editor =       "Jonathan Rees and William Clinger",
+       author =       "Jonathan Rees and William Clinger and H.
+                      Abelson and N. I. {Adams IV} and D. Bartley and G. Brooks
+                      and R. K. Dybvig and D. P. Friedman and R. Halstead and
+                      C. Hanson and C. T. Haynes and E. Kohlbecker and D.
+                      Oxley and K. M. Pitman and G. J. Rozas and G. J.
+                      Sussman and M. Wand",
+       institution =  MIT,
+     }
+
+@Book{Shalit97,
+  key =          "Shalit",
+  title =        "The {Dylan} Reference Manual: The Definitive Guide to
+                 the New Object-Oriented Dynamic Language",
+  author =       "Andrew Shalit",
+  publisher =    "Addison-Wesley",
+  address =      "Reading, Mass.",
+  year =         "1997",
+}
+
+@Article{Dybvig:1992:SAS,
+  author =       "R. Kent Dybvig and Robert Hieb and Carl Bruggeman",
+  title =        "Syntactic Abstraction in {Scheme}",
+  journal =      "Lisp and Symbolic Computation",
+  volume =       "5",
+  number =       "4",
+  pages =        "295--326",
+  month =        dec,
+  year =         "1992",
+  coden =        "LSCOEX",
+  ISSN =         "0892-4635",
+  bibdate =      "Fri Feb 12 08:11:22 MST 1999",
+  acknowledgement = ack-nhfb,
+  journalabr =   "LISP Symb Comput",
+}
+@Article{Dybvig:2000:MSA,
+  author =       "R. Kent Dybvig",
+  title =        "From Macrogeneration to Syntactic Abstraction",
+  journal =      "Higher-Order and Symbolic Computation",
+  volume =       "13",
+  number =       "1--2",
+  pages =        "57--63",
+  month =        apr,
+  year =         "2000",
+  coden =        "LSCOEX",
+  ISSN =         "1388-3690",
+  bibdate =      "Tue Oct 10 07:41:47 MDT 2000",
+  url =          "http://www.wkap.nl/oasis.htm/258015",
+  acknowledgement = ack-nhfb,
+}
+
+@article{Bellegarde&94,
+	author = "Fran\c{c}oise Bellegarde and James Hook",
+	title = "Substitution:  A formal methods case study using 
+		monads and transformations",
+	journal = "Science of Computer Programming",
+	volume = "23",
+	number = "2--3",
+	pages = "287--311",
+	year = 1994
+}
+@Book{Reps84,
+	Author = "Thomas Reps",
+	Title = "Generating language-based environments",
+	Year = 1984,
+	Publisher = "MIT Press",
+	Address = "Cambridge"
+}
+
+@Unpublished{Machkasova99,
+  author = 	 "Elena Machkasova and Franklyn A. Turbak",
+  title = 	 "A Calculus for Link-time Compilation (Extended Abstract)",
+  note = 	 "(Unpublished manuscript.)  
+                  By way of Franklyn A. Turbak 
+                  (\fr{fturbak@wellesley.edu})",
+  OPTkey = 	 {},
+  year = 	 1999,
+  OPTannote = 	 {}
+}
+
+@Article{Reynolds:HOSC98,                         
+  author =      "John C. Reynolds",               
+  title =       "Definitional Interpreters for Higher-Order
+                 Programming Languages",          
+  journal =     "Higher-Order and Symbolic Computation",
+  year =        1998,                             
+  volume =      11,                               
+  number =      4,                                
+  OPTpages =    "7-105",                          
+  note ="(Reprinted from the Proc. 25th {ACM}
+ National Conf. (1972) \cite{Reynolds72})"                      
+}                                                 
+@inproceedings{Reynolds72,
+	author = "John C. Reynolds",
+	title = "Definitional Interpreters for higher-order programming languages",
+	booktitle = "ACM National Conf.",
+	pages = "717--740",
+	publisher = "{ACM}",
+	year = 1972
+}
+@inproceedings {Fegaras&94,
+	Author = "Leonidas Fegaras and Tim Sheard and Tong Zhou",
+	Title = "Improving Programs which Recurse over Multiple Inductive Structures",
+	Booktitle = "Proceedings from Workshop on Partial Evaluation and Semantics-Based Program Manipulation",
+	Year = 1994
+}
+@techreport {Hook&93,
+	Author = "James Hook and Tim Sheard",
+	Title = "A Semantics of Compile-time Reflection",
+	Institution = ogicse,
+	Number = "CSE-93-019",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1993
+}
+@misc{Hook&95,
+	author = "James Hook and Jeffrey M. Bell",
+	title = "Design of the SDRR Pipeline",
+	year = 1995,
+	note = "In \cite{Pacsoft95}"
+}
+@INCOLLECTION{Reynolds74,
+	AUTHOR = {John C. Reynolds},
+	TITLE = {Towards a theory of types structure},
+	BOOKTITLE = {Proceedings Colloque sur la Programmation},
+	PUBLISHER = {Springer-Verlag},
+	YEAR = 1974,
+	PAGES = "408--423",
+	ADDRESS = "New York"
+}
+@INCOLLECTION{Reynolds83,
+	AUTHOR = {John C. Reynolds},
+	TITLE = {Types, Abstraction and Parametric Polymorphism},
+	BOOKTITLE = {Information Processing 83},
+	PUBLISHER = {North-Holland},
+	YEAR = 1983,
+	PAGES = "513--523",
+	ADDRESS = "Amsterdam"
+}
+@unpublished {Kieburtz&93a,
+	Author = "Richard Kieburtz and Jeffrey R. Lewis",
+	Title = "Programming with Algebras",
+	Note = "",
+	Year = 1993
+}
+@InCollection{Rivieres88,
+       author =       "Jim des Rivieres",
+       title =        "Control-Related Meta-Level Facilities in {LISP}",
+       booktitle =    "Meta-Level Architectures and Reflection",
+       pages =        "101--110",
+       editor =       "Patti Maes and D. Nardi",
+       publisher =    "Elsevier Science",
+       address =      "North-Holland",
+       keywords =     "LISP",
+       year =         1988,
+     }
+@techreport {Kieburtz&94a,
+	Author = "Richard Kieburtz and Jeffrey R. Lewis",
+	Title = "Algebraic Design Language",
+	Institution=ogicse,
+	Year = 1994,
+  note  =        "Available from \cite{ogi-tr-site}",
+	Number = "CSE-94-002"
+}
+@techreport{Kieburtz&94b,
+	Title = {Calculating Software Generators from Solution Specifications},
+	Author = {Richard B. Kieburtz and Fran\c{c}oise Bellegarde and Jef Bell \
+		and James Hook and Jeffrey Lewis and Dina Oliva and Tim Sheard\
+		and Lisa Walton and Tong Zhou},
+	Number = "CSE-94-032B",
+	Institution = ogicse,
+	Year = 1994,
+  note  =        "Available from \cite{ogi-tr-site}",
+	Notes = {A revised version will appear in {TAPSOFT'95} ({LNCS}).}
+}
+@PhdThesis{Ruf:93:Thesis,
+  author = 	 "Erik Ruf",
+  title = 	 "Topics in Online Partial Evaluation",
+  school = 	 "Stanford University",
+  year = 	 1993,
+  OPTkey = 	 {},
+  OPTaddress = 	 {},
+  OPTtype = 	 {},
+  note = 	 "(Also CSL-TR-93-563)",
+}
+@InCollection{Russell:OnDenoting,
+  author = 	 "Bertran Russell",
+  title = 	 "On Denoting",
+  booktitle = 	 "Bertrand Russell.  Logic and Knowledge.  Essays 1901-1950",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  publisher =    "Capricorn Books",
+  year = 	 1971,
+  editor = 	 "Robert Charles Marsh",
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTchapter = 	 {},
+  OPTtype = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@BOOK{Russell03,
+	AUTHOR = {Bertrand Russell},
+	TITLE = {Principles of Mathematics},
+	PUBLISHER = {Cambridge University Press},
+	Year = 1903,
+	NOTE = {The second edition is published by Norton, New York.
+		There is no date of publication in the work.}
+}
+@misc{Kieburtz&95,
+	author = "Richard B. Kieburtz and Jeffrey R. Lewis",
+	title = "Algebraic Design Language (Definition)",
+	year = 1995,
+	note = "In \cite{Pacsoft95}"
+}
+@InProceedings{Rytz:92:APolyvariant,
+  author =       "B. Rytz and M. Gengler",
+  title =        "A Polyvariant Binding Time Analysis",
+  booktitle =    PEPM92,
+  publisher =    Yale,
+  year =         1992,
+  pages =        "21--28",
+  note =         "",
+}
+@PhDThesis{Sasaki86,
+	Author = "Sasaki, James Toshio",
+	Title = "Extracting Efficient Programms from Constructive Proofs", 
+	School = "Cornell University",
+	Address = "Ithaca",
+	Year = 1986,
+}
+@TechReport{Schneider87,
+	Author = "Fred B. Schneider",
+	Title = "The State Machine Approach:  A Tutorial",
+	Institution = CUCS,
+	Year = 1987
+}
+@InProceedings{SchroederHeister93elp,
+       author =       "Peter Schroeder-Heister",
+       title =        "Definitional Reflection and the Completion",
+       editor =       "R. Dyckhoff",
+       booktitle =    "Proc. 4th International Workshop on
+                      Extensions of Logic Programming",
+       year =         1993,
+       publisher =    "Springer-Verlag LNAI 798",
+       pages =        "333--347",
+       keywords =     "Pi",
+     }
+@InProceedings{SchroederHeister93lics,
+       author =       "Peter Schroeder-Heister",
+       title =        "Rules of Definitional Reflection",
+       editor =       "M. Vardi",
+       pages =        "222--232",
+       booktitle =    "Proc. Eighth Annual {IEEE} Symposium on
+                      Logic in Computer Science",
+       address =      "Montreal",
+       year =         1993,
+       keywords =     "Pi",
+     }
+@INPROCEEDINGS{Scott70,
+	AUTHOR = {Dana Scott},
+	TITLE = {Constructive Validity},
+	BOOKTITLE = {the Symposium on Automatic Demonstration, Lecture 
+		     Notes in Mathematics },
+	YEAR = 1970,
+	PUBLISHER = {Springer-Verlag},
+	ADDRESS = "New York"
+}
+@INPROCEEDINGS{Scott72,
+	AUTHOR = {Dana Scott},
+	TITLE = {Lattice theoretic models for various type-free calculi},
+	BOOKTITLE = {Proceedings 4th International Congress in Logic,
+		     Methodology and the Philosophy of Science},
+	YEAR = 1972,
+	NOTE = {Bucharest}
+}
+@TechReport{SecurityFoundations,
+	Author = "Staff",
+	Title = "Foundations: Theory of Security",
+	Institution = ORA,
+	Year = 1987
+}
+@unpublished{Seldin87,
+        author = "Jonathan P. Seldin",
+        title = "Theory of Mathesis",
+        note = "Internal technical report,
+                Odyssey Research Associates.  The Air Force will
+		publish a version of this technical report in the near
+		future.",
+        year = 1987
+}
+@unpublished{Seldin89,
+        author = "Jonathan P. Seldin",
+        title = "On the proof theory of {Coquand}'s calculus
+		of constructions",
+        note = "Presented to the meeting of the Association for Symbolic Logic
+		held at UCLA in January 1989.  An abstract will appear in the 
+		{\em Journal of Symbolic Logic}.",
+        year = 1989
+}
+@Article{Sestoft:88:Annotated,
+  author = 	 "P. Sestoft and A. V. Zamaulin",
+  title = 	 "Annotated Bibliography on Partial Evaluation and
+		  Mixed Computation",
+  journal = 	 "New Generation Computing",
+  year = 	 1988,
+  OPTkey = 	 {},
+  volume = 	 6,
+  number = 	 "2,3",
+  pages = 	 "309--354",
+  OPTnote = 	 "[A copy of this bibliography is constantly updated
+		  on the Web.]",
+}
+@InProceedings{Seward:93:Polymorphic-Strictness-Analysis,
+  author =       "Julian Seward",
+  title =        "Polymorphic Strictness Analysis using Frontiers",
+  booktitle =    PEPM93,
+  year =         1993,
+  pages =        "186--193",
+  publisher =    ACM,
+  note =         "",
+}
+@unpublished {Sheard93a,
+	Author = "Tim Sheard",
+	Title = "Type Parametric Programming with Compile-time Reflection",
+	Year = 1993
+}
+@unpublished {Sheard93b,
+	Author = "Tim Sheard",
+	Title = "Guide to Using {CRML}",
+	Note = "",
+	Year = 1993
+}
+@techreport {Sheard93c,
+	Author = "Tim Sheard",
+	Title = "Type Parametric Programming",
+	Institution = ogicse,
+	Number = "CSE-93-018",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1993,
+}
+
+@misc{Sheard95a,
+	author = "Tim Sheard",
+	title = "{HOT} Tool Documentation",
+	year = 1995,
+	note = intooldocs
+}
+@misc{Sheard95b,
+	author = "Tim Sheard",
+	title = "Chin, a Program Specializer---{Tool} documentation",
+	year = 1995,
+	note = intooldocs
+}
+@Misc{Sheard:94:Attribute,
+  OPTkey = 	 {},
+  author = 	 "Tim Sheard and Jef Bell",
+  title = 	 "Attribute Grammar Computations in {CRML}",
+  howpublished = "Unpublished manuscript",
+  year = 	 1994,
+  OPTnote = 	 {},
+}
+@Misc{Sheard:95:WellTyped,
+  OPTkey = 	 {},
+  author = 	 "Tim Sheard",
+  title = 	 "Well Typed Meta-Programming Systems",
+  howpublished = "Unpublished Draft",
+  year = 	 1995,
+  OPTnote = 	 {},
+}
+@TechReport{Sheard:96:Hitchhicker,
+  author = 	 "Tim Sheard and Walid Taha",
+  title = 	 "The Hitchhicker's Guide to Writing Program Generators
+		  in {MetaML}",
+  institution =  "Oregon Graudate Institute",
+  year = 	 1996,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  OPTnumber = 	 {},
+  OPTaddress = 	 {},
+  OPTnote = 	 {},
+}
+@Unpublished{Sheard:Meta,
+  author = 	 "Tim Sheard",
+  title = 	 "Well Typed Meta-Programming Systems",
+  note = 	 "(Draft)[*]",
+  OPTkey = 	 {},
+  year = 	 1995,
+}
+@inproceedings{Sheard&93,	
+	author = "Tim Sheard and Leonidas Fegaras",
+	title = "A Fold for All Seasons",
+	booktitle = "Proc. Conf. on Functional
+		Programming and Computer Architecture",
+	address = "Copenhagen",
+	year = 1993
+
+}
+
+
+@inproceedings{NielsonNielson:97:Perscriptive,
+  author = 	 "Flemming Nielson and Hanne Riis Nielson",
+  title = 	 "A Prescriptive Framework for Designing 
+                  Multi-Level Lambda-Calculi",
+
+	booktitle = "Proc. Symposium on Partial Evaluation
+                    and Semantics-Based Program Manipulation",
+	address = "Amsterdam",
+        publisher = ACM,
+        pages = "193--202",
+	year = 1997
+}
+@inproceedings{Launchbury:96:Monadic,
+  author = 	 "John Launchbury and Amr Sabry",
+  title = 	 "Monadic State: Axiomatization and Type Safety",
+
+	booktitle = "Proc. International Conf. 
+                     on Functional Programming",
+	address = "Amsterdam",
+	year = 1997
+}
+@inproceedings{Sheard:96:TypeDirected,
+  author = 	 "Tim Sheard",
+  title = 	 "A Type-Directed, On-line Partial Evaluator for a Polymorphic Language",
+
+	booktitle = "Proc. Symposium on Partial Evaluation
+                    and Semantics-Based Program Manipulation",
+	address = "Amsterdam",
+        pages = "22--3",
+	year = 1997
+}
+
+
+
+@techreport {Sheard&94a,
+	Author = "Tim Sheard and Leonidas Fegaras",
+	Title = "Optimizing Algebraic Programs",
+	Institution = ogicse,
+	Number = "CSE-94-004",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1994
+}
+@unpublished {Sheard&94b,
+	Author = "Tim Sheard and James Hook",
+	Title = "Meta-Programming Tools for {ML}",
+	Note = "",
+	Year = 1994
+}
+@InProceedings{Singh:FPGA,
+  author = 	 "Santam Singh",
+  title = 	 "Architectural Descriptions for FPGA Circuits",
+  booktitle = 	 "IEEE Symposium on FPGAs for Custom Computing Machines",
+  editor = 	 "Peter Athanas and Kennet L. Pocek",
+  year = 	 1995,
+  organization = "IEEE",
+  publisher =    "IEEE Computer Society Press",
+  address = 	 "Napa Valley",
+  note =         "[*]"
+}
+@PhdThesis{Smith:82:Reflection,
+  author = 	 "Brian Cantwell Smith",
+  title = 	 "Reflection and Semantics in a Procedural Language",
+  school = 	 "Massachusetts Institute of Technology",
+  year = 	 1982,
+  OPTkey = 	 {},
+  OPTaddress = 	 {},
+  OPTtype = 	 {},
+  pages =        "23--35"
+}
+@InProceedings{Smith:84:ReflectionInLisp, 
+  author = 	 "Brian Cantwell Smith",
+  title = 	 "Reflection and Semantics in {LISP}",
+  booktitle = 	 POPL,
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1984,
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTaddress = 	 {},
+  pages = 	 "23--35",
+  OPTnote = 	 {},
+}
+@INPROCEEDINGS{Staff88a,
+	AUTHOR = {Ulysses Staff},
+	TITLE = {Ulysses: a computer-security modeling environment},
+	BOOKTITLE = {Proc. 11th National Computer Security Conf. },
+	YEAR = 1988,
+}	
+@techreport {Walton&94a,
+	Author = "Lisa Walton and James Hook",
+	Title = "A Preliminary Definition of a Domain Specific Design Language for Message Translation and Validation",
+	Institution = ogicse,
+	Number = "CSE-94-006",
+  note  =        "Available from \cite{ogi-tr-site}",
+	Year = 1994
+}
+@techreport{Walton&95a,
+        author = "Lisa Walton and James Hook",
+        title = "Message Specification Language {(MSL)}:
+                 A Domain Specific Design Language for Message Translation and Validation",
+        institution = ogicse,
+  note  =        "Available from \cite{ogi-tr-site}",
+        year = 1995
+}
+@techreport{Walton&95b,
+        author = "Lisa Walton and James Hook",
+        title = "Message Specification Language {(MSL)}:
+                 Reference Manual",
+        institution = ogicse,
+  note  =        "Available from \cite{ogi-tr-site}",
+        year = 1995
+}
+@misc{Walton&95c,
+	author = "Lisa Walton and James Hook",
+	title = "Design Automation:  Making formal methods relevant",
+	year = 1995,
+	note = "To be presented at {ICSE-17} Workshop on Formal Methods Application 
+	in Software Engineering Practice"
+}
+@misc{Walton&95d,
+	author = "Lisa Walton and James Hook",
+	title = "MSL Compiler Tool Documentation",
+	year = 1995,
+	note = intooldocs
+}
+
+@inproceedings{Staff88b,
+	AUTHOR = {Ulysses Staff},
+	TITLE = {Security Modeling in the {Ulysses} Environment},
+	BOOKTITLE = {Fourth Aerospace Computer Security Conf.},
+	YEAR = 1988,
+}
+@Book{Stenlund72,
+	Author = "{S\"oren} Stenlund",
+	Title = "Combinators, Lambda-Terms and Proof Theory",
+	Year = 1972,
+	Publisher = "D. Reidel",
+	Address = "Dordrecht"
+}
+@InProceedings{Stickel:94:Deductive,
+  author = 	 "Mark Stickel and Richard Waldinger and Michael Lowry and Thomas Pressburger and Ian Underwood",
+  title = 	 "Deductive Composition of Astronomical Software from Subroutine Libraries",
+  booktitle = 	 "12th Conf. on Automated Deduction",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1994,
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTaddress = 	 {},
+  pages = 	 "341--355",
+  note = 	 "Available at \cite{Amphion:Page}",
+}
+
+@Book{Stoy77,
+	Author ="Joseph E. Stoy",
+	Title = "Denotational Semantics:  The Scott-Strachey
+		Approach to Programming Language Theory",
+	Publisher = "MIT Press",
+	Address = "Cambridge",
+	Year = 1977
+}
+
+@TechReport{Taha:95:OnUsing,
+  author = 	 "Walid Taha",
+  title = 	 "On Using an OODBMS in a CASE Environment",
+  institution =  "The Oregon Graduate Institute",
+  year = 	 1995,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "CSE-95-007",
+  OPTaddress = 	 {},
+  OPTnote = 	 {},
+  note  =        "Available from \cite{ogi-tr-site}",
+}
+
+@Article{Georgeff:84,
+  author = 	 "Michael Georgeff",
+  title = 	 "Transformatinos and Reduction Strategies for Typed
+		  Lambda Expressions",
+  journal = 	 TOPLAS,
+  year = 	 1984,
+  OPTkey = 	 {},
+  volume = 	 6,
+  number = 	 4,
+  pages = 	 "603--631",
+  note = 	 {},
+}
+
+@Unpublished{Taha:96:Intro,
+  author = 	 "Walid Taha",
+  title = 	 "A Quick Introduction to Offline Partial Evaluation
+		  and Related Topics",
+  note = 	 "Term Paper",
+  OPTkey = 	 {},
+  year = 	 1996,
+}
+
+@InProceedings{Talcott:88:Partial,
+       author =       "Carolyn L. Talcott and R. Weyhrauch",
+       title =        "Partial Evaluation, Higher-Order Abstractions, and
+                      Reflection Principles as System Building Tools",
+       booktitle =    PEMC,
+       editor =       BEJ,
+       pages =        "507--529",
+       publisher =    N-H,
+       year =         1988,
+     }
+
+@Book{Tourlakis:83:Computability,
+  author = 	 "George J. Tourlakis",
+  title = 	 "Computability",
+  publisher = 	 "Reston",
+  year = 	 1983,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTedition = 	 {},
+  OPTnote = 	 {},
+}
+@InCollection{VanHarmelen:89:TheLimitations,
+  author =       "F. van Harmelen",
+  title =        "The Limitations of Partial Evaluation",
+  booktitle =    "Logic-Based Knowledge Representation",
+  publisher =    MIT,
+  year =         1989,
+  editor =       "P. Jackson and H. Reichgelt and F. van Harmelen",
+  note =         "",
+}
+		  
+@inproceedings{Volpano85,
+        author = "Dennis Volpano and Richard B. Kieburtz",
+	title = "Software Templates",
+	booktitle = "Proc. Eighth International Conf. on Software Engineering",
+	pages = "55--60",
+	publisher = "IEEE Computer Society",
+	year = 1985
+}		  
+@inproceedings{Volpano89,
+        author = "Dennis Volpano and Richard B. Kieburtz",
+	title = "The templates approach to software reuse",
+	booktitle = "Software Reusability",
+	pages = "247--255",
+	editor = "Ted J. Biggersstaff and Alan J. Perlis",
+	publisher = ACM,
+	year = 1989
+}
+@InCollection{Wand88,
+       author =       "Mitchell Wand and Daniel P. Friedman",
+       editor =       "P. Maes and D. Nardi",
+       title =        "The Mystery of the Tower Revealed: {A} Non-Reflective
+                      Description of the Reflective Tower",
+       booktitle =    "Meta-Level Architectures and Reflection",
+       pages =        "111--134",
+       publisher =    "Elsevier Science",
+       year =         1988,
+     }
+@Article{WandFriedman88,
+       author =       "Mitchell Wand and Daniel P. Friedman",
+       title =        "The Mystery of the Tower Revealed: {A} Non-Reflective
+                      Description of the Reflective Tower",
+       journal =      "{LISP} and Symbolic Computation",
+       year =         1988,
+       volume =       "1",
+       pages =        "11--37",
+       note =         "Reprinted in {\it Meta-Level Architectures and
+                      Reflection} (P. Maes and D. Nardi, eds.) North-Holland,
+                      Amsterdam, 1988, pp. 111--134",
+     }
+@InProceedings{Yonezawa89,
+       author =       "A. Yonezawa and T. Watanabe",
+       title =        "An Introduction to Object-Based, Reflective,
+                      Concurrent Computation",
+       booktitle =    "Proc. Workshop on Object-Based Concurrent
+                      Programming, ACM SIGPLAN Notices",
+       pages =        "50",
+       year =         1989,
+       abstract =     "Extends the notion of reflection to object-based
+                      concurrent computation.",
+       note =         "Published as Proc. ACM SIGPLAN Workshop on
+                      Object-Based Concurrent Programming, ACM SIGPLAN
+                      Notices, volume 24, number 4",
+     }
+@InProceedings{desRivieres:Smith:acm:lfp:1984,
+       author =       "Jim des Rivi{\`e}res and Brian Cantewell Smith",
+       title =        "The implementation of Procedurally Reflective
+                      Languages",
+       crossref =     "acm:lfp:1984",
+       pages =        "331--347",
+       refs =         "18",
+       checked =      "19940322",
+       source =       "dept. library",
+       sjb =          "3-LISP is an extended Scheme.",
+       keywords =     "reflection, Lisp, Scheme",
+       abstract =     "In a procedurally reflective programming language, all
+                      programs are executed not through the agency of a
+                      primitive and inaccessible interpreter, but rather by
+                      the explicit running of a program that represents that
+                      interpreter. In the corresponding virtual machine,
+                      therefore, there are an infinite number of levels at
+                      which programs are processed, all simultaneously
+                      active. It is therefore a substantial question to show
+                      whether, and why, a reflective language is
+                      computationally tractable. We answer this question by
+                      showing how to produce an efficient implementation of a
+                      procedurally reflective language, based on the notion
+                      of a {\em level-shifting} processor. A series of
+                      general techniques, which should be applicable to
+                      reflective variants of any standard applicative or
+                      imperative programming languages, are illustrated in a
+                      complete implementation for a particular reflective
+                      LISP dialect called 3-LISP.",
+       reffrom =      Queinnec:Cointe:acm:lfp:1988,
+       reffrom =      Danvy:Malmkjaer:acm:lfp:1988,
+       reffrom =      Bawden:acm:lfp:1988,
+     }		  
+		  
+		  
+		  @Manual{Wile:POPART,
+  title = 	 "POPART:  Produce of Parsers and Related Tools,
+		  System Builders' Manual",
+  author =	 "David S. Wile",
+  organization = "USC/Information Sciences Institute",
+  address =	 "Marina Del Rey, CA 90292,(310)822-15511,wile@isi.edu",
+  edition =	 "DRAFT",
+  year =	 1993,
+  note =	 "[via Hook]",
+}
+
+
+		  
+@InProceedings{Bawden99,
+  title =        "Quasiquotation in {LISP}",
+  author =       "Alan Bawden",
+  booktitle =    "Proc. Workshop on
+                 Partial Evaluation and Semantics-Based Program
+                 Manipulation",
+  editor = 	 "O. Danvy",
+  address = 	 "San Antonio",
+  publisher =    "University of Aarhus, Dept. of Computer Science",
+  pages =        "88--99",
+  note =         "Invited talk",
+  year =         1999
+}
+
+
+@inproceedings{Kieburtz&95a,
+	Title = {Calculating Software Generators from Solution Specifications},
+	Author = {Richard B. Kieburtz and Francoise Bellegarde and Jef Bell 
+		and James Hook and Jeffrey Lewis and Dino Oliva and Tim Sheard
+		and Lisa Walton and Tong Zhou},
+	Booktitle = {{TAPSOFT'95}},
+	Publisher = {Springer-Verlag},
+	Series = LNCS,
+	Volume = 915,
+	Pages = "546--560",
+	Year = 1995
+}
+
+@Inproceedings{Kieburtz&96a,
+	Author = "Richard B. Kieburtz and  Laura McKinney and Jeffrey Bell and  James Hook and  Alex Kotov and  Jeffrey Lewis and  Dino Oliva and  Tim Sheard and  Ira Smith and Lisa Walton",
+	Title = "A Software Engineering Experiment in Software Component Generation",
+	Booktitle = "18th International Conf. in Software Engineering",
+	Year = 1996,
+        pages = "542-553",
+}
+		  
+
+@Article{Plotkin75,
+author =       "Gordon D. Plotkin",
+title =        "Call-by-name, call-by-value and the lambda-calculus",
+journal =      "Theoretical Computer Science",
+volume =       "1",
+pages =        "125--159",
+year =         1975,
+keywords =     "lambda calculus call be value call by need normal
+                order lazy evaluation functional programming FP",
+}
+
+
+
+@TechReport{Leone&Lee93,
+       year =         1993,
+       author =       "Mark Leone and Peter Lee",
+       title =        "Deferred Compilation: The Automation of Run-time 
+                       Code Generation",
+       number =       "CMU-CS-93-225",
+       institution =  "Carnegie Mellon University"
+     }
+
+@Article{Launchbury:95,
+       author =       "John Launchbury and Simon L. {Peyton Jones}",
+       title =        "State in Haskell",
+       pages =        "293--342",
+       journal =      "{LISP} and Symbolic Computation",
+       year =         1995,
+       volume =       "8",
+       number =       "4",
+       note =         "pldi94",
+     }
+@InProceedings{Nielson:96,
+  author =       "Flemming Nielson and Hanne Riis Nielson",
+  title =        "Multi-Level Lambda-Calculi: An Algebraic Description",
+  booktitle =    "Partial Evaluation. Dagstuhl Castle, Germany, February
+                 1996",
+  year =         1996,
+  editor =       "O. Danvy and R. Gl{\"u}ck and P. Thiemann",
+  volume =       "1110",
+  series =       "Lecture Notes in Computer Science",
+  publisher =    "Berlin:\ Springer-Verlag",
+  pages =        "338--354",
+}
+@Book{Nielson:92,
+  author =       "Flemming Nielson and Hanne Riis Nielson",
+  title =        "Two-Level Functional Languages",
+  publisher =    CUP,
+  year =         1992,
+  OPTkey =       {},
+  OPTeditor =    {},
+  OPTvolume =    {},
+  number =       34,
+  series =       CUPtracts,
+  address =      "Cambridge",
+  OPTedition =   {},
+  note =         "",
+}
+@InProceedings{Moggi:97,
+  author = 	 "Eugenio Moggi",
+  title = 	 "A categorical account of two-level languages",
+  booktitle = 	 "Mathematics Foundations of Program Semantics",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1997,
+  OPTorganization = {},
+  publisher =    "Elsevier Science",
+  OPTaddress = 	 {},
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{TS97,
+  author       = {Taha, Walid and Sheard, Tim},
+  YEAR         = 1997,
+  mouth        = jun,
+  TITLE        = {Multi-Stage Programming with Explicit Annotations},
+  publisher =    "ACM Press",
+  booktitle    = {Proc. Symposium on Partial
+                  Evaluation and Semantic-Based Program Manipulation
+                  {(PEPM)}},
+  address      = "Amsterdam",
+  pages        = "203--217",
+  OPTnote = "An extended and revised version appears in \cite{TS00}"
+}
+
+@InProceedings{Auslander:96,
+  title =        "Fast, Effective Dynamic Compilation",
+  author =       "Joel Auslander and Matthai Philipose and Craig
+                 Chambers and Susan J. Eggers and Brian N. Bershad",
+  pages =        "149--159",
+  booktitle =    "Proc. Conf. on
+                 Programming Language Design and Implementation",
+  year =         1996,
+  address =      "Philadelphia",
+}
+
+
+@Article{Batory:95,
+  author = 	 "Don Batory and Jeff Thomas",
+  title = 	 "P2: A Lightweight DBMS Generator",
+  journal = 	 "Journal of Intelligent Information Systems",
+  year = 	 1995,
+  OPTkey = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@Article{Batory:97,
+  author = 	 "Don Batory and Bart J. Geraci",
+  title = 	 "Composition Validation and Subjectivity in GenVoca Generators",
+  journal = 	 "IEEE Transactions on Software Engineering",
+  year = 	 1997,
+  OPTkey = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTpages = 	 "67--82",
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@Article{Wright:94,
+  title =        "A Syntactic Approach to Type Soundness",
+  author =       "Andrew K. Wright and Matthias Felleisen",
+  pages =        "38--94",
+  journal =      "Information and Computation",
+  year =         1994,
+  volume =       "115",
+  number =       "1",
+}
+
+@InProceedings{Consel:93,
+  author =       "Charles Consel and Calton Pu and Jonathan Walpole",
+  title =        "Incremental Specialization: The Key to High
+                 Performance, Modularity, and Portability in Operating
+                 Systems",
+  pages =        "44--46",
+  ISBN =         "0-89791-594-1",
+  booktitle =    "Proc. Symposium on Partial Evaluation and
+                 Semantics-Based Program Manipulation",
+  publisher =    ACM,
+  address =      "New York",
+  year =         1993,
+}
+
+@InProceedings{Consel:96,
+  title =        "A General Approach for Run-Time Specialization and its
+                 Application to {C}",
+  author =       "Charles Consel and Fran{\c{c}}ois No{\"e}l",
+  pages =        "145--156",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  year =         1996,
+  address =      "St. Petersburg Beach",
+}
+
+
+@InProceedings{Davies:96,
+  author =       "Rowan Davies and Frank Pfenning",
+  title =        "A Modal Analysis of Staged Computation",
+  booktitle =    "the Symposium on Principles of
+                  Programming Languages {(POPL '96)}",
+  year =         1996,
+  address =      "St. Petersburg Beach",
+  pages   =      "258--270",
+}
+
+@InProceedings{WS99,
+  author =       "Mitchell Wand and Igor Siveroni",
+  title =        "Constraint Systems for Useless Variable Elimination",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  year =         1999,
+  pages   =      "291-302",
+}
+
+@InProceedings{Davies:96b,
+  title =        "A Temporal-Logic Approach to Binding-Time Analysis",
+  author =       "Rowan Davies",
+  pages =        "184--195",
+  booktitle =    "the Symposium on Logic in Computer Science {(LICS '96)}",
+  year =         1996,
+  address =      "New Brunswick",
+  organization = "IEEE Computer Society Press",
+}
+
+@InCollection{Detlefs:91,
+  author =       "David L. Detlefs",
+  title =        "Concurrent Garbage Collection for {C++}",
+  booktitle =    "Topics in Advanced Language Implementation",
+  editor =       "Peter Lee",
+  publisher =    "MIT Press",
+  year =         1991,
+}
+
+@InProceedings{Engler:96,
+  author =       "Dawson R. Engler",
+  title =        "{VCODE} : {A} Retargetable, Extensible, Very Fast
+                 Dynamic Code Generation System",
+  pages =        "160--170",
+  ISBN =         "0-89791-795-2",
+  booktitle =    "Proc. Conf. on
+                 Programming Language Design and Implemantation",
+  publisher =    ACM,
+  address =      "New York",
+  year =         1996,
+}
+
+@InProceedings{Engler:96b,
+  title =        "{`C}: {A} Language for High-Level, Efficient, and
+                 Machine-Independent Dynaic Code Generation",
+  author =       "Dawson R. Engler and Wilson C. Hsieh and M. Frans
+                 Kaashoek",
+  pages =        "131--144",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  year =         1996,
+  address =      "St. Petersburg Beach",
+}
+
+@InProceedings{Glueck:95,
+  author =       "Robert Gl{\"u}ck and Jesper J{\o}rgensen",
+  year =         1995,
+  title =        "Efficient Multi-Level Generating Extensions for
+                 Program Specialization",
+  booktitle =    "Programming Languages: Implementations, Logics and
+                 Programs (PLILP'95)",
+  editor =       "S. D. Swierstra and M. Hermenegildo",
+  publisher =    "Springer-Verlag",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "982",
+  pages =        "259--278",
+}
+
+@InProceedings{Glueck:96,
+  author =       "Robert Gl{\"u}ck and Jesper J{\o}rgensen",
+  year =         1996,
+  title =        "Fast Binding-Time Analysis for Multi-Level
+                 Specialization",
+  booktitle =    "Perspectives of System Informatics",
+  editor =       "Dines Bj{\o}rner and Manfred Broy and Igor V.
+                 Pottosin",
+  publisher =    "Springer-Verlag",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "1181",
+  pages =        "261--272",
+}
+
+@Article{Glueck:97,
+  author =       "Robert Gl{\"u}ck and Jesper J{\o}rgensen",
+  year =         1997,
+  title =        "An Automatic Program Generator for Multi-Level
+                 Specialization",
+  journal =      "{LISP} and Symbolic Computation",
+  volume =       "10",
+  number =       "2",
+  pages =        "113--158",
+}
+
+@InProceedings{Grant:97,
+  title =        "Annotation-Directed Run-Time Specialization in~{C}",
+  author =       "Brian Grant and Markus Mock and Matthai Philipose and
+                 Craig Chambers and Susan J. Eggers",
+  pages =        "163--178",
+  booktitle =    "Proc. Symposium on
+                 Partial Evaluation and Semantics-Based Program
+                 Manipulation",
+  year =         1997,
+  address =      "Amsterdam",
+  ISBN =         "ISBN 0-89791-917-3",
+}
+
+@InProceedings{Guillermo:97,
+  author = 	 "Guillermo Jimenez-Perez and Don Batory",
+  title = 	 "Memory Simulators and Software Generators",
+  booktitle = 	 "the Symposium on Software Reuse",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1997,
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTaddress = 	 {},
+  pages = 	 "136--145",
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@INCOLLECTION{Huet:91,
+	AUTHOR = {Huet, G. and L{\'e}vy, J.-J.},
+	TITLE = {Computations in Orthogonal Rewriting Systems, {I}},
+	BOOKTITLE = {Computational Logic},
+	PAGES = "395--414",
+	EDITOR = {Lassez, J.-L. and Plotkin, G.},
+	PUBLISHER = "MIT press",
+	YEAR = 1991,
+	CHAPTER = {11}
+}
+
+@InCollection{Klop:92,
+  author	= {Klop, J. W.},
+  title		= {Term Rewriting Systems},
+  volume	= 2,
+  pages		= "1--116",
+  booktitle	= {Handbook of Logic in Computer Science},
+  publisher	= {Oxford University Press},
+  year		= 1992,
+  editor	= {S. Abramsky and Dov M. Gabbay and T. S. E. Maibaum}
+}
+
+@InProceedings{Koopman:89,
+  title =        "Cache Performance of Combinator Graph Reduction",
+  author =       "Philip J. Koopman and Peter Lee and Daniel P.
+                 Siewiorek",
+  booktitle =    "Proc. Conf. on Programming
+                 Languages Design and Implementation",
+  address =      "Portland",
+  year =         1989,
+  publisher =    ACM,
+  series =       "ACM SIGPLAN Notices",
+  volume =       "24(7)",
+  pages =        "110--119",
+}
+
+@InProceedings{Koopman:89b,
+  author =       "Philip J. {Koopman, Jr.} and Peter Lee",
+  title =        "A Fresh Look at Combinator Graph Reduction",
+  pages =        "110--119",
+  ISBN =         "0-89791-306-X",
+  editor =       "Bruce Knobe",
+  booktitle =    "Proc. Conf. on
+                 Programming Language Design and Implementation
+                 ({SIGPLAN} '89)",
+  address =      "Portland",
+  year =         1989,
+  publisher =    ACM,
+}
+
+@Article{Lee:88,
+  key =          "Lee, {\em et al.}",
+  author =       "Peter Lee and Frank Pfenning and Gene Rollins and
+                 William Scherlis",
+  title =        "The Ergo Support System: An Integrated Set of Tools
+                 for Prototyping Integrated Environments",
+  journal =      "ACM SIGSOFT Software Engineering Notes",
+  volume =       "13",
+  number =       "5",
+  year =         1988,
+  pages =        "25--34",
+  note =         "Proc. Software
+                 Engineering Symposium on Practical Software Development
+                 Environments",
+  annote =       "Prototyping formal methods. 30 references.",
+}
+		  
+@Book{Lee:89,
+  author =       "Peter Lee",
+  title =        "Realistic Compiler Generation",
+  year =         1989,
+  publisher =    "MIT Press",
+  series =       "Foundations of Computing Series",
+  annote =       "This book is based on {\em High-Level Semantics\/},
+                 which is essentially a variant of action semantics,
+                 especially suited to the purposes of compiler
+                 generation for conventional programming languages.",
+  keywords =     "action semantics",
+}
+
+@InProceedings{Lee:96,
+  author =       "Peter Lee and Mark Leone",
+  title =        "Optimizing {ML} with Run-Time Code Generation",
+  pages =        "137--148",
+  ISBN =         "0-89791-795-2",
+  booktitle =    "Proceedingsof the Conf. on
+                 Programming Language Design and Implemantation",
+  publisher =    ACM,
+  address =      "New York",
+  year =         1996,
+}
+
+@TechReport{Leone:93,
+  author =       "Mark Leone and Peter Lee",
+  institution =  "Carnegie Mellon, Department of Computer Science",
+  title =        "Deferred Compilation: The Automation of Run-Time Code
+                 Generation",
+  year =         1993,
+  address =      "Pittsburgh",
+  url =          "ftp://reports.adm.cs.cmu.edu/usr0/anon/1993/CMU-CS-93-225.ps",
+  number =       "CMU-CS-93-225",
+}
+
+@InProceedings{Leone:94,
+  author =       "Mark Leone and Peter Lee",
+  booktitle =    "Proc. Workshop on
+                 Partial Evaluation and Semantics-Based Program
+                 Manipulation",
+  title =        "Lightweight Run-Time Code Generation",
+  year =         1994,
+  url =          "ftp://ftp.cs.cmu.edu/afs/cs.cmu.edu/user/mleone/papers/lw-rtcg.ps",
+  pages =        "97--106",
+  publisher =    "Technical Report 94/9, Department of Computer Science,
+                 University of Melbourne",
+}
+
+@TechReport{Leone:95,
+  author =       "Mark Leone and Peter Lee",
+  institution =  "School of Computer Science, Carnegie Mellon
+                 University",
+  title =        "Optimizing {ML} with Run-Time Code Generation",
+  year =         1995,
+  address =      "Pittsburgh",
+  url =          "http://www.cs.cmu.edu/afs/cs.cmu.edu/user/mleone/papers/ml-rtcg.ps",
+  keywords =     "Run-time code generation, dynamic optimization,
+                 partial evaluation, specialization, staged
+                 computation",
+  number =       "CMU-CS-95-205",
+}
+
+@InProceedings{Leone:96,
+  author =       "Mark Leone and Peter Lee",
+  title =        "{A} Declarative Approach to Run-Time Code Generation",
+  year =         1996,
+  url =          "http://www.cs.cmu.edu/afs/cs.cmu.edu/user/mleone/papers/declarative-rtcg.ps",
+  keywords =     "run-time code generation, dynamic optimization,
+                 specialization, partial evaluation",
+  scope =        "implemen",
+  booktitle =    "Workshop on Compiler Support for System Software
+                 (WCSSS)",
+}
+
+
+@InProceedings{implicit,
+  author =       "Jeffrey R. Lewis and John Launchbury and Erik Meijer
+                 and Mark Shields",
+  title =        "Implicit Parameters: Dynamic Scoping with Static
+                 Types.",
+  pages =        "108--118",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  month =        jan # " ~19--21",
+  publisher =    "ACM Press",
+  address =      "N.Y.",
+  year =         "2000",
+}
+
+@PhdThesis{Okasaki96,
+  author = 	 "Chris Okasaki",
+  title = 	 "Purely Functional Data Structures",
+  school = 	 "School of Computer Science, 
+Carnegie Mellon University",
+  year = 	 1996,
+  OPTkey = 	 {},
+  OPTaddress = 	 {},
+  OPTtype = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+
+@InProceedings{okasakiViews,
+  author = 	 "Chris Okasaki",
+  title = 	 "Views for Standard ML",
+  booktitle = 	 "ACM SIGPLAN Workshop on ML",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpages = 	 {},
+  year = 	 1998,
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@Article{Okasaki:94,
+  author =       "Chris Okasaki and Peter Lee and David Tarditi",
+  journal =      "{LISP} and Symbolic Computation",
+  title =        "Call-by-need and Continuation-passing Style",
+  year =         1994,
+  url =          "http://foxnet.cs.cmu.edu/people/cokasaki/lazy-cps.ps",
+  keywords =     "call-by-need, continuation-passing style,
+                 continuations, lazy evaluation",
+  number =       "1",
+  pages =        "57--82",
+  volume =       "7",
+}
+
+@InProceedings{Pfenning:88,
+  author =       "Frank Pfenning and Peter Lee",
+  title =        "{LEAP}: {A} Language with Eval And Polymorphism",
+  editor =       "Josep D{\'\i}az and Fernando Orejas",
+  booktitle =    "{TAPSOFT}'89: Proc. International Joint
+                 Conf. on Theory and Practice of Software
+                 Development,",
+  year =         "1989",
+  publisher =    "Springer-Verlag",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "352",
+  pages =        "345--359",
+}
+
+
+@InProceedings{Pu:97,
+  author = 	 "Calton Pu and Andrew Black and Crispin Cowan and Jonathan
+Walpole",
+  title = 	 "Microlanguages for Operating System Specialization",
+  booktitle = 	 "Proc. Workshop
+on Domain-Specific Languages",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1997,
+  OPTorganization = {},
+  OPTpublisher = {},
+  address = 	 "Paris",
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+In Proc. 1998 , Baltimore, Maryland, September 1998.
+
+@InProceedings{Yang:1999:ETM,
+  author =       "Zhe Yang",
+  title =        "Encoding Types in {ML}-like Languages",
+  booktitle =    "Proc. 
+                  International Conf. on
+                   Functional Programming ({ICFP})",
+  pages =        "289--300",
+  publisher =    ACM,
+  address   =    "Baltimore",
+  year =         "1998",
+}
+
+@InProceedings{Sperber:96,
+  title =        "Realistic Compilation by Partial Evaluation",
+  author =       "Michael Sperber and Peter Thiemann",
+  pages =        "206--214",
+  booktitle =    "Proc. Conf. on
+                 Programming Language Design and Implementation",
+  year =         1996,
+  address =      "Philadelphia",
+}
+		  
+@InProceedings{Sperber:97,
+  title =        "Two for the Price of One: Composing Partial Evaluation
+                 and Compilation",
+  author =       "Michael Sperber and Peter Thiemann",
+  booktitle =    "Proc. Conf. on
+                 Programming Language Design and Implementation
+                 ({PLDI})",
+  address =      "Las Vegas",
+  year =         1997,
+  pages =        "215--225",
+}
+
+
+@TechReport{TahaBenaissaSheard97,
+  author =       {Taha, Walid  and Benaissa, Zine-el-abidine and Sheard, Tim},
+  title =        {The essence of staged programming},
+  institution =  {OGI},
+  number =       {},
+  address =      "Portland",
+  year =         1997,
+  keywords =     "metaml"
+}
+
+@TechReport{Tarditi:90,
+  author =       "David Tarditi and Anurag Acharya and Peter Lee",
+  institution =  "School of Computer Science, Carnegie Mellon
+                 University",
+  title =        "No assembly required: Compiling Standard {ML} to {C}",
+  year =         1990,
+  url =          "ftp://dravido.soar.cs.cmu.edu/usr/nemo/sml2c/sml2c-techreport.ps",
+  number =       "CMU-CS-90-187",
+}
+
+@InProceedings{Thiemann:96,
+  title =        "Cogen in Six Lines",
+  author =       "Peter J. Thiemann",
+  pages =        "180--189",
+  booktitle =    "Proc. 1996 International
+                 Conf. on Functional Programming",
+  year =         1996,
+  address =      "Philadelphia",
+}
+
+@Article{Touretzky:89,
+  key =          "Touretzky \& Lee",
+  author =       "David S. Touretzky and Peter Lee",
+  title =        "Visualizing Evaluation in Applicative Languages",
+  journal =      "CACM",
+  year =         1992,
+  volume =       "35",
+  number =       "10",
+  pages =        "49--59",
+  OPTannote =    "7 references.",
+}
+
+
+@InProceedings{Volanschi:96,
+  author = 	 "Eugen-Nicolae Volanschi and Gilles Muller and Charles Consel",
+  title = 	 "Safe Operating System Specialization: the RPC Case Study",
+  booktitle = 	 "1st Workshop on Compiler Support for System Software (WCSSS'96)",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  year = 	 1996,
+  OPTorganization = {},
+  OPTpublisher = {},
+  address = 	 "Tuscon",
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{Waldinger:94,
+  author =       "Richard Waldinger and Michael Lowry",
+  title =        "{AMPHION}:  Towards kinder, gentler formal methods",
+  booktitle = "Proc. 1994 Monterey Workshop on Formal Methods",
+  year =         1994,
+  organization = "{U.S. Naval Postgraduate School}",
+}
+
+
+@InProceedings{SSP98,
+  author = 	 "Mark Shields and Tim Sheard and Simon L. {Peyton Jones}",
+  title = 	 "Dynamic Typing through Staged Type Inference",
+  booktitle = 	 "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  year = 	 1998,
+  OPTorganization = {},
+  pages = "289--302",
+}
+
+@InProceedings{HengleinMossin94,
+  author =  "Fritz Henglein and  Christian Mossin",
+  title  =   "Polymorphic Binding-Time Analysis", 
+  year =  1994,
+  pages = "287--301" ,
+  booktitle = "Programming Languages and Systems - ESOP\'94\, 5th 
+               European Symposium on Programming",
+  editor = "Donald Sannella",
+  volume =       "788",
+  publisher =    "Springer-Verlag",
+  series =       "Lecture Notes in Computer Science",
+  isbn = "ISBN 3-540-57880-3",
+  address = "Edinburgh",
+}
+@TechReport{Albano90,
+  author =       "A. Albano and A. L. Brown and A. Dearle and R. C. H.
+                 Connor and L. Fegaras and G. Ghelli and R. Hull and C.
+                 D. Marlin and F. Matthes and R. Morrison and R. Orsini
+                 and J. W. Schmidt and T. Sheard and D. Stemple",
+  title =        "Type Systems and Database Programming Languages",
+  institution =  "University of St Andrews",
+  number =       "CS/90/3",
+  year =         1990,
+}
+
+@Unpublished{CRML,
+  author = 	 "Tim Sheard",
+  title = 	 "Guide to using {CRML}, Compile-Time Reflective {ML}",
+  note = 	 "Available 
+                  \fr{http://www.cse.ogi.edu/\es{sheard}/CRML.html}",
+  OPTkey = 	 {},
+  year = 	 1993,
+  OPTannote = 	 {}
+}
+
+@TechReport{CSE-92-015,
+  author = 	 "James Hook and Dick Kieburtz and Tim Sheard",
+  title = 	 "Generating Programs by Reflection",
+  institution =  "Oregon Graduate Institute",
+  year = 	 1992,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "CSE-92-015",
+  OPTaddress = 	 {},
+  OPTnote = 	 {},
+  note  =        "Available from \cite{ogi-tr-site}",
+  OPTannote = 	 {}
+}
+@TechReport{CSE-93-018,
+  author = 	 "Tim Sheard",
+  title = 	 "Type Parametric Programming",
+  institution =  "Oregon Graduate Institute",
+  year = 	 1993,
+  note  =        "Available from \cite{ogi-tr-site}",
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "CSE-93-018",
+  OPTaddress = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+@TechReport{CSE-93-019,
+  author = 	 "James Hook and Tim Sheard",
+  title = 	 "A Semantics of Compile-time Reflection",
+  institution =  "Oregon Graduate Institute",
+  year = 	 1993,
+  OPTkey = 	 "Oregon Graduate Institute",
+  OPTtype = 	 {},
+  number = 	 "CSE 93-019",
+  OPTaddress = 	 {},
+  note  =        "Available from \cite{ogi-tr-site}",
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+@TechReport{CSE-94-032B,
+  author = 	 "Richard Kieburtz and
+                  Francoise Bellegarde and
+                  Jef Bell and
+                  James Hook and 
+                  Jeffrey Lewis and
+                  Dino Oliva and
+                  Tim Sheard and Lisa Walton and Tong Zhou",
+  title = 	 "Calculating Software Generators 
+                  from Solution Specifications",
+  institution =  "Oregon Graduate Institute",
+  year = 	 1994,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  note  =        "Available from \cite{ogi-tr-site}",
+  number = 	 "CSE-94-032B",
+  OPTaddress = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+@InProceedings{CMT00,
+  author       = {Calcagno, Cristiano and Moggi, Eugenio and Taha, Walid},
+  title =        "Closed Types as a Simple Approach to Safe Imperative Multi-Stage Programming",
+  booktitle =    "the International Colloquium on Automata, Languages, and
+  Programming {(ICALP '00)}",
+  year =         2000,
+  series =       LNCS,
+  volume =       1853,
+  pages =        "25--36",
+  address =      "Geneva",
+  publisher =    "Springer-Verlag",
+}
+
+@InProceedings{SBP99,
+  author =   "Sheard, Tim and Benaissa, Zine El-Abidine and Pa\v{s}ali\'{c}, Emir",
+  title =   "{DSL} Implementation Using Staging and Monads ",
+  booktitle = "2nd. Conf. on Domain-Specific Languages (DSL'99)",
+  year =   "1999",
+  address =   "Austin, Texas",
+}
+
+@Article{Sheard:1999:UMS,
+  author =       "T. Sheard",
+  title =        "Using {MetaML}: {A} Staged Programming Language",
+  journal =      "Lecture Notes in Computer Science",
+  volume =       "1608",
+  pages =        "207--239",
+  year =         "1999",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Mon Sep 13 16:57:02 MDT 1999",
+  acknowledgement = ack-nhfb,
+}
+
+@InProceedings{TBS98,
+  author       = {Taha, Walid and Benaissa, Zine-El-Abidine and Sheard, Tim},
+  title =        "Multi-Stage Programming: Axiomatization and Type-Safety",
+  booktitle =    "25th
+  International Colloquium on Automata, Languages, and
+  Programming {(ICALP)}",
+  year =         1998,
+  series =       LNCS,
+  volume =       1443,
+  pages =        "918--929",
+  address =      "Aalborg",
+}
+
+@TechReport{CSE-98-002,
+  author = 	 "Walid Taha and Zine-El-Abidine Benaissa and Tim Sheard",
+  title = 	 "Multi-Stage Programming:  Axiomatization and Type Safety",
+  institution =  "Oregon Graduate Institute",
+  year = 	 1998,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "CSE-98-002",
+  OPTaddress = 	 {},
+  OPTnote = 	 {},
+  note  =        "Available from \cite{ogi-tr-site}",
+  OPTannote = 	 {}
+}
+
+@InProceedings{Hornof1997,
+  title =        "Accurate Binding-Time Analysis for Imperative
+                 Languages: Flow, Context, and Return Sensitivity",
+  author =       "Luke Hornof and Jacques Noy{\'e}",
+  pages =        "63--73",
+  booktitle =    "Proc. Symposium on
+                 Partial Evaluation and Semantics-Based Program
+                 Manipulation",
+  year =         1997,
+  address =      "Amsterdam",
+  ISBN =         "ISBN 0-89791-917-3",
+  annote=        "Run-time code generation systems that 
+                  performs automatic BTA.  It is actually 
+                  preceded by both alias and side-effect
+                  analyses [to deal with effects]. 
+                  In general, Tempo is fully automated given user-supplied
+                  binding-time declarations of the program inputs, of course."
+}
+
+@InProceedings{Hornof1997B,
+  title =        "Effective specialization of realistic programs via use sensitivity",
+  author =       "Luke Hornof and Charles Consel and Jacques Noy{\'e}",
+  pages =        "293--314",
+  booktitle =    "SAS 1997",
+  year =         1997,
+  address =      "Paris",
+  ISBN =         {},
+  annote=        {}
+}
+
+@PhdThesis{HornofThesis,
+  author = 	 "Luke Hornof",
+  title = 	 "Static Analyses for the Effective 
+                  Specialization of Realistic Programs",
+  school = 	 "University of Rennes",
+  year = 	 1997,
+  OPTkey = 	 {},
+  address = 	 "France",
+  OPTtype = 	 {},
+  OPTnote = 	 {}, 
+  OPTannote = 	 {}
+}
+
+@PhdThesis{IB-B881033,
+  author =       "Timothy E. Sheard",
+  title =        "Proving the Consistency of Database Transactions",
+  address =      "Ann Arbor",
+  year =         1985,
+  descriptor =   "Automatisches Beweisen, Datenbankentwurf,
+                 Datenbanksystem, Formale Spezifikation, Integritaet,
+                 Logik, Relationenalgebra, Transaktion, Verifikation",
+}
+
+@InProceedings{Jones:96:whatnot,
+  author =       "Neil D. Jones",
+  year =         1996,
+  title =        "What Not to Do When Writing an Interpreter for
+                 Specialisation",
+  booktitle =    "Partial Evaluation",
+  editor =       "Olivier Danvy and Robert Gl{\"u}ck and Peter
+                 Thiemann",
+  publisher =    "Springer-Verlag",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "1110",
+  pages =        "216--237",
+  summary =      "",
+  semno =        "D-266",
+  puf =          "Artikel i proceedings (med censur)",
+  id =           "KonR",
+}
+
+@Article{Sheard:1991:AGU,
+  author =       "Tim Sheard",
+  title =        "Automatic Generation and Use of Abstract Structure
+                 Operators",
+  journal =      "ACM Transactions on Programming Languages and
+                 Systems",
+  volume =       "13",
+  number =       "4",
+  pages =        "531--557",
+  year =         1991,
+  coden =        "ATPSDT",
+  ISSN =         "0164-0925",
+  bibdate =      "Fri Jan 5 07:58:42 MST 1996",
+  url =          "http://www.acm.org/pubs/toc/Abstracts/0164-0925/115369.html",
+  acknowledgement = ack-nhfb # " and " # ack-pb,
+  keywords =     "algorithms; design; languages",
+  subject =      "{\bf D.3.3}: Software, PROGRAMMING LANGUAGES, Language
+                 Constructs and Features, Abstract data types. {\bf
+                 D.3.3}: Software, PROGRAMMING LANGUAGES, Language
+                 Constructs and Features, Recursion. {\bf D.1.1}:
+                 Software, PROGRAMMING TECHNIQUES, Applicative
+                 (Functional) Programming.",
+}
+
+@InProceedings{Hughes,
+  author =       "R.J.M. Hughes",
+  title =        "{Lazy memo-functions}",
+  booktitle =    "Functional Programming Languages and Computer
+                 Architecture",
+  publisher =    "Springer-Verlag LNCS 201",
+  pages =        "129--146",
+  year =         "1985",
+}
+
+@InProceedings{Cook,
+  title =        "Disposable memo Functions (Extended Abstract)",
+  author =       "Byron Cook and John Launchbury",
+  pages =        "310",
+  booktitle =    "Proc. 1997 International
+                 Conf. on Functional Programming",
+  year =         "1997",
+  address =      "Amsterdam, The Netherlands",
+}
+
+@TechReport{Stemple92a,
+  author =       "D. Stemple and R. B. Stanton and T. Sheard and P.
+                 Philbrow and R. Morrison and G. N. C. Kirby and L.
+                 Fegaras and R. L. Cooper and R. C. H. Connor and M. P.
+                 Atkinson and S. Alagic",
+  title =        "Type-Safe Linguistic Reflection: {A} Generator
+                 Technology",
+  institution =  "ESPRIT BRA Project 3070 FIDE",
+  number =       "FIDE/92/49",
+  year =         1992,
+  url =          "http://www-ppg.dcs.st-and.ac.uk/Publications/1992.html#linguistic.reflection",
+  abstract =     "Reflective systems allow their own structures to be
+                 altered from within. In a programming system reflection
+                 can occur in two ways: by a program altering its own
+                 interpretation or by it changing itself. Reflection has
+                 been used to facilitate the production and evolution of
+                 data and programs in database and programming language
+                 systems. This paper is concerned with a particular
+                 style of reflection, called linguistic reflection, used
+                 in compiled, strongly typed languages. Two major
+                 techniques for this have evolved: compile-time
+                 reflection and run-time reflection. These techniques
+                 are described together with a definition and anatomy of
+                 reflective systems using them. Two illustrative
+                 examples are given and the uses of type-safe reflective
+                 techniques in a database programming language context
+                 are surveyed. These include attaining high levels of
+                 genericity, accommodating changes in systems,
+                 implementing data models, optimising implementations
+                 and validating specifications.",
+}
+@TechReport{TRPL,
+  author = 	 "Tim Sheard",
+  title = 	 "A user's guide to {TRPL}, A compile-time reflective programming                   language",
+  institution =  "Dept. of Computer and Information Science,
+                  University of Massachusetts",
+  year = 	 1990,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "COINS 90-109",
+  OPTaddress = 	 "Amherst",
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{Clinger:91,
+  author =       "William Clinger and Jonathan Rees",
+  title =        "Macros That Work",
+  pages =        "155--162",
+  ISBN =         "0-89791-419-8",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  address =      "Orlando",
+  year =         1991,
+  publisher =    ACM,
+}
+
+@Book{SML,
+  author =       "Robin Milner and Mads Tofte and Robert Harper and
+                 David MacQueen",
+  year =         1997,
+  title =        "The {Definition} of {Standard ML} (Revised)",
+  publisher =    "MIT Press",
+}
+@Book{Curry:Feys:58,
+  author =       "Haskell Brookes Curry and Robert Feys",
+  title =        "Combinatory Logic, Volume {I}",
+  series =       "Studies in Logic and the Foundations of Mathematics",
+  publisher =    "North-Holland",
+  address =      "Amsterdam",
+  year =         1958,
+  pages =        "xvi+417",
+  comments =     "with two sections by William Craig",
+  note =         "Second printing 1968",
+  callno =       "510.1 C97c",
+  checked =      "19 January 1986",
+}
+
+@Book{DiCosmo95,
+  author =       "Roberto {Di~Cosmo}",
+  title =        "Isomorphisms of Types: from $\lambda$-calculus to
+                  information retrieval and language design",
+  publisher =    {Birkh\"{a}user},
+  year =         1995,
+  OPTkey =       {},
+  OPTeditor =    "Ronald V. Book",
+  OPTvolume =    {},
+  OPTnumber =    {},
+  series =       "Progress in Theoretical Computer Science",
+  OPTaddress =   {},
+  OPTedition =   {},
+  OPTnote =      {},
+  OPTannote =    {}
+}
+@TechReport{Sheard:95:Generators,
+  author = 	 "Tim Sheard and Neal Nelson",
+  title = 	 "Type safe abstractions using program generators",
+  institution =  "Oregon Graduate Institute",
+  year = 	 1995,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "CSE-95-013",
+  OPTaddress = 	 "",
+  OPTnote = 	 {},
+  note  =        "Available from \cite{ogi-tr-site}",
+  OPTannote = 	 {}
+}
+
+@Book{Aho:86:Compilers, 
+ author
+     =
+      "Alfred V. Aho and Ravi Sethi and Jeffrey D. Ullman", 
+ title
+     =
+      "Compilers Principles, Techniques, and Tools", 
+ publisher
+     =
+      "Addison Wesley", 
+ ISBN
+     =
+      "0-201-10194-7", 
+ year
+     =
+      1986, 
+ reffrom
+     =
+      "Lipton:Snyder:fdopc:1978", 
+ reffrom
+     =
+      "Cardelli:acm:lfp:1984", 
+ reffrom
+     =
+      "Shyu:acm:sigplan:1986", 
+ reffrom
+     =
+      "Karinthi:Weiser:iait:1987", 
+ reffrom
+     =
+      "Koskimies:Paakki:iait:1987", 
+ reffrom
+     =
+      "Offutt:King:iait:1987", 
+ reffrom
+     =
+      "Norman:acm:lfp:1988", 
+ reffrom
+     =
+      "Mossenbock:spe:1988", 
+ reffrom
+     =
+      "Consel:esop:1988", 
+ reffrom
+     =
+      "Jones:acm:sigplan:1988", 
+ reffrom
+     =
+      "Paakki:acm:sigplan:1988", 
+ reffrom
+     =
+      "Snelting:acm:sigplan:1990", 
+ reffrom
+     =
+      "vanHorebeek:Lewi:acm:sigplan:1990", 
+ reffrom
+     =
+      "Dobler:Pirklbauer:acm:sigplan:1990", 
+ reffrom
+     =
+      "Burshtenyn:acm:sigplan:1990", 
+ reffrom
+     =
+      "Berlin:Wise:ieee:c:1990", 
+ reffrom
+     =
+      "Hanson:acm:lfp:1990", 
+ reffrom
+     =
+      "Consel:acm:lfp:1990", 
+ reffrom
+     =
+      "Rosendahl:agata:1990", 
+ reffrom
+     =
+      "Augusteijn:agata:1990", 
+ reffrom
+     =
+      "Smesters:Nocker:vanGronigen:Plasmeijer:fplca:1991", 
+ reffrom
+     =
+      "Mauny:deRauglaudre:acm:lfp:1992", 
+ reffrom
+     =
+      "Nielson:Nielson:acm:lfp:1992", 
+ reffrom
+     =
+      "Flanagan:Sabry:Duba:Felleisen:acm:pldi:1993", 
+ reffrom
+     =
+      "Baker:acm:om:1993", 
+
+} 
+
+@Article{Gomard:91:Untyped, 
+ author
+     =
+     "Carsten K. Gomard and Neil D. Jones", 
+ title
+     =
+     "A Partial Evaluator for untyped lambda calculus", 
+ journal
+     =
+     "Journal of Functional Programming", 
+ volume
+     =
+     "1", 
+ number
+     =
+     "1", 
+ pages
+     =
+     "21--69", 
+ year
+     =
+     1991, 
+ reffrom
+     =
+     "Bondorf:acm:lfp:1992", 
+
+} 
+@InProceedings{Hatcliff:96:Reasoning,
+ author
+     =
+      "John Hatcliff and Robert Gl{\"u}ck", 
+ year
+     =
+      1996, 
+ title
+     =
+      "Reasoning about hierarchies of online specialization systems", 
+ booktitle
+     =
+      "Partial Evaluation", 
+ editor
+     =
+      "Olivier Danvy and Robert Gl{\"u}ck and Peter Thiemann", 
+ publisher
+     =
+      "Springer-Verlag", 
+ series
+     =
+      "Lecture Notes in Computer Science", 
+ volume
+     =
+      "1110", 
+ pages
+     =
+      "161--182", 
+ keywords
+     =
+      "program specialization, program transformation, metacomputation, metasystem transition", 
+ summary
+     =
+      "We present the language S-Graph-n --- the core of a multilevel metaprogramming environment for exploring foundational issues of self-applicable online program specialization. We
+      illustrate how special-purpose S-Graph-n primitives can be used to obtain an efficient and conceptually simple encoding of programs as data objects. The key feature of the encoding scheme is the
+      use of numerical indices which indicate the number of times that a program piece has been encoded. Evaluation of S-Graph-n is formalized via an operational semantics. This semantics is used to
+      justify the fundamental operations on metavariables --- special-purpose tags for tracking unknown values in self-applicable online specialization systems. We show how metavariables can be
+      used to construct biased generating extensions without relying on a separate binding-time analysis phase.", 
+ semno
+     =
+      "D-269", 
+ puf
+     =
+      "Artikel i proceedings (med censur)", 
+ id
+     =
+      "KonR", 
+
+} 
+
+@InProceedings{Meijer1991:Bananas, 
+ author
+       =
+        "E. Meijer and M. M. Fokkinga and R. Paterson", 
+ booktitle
+       =
+        "Functional Programming and Computer Architecture", 
+ title
+       =
+        "Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire", 
+ year
+       =
+        1991, 
+ abstract-url
+       =
+        "http://hydra.cs.utwente.nl/~fokkinga/mmf91m.html", 
+ pages
+       =
+        "124--144", 
+ publisher
+       =
+        "Springer-Verlag", 
+ scope
+       =
+        "trans", 
+
+} 
+@InProceedings{Meijer:95:Exponential, 
+ author
+       =
+        "Erik Meijer and Graham Hutton", 
+ title
+       =
+        "Bananas in Space: Extending Fold and Unfold to Exponential Types", 
+ booktitle
+       =
+        "Proc. International Conf. on Functional Programming Languages and Computer Architecture (FPCA)", 
+ address
+       =
+        "La Jolla", 
+ organization
+       =
+        "ACM SIGPLAN/SIGARCH and IFIP WG2.8", 
+ publisher
+       =
+        ACM, 
+ url
+     =
+      "http://www.cs.nott.ac.uk/Department/Staff/gmh/bananas.ps", 
+ year
+       =
+        1995, 
+ pages
+       =
+        "324--333", 
+
+} 
+@Article{Mogensen:92:Efficient, 
+ semno
+     =
+      "D-101", 
+ author
+     =
+      "Torben {\AE}. Mogensen", 
+ title
+     =
+      "Efficient Self-Interpretation in Lambda Calculus", 
+ journal
+     =
+      "Functional Programming", 
+ year
+     =
+      1992, 
+ volume
+     =
+      "2", 
+ number
+     =
+      "3", 
+ pages
+     =
+      "345--364", 
+ summary
+     =
+      "A compact representation of $\lambda$-terms in pure lambda calculus is presented and it is shown that this gives possibility for efficient self-interpretation and self-reduction. The
+      representation also gives an efficient construction of the second recursion theorem. Proofs or proof outlines are given of all constructions.", 
+ keywords
+     =
+      "lambda calculus, representation, self-interpretation, second recursion theorem, self-reduction", 
+
+} 
+@InProceedings{Nielson:95:Correctness, 
+ author
+     =
+      "Flemming Nielson", 
+ title
+     =
+      "Correctness of code generation from a two-level meta-language", 
+ pages
+     =
+      "30--40", 
+ ISBN
+     =
+      "3-540-16442-1", 
+ editor
+     =
+      "B. Robinet and R. Wilhelm", 
+ booktitle
+     =
+      "Proc. European Symposium on Programming ({ESOP} 86)", 
+ address
+     =
+      "Saarbr{\"u}cken", 
+ year
+     =
+      1986, 
+ series
+     =
+      LNCS, 
+ volume
+     =
+      "213", 
+ publisher
+     =
+      "Springer", 
+
+} 
+@InCollection{Nielson89,
+  author =       "Flemming Nielson",
+  editor =       "K. Odijk and M. Rem and J.-C. Syre",
+  title =        "The Typed $\lambda$-Calculus with First-Class
+                 Processes",
+  booktitle =    "PARLE '89: Parallel Languages and Architectures
+                 Europe, volume 1",
+  pages =        "357--373",
+  publisher =    "Springer-Verlag",
+  address =      "New York",
+  year =         1989,
+  keywords =     "lambda calculus CCS CSP functional",
+  abstract =     "The author extends the typed lambda-calculus with CCS-
+                 or CSP-like processes and allows these to be
+                 first-class citizens just as functions are first-class
+                 citizend in functional languages. The main novel
+                 feature of the language is the use of types to record
+                 the communication possibilities possessed by processes
+                 and in this we give up the causality between
+                 communications, i.e. the types do not model whether or
+                 not one communication may takeplace before another. In
+                 analogy with the semantics of the lambda-calculus, and
+                 of CCS, we develop a structural operational semantics
+                 for the language. We then prove that the operational
+                 semantics preserves the types and we use this to give
+                 examples of `errors' that cannot arise for well-typed
+                 programs.",
+  note =         "Lecture Notes in Computer Science 365.",
+}
+ 
+@InCollection{Nielson87,
+  author =       "Flemming Nielson",
+  title =        "A formal type system for comparing partial
+                 evaluators",
+  editor =       "D Bj{\o}rner and Ershov and Jones",
+  booktitle =    "Proc. workshop on Partial Evaluation and
+                 Mixed Computation (1987)",
+  pages =        "349--384",
+  publisher =    "North-Holland",
+  year =         1988,
+}
+@InProceedings{PeytonJones:91:Unboxed, 
+ author
+         =
+         "Simon L. {Peyton Jones} and John Launchbury", 
+ booktitle
+         =
+         "Functional Programming and Computer Architecture", 
+ title
+         =
+         "Unboxed values as first class citizens in a non-strict functional language", 
+ year
+         =
+         1991, 
+ document-size
+         =
+         "96.9 kbytes", 
+ url
+         =
+         "ftp://ftp.dcs.gla.ac.uk/pub/glasgow-fp/papers/unboxed-values.ps.Z", 
+ scope
+         =
+         "implemen", 
+
+} 
+
+@Book{Tennent:91:Semantics, 
+ author
+     =
+      "Robert D. Tennent", 
+ title
+     =
+      "Semantics of Programming Languages", 
+ publisher
+     =
+      "Prentice Hall", 
+ address
+     =
+      "New York", 
+ year
+     =
+      1991, 
+ pages
+     =
+      "7", 
+ ISBN
+     =
+      "0-13-805607-2 (hardcover) 0-13-805599-8 (paperback)", 
+ callno
+     =
+      "QA76.7.T473", 
+ checked
+     =
+      "13 August 1992", 
+
+}
+
+@Book{Quine:71:LPV,
+  author = 	 "Willard van Orman Quine",
+  title = 	 "From a Logical Point of View",
+  publisher = 	 "Harper \& Row",
+  year = 	 1971,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  series = 	 "Logic-Philosphical Essays",
+  OPTaddress = 	 {},
+  edition = 	 "Second, revised",
+  OPTannote = 	 {}
+}
+
+@Book{WhiteheadRussell:Principia,
+  author =       "Alfred North Whitehead and Bertrand Russell",
+  title =        "Principia Mathematica",
+  publisher =    "Cambridge University Press",
+  address =      "Cambridge",
+  year =         1925,
+}
+
+@Book{quine:1963a,
+  author =       "Willard van Orman Quine",
+  title =        "Set Theory and Its Logic",
+  publisher =    "Harvard University Press",
+  year =         1963,
+  address =      "Cambridge",
+}
+@Book{Quine:51:ML,
+  author = 	 "Willard van Orman Quine",
+  title = 	 "Mathematical Logic",
+  publisher = 	 "Harvard University Press",
+  year = 	 1951,
+  OPTkey = 	 {},
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  edition = 	 "Revised",
+  note = 	 "First published in 1940 by Norton",
+  OPTannote = 	 {}
+}
+
+@PhdThesis{Schmidt81,
+  author =       "D. A. Schmidt",
+  title =        "Compiler Generation from Lambda Calculus Definitions
+                 of Programming Languages",
+  school =       "Kansas State University",
+  type =         "Ph.{D}. Thesis",
+  address =      "Manhattan",
+  year =         1981,
+  keywords =     "functional",
+}
+@InProceedings{Mosses76,
+  author =       "P. D. Mosses",
+  title =        "Compiler Generation Using Denotational Semantics",
+  pages =        "436--441",
+  ISBN =         "3-540-07854-1",
+  editor =       "A. Mazurkiewicz",
+  booktitle =    "Proc. 5th Symposium on Mathematical
+                 Foundations of Computer Science",
+  address =      "Gda{\'n}sk",
+  year =         1976,
+  series =       LNCS,
+  volume =       "45",
+  publisher =    "Springer",
+}
+@PhdThesis{Palsberg92,
+  author =       "Jens Palsberg",
+  title =        "Provably Correct Compiler Generation",
+  year =         1992,
+  school =       "Department of Computer Science, University of Aarhus",
+  note =         "xii+224 pages",
+  annote =       "We have designed , implemented, and proved the
+                 correctness of a compiler generator that accepts action
+                 semantic descriptions of imperative programming
+                 languages. We have used it to generate compilers for
+                 both a toy language and a non-trivial subset of Ada.
+                 The generated compliers emit absolute code for an
+                 abstract RISC machine language that is assembled into
+                 code for the SPARC and the HP Precision Architecture.
+                 The generated code is an order of magnitude better than
+                 that produced by compilers generated by the classical
+                 systems of Mosses, Paulson, and Wand. Our machine
+                 language needs no runtime type-checking and is thus
+                 more realistic than those considered in previous
+                 compiler proofs. We use solely algebraic
+                 specifications; proofs are given in the initial model.
+                 The use of action semantics makes the processable
+                 language specification easy to read and pleasant to
+                 work with. We view our compiler generator as the first
+                 step towards user-friendly and automatic generation of
+                 realistic and provably correct compilers.",
+  keywords =     "action semantics",
+  available =    "Aarhus: DAIMI PB-422",
+}
+@Book{Lee89,
+  author =       "Peter Lee",
+  title =        "Realistic Compiler Generation",
+  year =         1989,
+  publisher =    "MIT Press",
+  series =       "Foundations of Computing Series",
+  annote =       "This book is based on {\em High-Level Semantics\/},
+                 which is essentially a variant of action semantics,
+                 especially suited to the purposes of compiler
+                 generation for conventional programming languages.",
+  keywords =     "action semantics",
+}
+@Book{Tofte90,
+  semno =        "D-85",
+  author =       "Mads Tofte",
+  title =        "Compiler Generators - What They Can Do, What They
+                 Might Do and What They Probably Never Do",
+  publisher =    "Springer-Verlag",
+  year =         1990,
+  volume =       "19",
+  summary =      "Contains a description of the CERES Compiler Generator
+                 and other systems. CERES was developed by Neil Jones
+                 and Mads Tofte.",
+  keywords =     "compiler generation, CERES",
+}
+@Proceedings{Jones80,
+  editor =       "Neil D. Jones",
+  title =        "Proceedings of a Workshop on Semantics-Directed
+                 Compiler Generation",
+  booktitle =    "Proceedings of a Workshop on Semantics-Directed
+                 Compiler Generation",
+  publisher =    "Springer Verlag",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "94",
+  year =         1980,
+  reffrom =      "Hannan:Miller:acm:lfp:1990",
+}
+@Book{Paulson,
+  author =       "Larry Paulson",
+  edition =      "Second",
+  publisher =    "Cambridge University Press",
+  title =        "{ML} for the Working Programmer",
+  year =         1992,
+}@Book{Reade89,
+  key =          "Reade",
+  author =       "Chris Reade",
+  title =        "Elements of Functional Programming",
+  publisher =    "Addison-Wesley",
+  year =         1989,
+  series =       "International Computer Science Series",
+  address =      "Wokingham",
+}@InCollection{Paulson84,
+  author =       "Lawrence Paulson",
+  title =        "Compiler Generation from Denotational Semantics",
+  editor =       "B. Lorho",
+  booktitle =    "Methods and Tools for Compiler Construction",
+  publisher =    "Cambridge University Press",
+  year =         1984,
+  pages =        "219--250",
+  reffrom =      "Rosendahl:agata:1990",
+}
+@InProceedings{wand84,
+  author =       "M. Wand",
+  title =        "From Interpreter to Compiler: {A} Representational
+                 Derivation",
+  booktitle =    "Programs as Data Objects",
+  editor =       "H. Ganzinger and N. D. Jones",
+  organization = "Springer-Verlag LNCS, Vol. 217",
+  pages =        "306--324",
+  year =         1984,
+}
+@Article{Clinger84,
+  author =       "William Clinger",
+  year =         1984,
+  journal =      "Conf. Record of the 1984 ACM Symposium on {LISP}
+                 and Functional Programming",
+  pages =        "356--364",
+  title =        "The {S}cheme 311 compiler: An Exercise in Denotational
+                 Semantics",
+}
+
+@Article{Cohen85,
+  key =          "Cohen",
+  author =       "Jacques Cohen",
+  title =        "Describing Prolog by Its Interpretation and
+                 Compilation",
+  journal =      "CACM",
+  volume =       "28",
+  number =       "12",
+  year =         1985,
+  pages =        "1311--1324",
+  annote =       "Overview of Prolog. Good bibliography. 47
+                 references.",
+}
+
+@Book{McKeeman70,
+  key =          "McKeeman \& Horning \& Wortman",
+  author =       "William M. McKeeman and James J. Horning and David B.
+                 Wortman",
+  title =        "A Compiler Generator",
+  publisher =    "Prentice-Hall",
+  year =         1970,
+  address =      "Englewood Cliffs",
+  annote =       "44 refrences.",
+}
+@InProceedings{Hilsdale95,
+  author =       "E. Hilsdale and J. M. Ashley and R. K. Dybvig and D.
+                 P. Friedman",
+  title =        "Compiler construction using {S}cheme",
+  series =       LNCS,
+  volume =       "1022",
+  pages =        "251--??",
+  year =         1995,
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Sat May 11 13:45:32 MDT 1996",
+  acknowledgement = ack-nhfb,
+}
+@InProceedings{Lori85,
+  author =       "Lori L. Pollock and Mary Lou Soffa",
+  title =        "Incremental Compilation of Optimized Code",
+  pages =        "152--164",
+  ISBN =         "0-89791-147-4",
+  editor =       "Brian K. Reid",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  address =      "New Orleans",
+  year =         1985,
+  publisher =    ACM,
+}
+@InProceedings{Cheatham94,
+  author =       "T. Cheatham",
+  title =        "Models, Languages, and Compiler Technology for High
+                 Performance Computers",
+  series =      LNCS,
+  volume =       "841",
+  pages =        "3--??",
+  year =         1994,
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Mon May 13 11:52:14 MDT 1996",
+  acknowledgement = ack-nhfb,
+}
+
+@InProceedings{TH98,
+  author = 	 "Walid Taha and Jim Hook",
+  title = 	 "The Anatomy of a Component Generation System",
+  booktitle = 	 "International Workshop on the Principles of 
+                  Software Evolution",
+  address = 	 "Kyoto",
+  year =         1998,
+}
+
+@Article{TS00,
+author =       "Walid Taha and Tim Sheard",
+title =        "{MetaML}:  Multi-Stage Programming with Explicit 
+                Annotations",
+journal =      "Theoretical Comp. Sci.",
+year =         "2000",
+volume =       248,
+number =       "1-2",
+}
+
+@Article{Partsch83,
+  author =       "H. Partsch and R. Stein Brueggen",
+  title =        "Program Transformation Systems",
+  journal =      "ACM Computing Surveys",
+  year =         1983,
+  volume =       "15",
+  number =       "3",
+  pages =        "199--237",
+  annote =       "My favorite. :) (WT)  [R-2]"
+}
+
+@Book{Smith96,
+  author = 	 "Brian Cantwell Smith",
+  title = 	 "On The Origin of Objects",
+  publisher = 	 "MIT Press",
+  year = 	 1996,
+}
+
+
+@Article{Betz:1994,
+  author =       "Mark Betz",
+  title =        "Interoperable objects",
+  journal =      "Dr. Dobb's Journal of Software Tools",
+  volume =       "19",
+  number =       "11",
+  pages =        "18--20, 24--26, 28, 32, 34, 36--39",
+  year =         1994,
+  coden =        "DDJOEB",
+  ISSN =         "1044-789X",
+  bibdate =      "Thu Jan 9 09:35:43 MST 1997",
+  abstract =     "If the next great battle in the computing wars
+                 revolves around interoperable (or component) objects,
+                 you'd beeter know who the combatants are and what their
+                 arsenals hold. Mark analyzes the specification and
+                 proposals, ranging from CORBA and SOM DSOM to COM and
+                 OpenDoc.",
+  acknowledgement = ack-nhfb,
+  classification = "722.4; 723.1; 723.2; 723.5; 722.2; 723.1.1; C6150N
+                 (Distributed systems); C6110J (Object-oriented
+                 programming)",
+  journalabr =   "Dr Dobb's J Software Tools Prof Program",
+  keywords =     "C (programming language); COM; Compound documents;
+                 Computer architecture; Computer hardware; Computer
+                 hardware description languages; Computer networks;
+                 Computer operating systems; Computer simulation;
+                 Computer-industry battleground; Computing wars; CORBA;
+                 Data structures; Distributed computer systems;
+                 Distributed object computing; Distributed objects;
+                 Distributed processing; Distributed-object computing;
+                 Interfaces (computer); Interoperable objects; Large
+                 scale systems; Object models; Object oriented
+                 programming; Object oriented software; OpenDoc;
+                 Personal computers; Proposals; SOM/DSOM;
+                 Specifications",
+  thesaurus =    "Distributed processing; Object-oriented methods;
+                 Object-oriented programming; Open systems",
+}
+@Article{Morgan:1998,
+  author =       "Bryan Morgan",
+  title =        "Building Distributed Applications with {Java} and
+                 {CORBA}",
+  journal =      "Dr. Dobb's Journal of Software Tools",
+  volume =       "23",
+  number =       "4",
+  pages =        "94, 96--99, 104--105",
+  year =         1998,
+  coden =        "DDJOEB",
+  ISSN =         "1044-789X",
+  bibdate =      "Fri Mar 6 18:42:46 MST 1998",
+  url =          "http://www.ddj.com/ftp/1998/1998_04/corbajav.txt;
+                 http://www.ddj.com/ftp/1998/1998_04/corbajav.zip",
+  abstract =     "Bryan examines the concepts behind CORBA-based
+                 development using Borland's JBuilder and Visigenic's
+                 VisiBroker for Java. Additional resources include
+                 corbajav.txt (listings) and corbajav.zip (source
+                 code).",
+  acknowledgement = ack-nhfb,
+}
+
+
+@Article{Adler95,
+  key =          "adler95a",
+  author =       "Richard M. Adler",
+  title =        "Emerging Standards For Component Software",
+  journal =      "IEEE Computer",
+  year =         1995,
+  volume =       "28",
+  number =       "3",
+  pages =        "68--77",
+  abstract =     "Component software benefits include reusability and
+                 interoperability, among others. What are the
+                 similarities and differences between the competing
+                 standards for this new technology, and how will they
+                 interoperate? Object-oriented technology is steadily
+                 gaining acceptance for commercial and custom
+                 application development through programming languages
+                 such as C++ and Smalltalk, object oriented CASE tools,
+                 databases, and operating systems such as Next
+                 Computer's NextStep. Two emerging technologies, called
+                 compound documents and component software, will likely
+                 accelerate the spread of objectoriented concepts across
+                 system-level services, development tools, and
+                 application-level behaviours. Tied closely to the
+                 popular client/server architecture for distributed
+                 computing, compound documents and component software
+                 define object-based models that facilitate interactions
+                 between independent programs. These new approaches
+                 promise to simplify the design and implementation of
+                 complex software applications and, equally important,
+                 simplify human-computer interactive work models for
+                 application end users. Following unfortunate tradition,
+                 major software vendors have developed competing
+                 standards to support and drive compound document and
+                 component software technologies. These incompatible
+                 standards specify distinct object models, data storage
+                 models, and application interaction protocols. The
+                 incompatibilities have generated confusion in the
+                 market, as independent software vendors, system
+                 integrators, in-house developers, and end users
+                 struggle to sort out the standards' relative merits,
+                 weaknesses, and chances for commercial success. Let's
+                 take a look now at the general technical concepts
+                 underlying compound documents and component software.
+                 Then we examine the OpenDoc, OLE 2, COM, and CORBA
+                 standards being proposed for these two technologies.
+                 Finally, we'll review the work being done to extend the
+                 standards and to achieve interoperability across them
+                 (10 Refs.)",
+}
+@InProceedings{TS97B,
+  author =       "Walid Taha and Tim Sheard",
+  title =        "Multi-stage programming",
+  pages =        "321--321",
+  ISSN =         "0362-1340",
+  booktitle =    "Proc. International
+                 Conf. on Functional Programming ({ICFP})",
+  series =       "ACM SIGPLAN Notices",
+  volume =       "32,8",
+  publisher =    ACM,
+  address =      "New York",
+  year =         1997,
+}
+
+@InCollection{Gentzen35,
+  author =       "Gerhard Gentzen",
+  title =        "Investigations into Logical Deductions, 1935",
+  booktitle =    "The Collected Papers of Gerhard Gentzen",
+  editor =       "M. E. Szabo",
+  publisher =    "North-Holland Publishing Co.",
+  address =      "Amsterdam",
+  year =         1969,
+  pages =        "68--131",
+}
+
+@PhdThesis{Sitaram:92,
+  author =       "Dorai Sitaram",
+  title =        "Models of Control and Their Implications for
+                 Programming Language Design",
+  school =       "Rice University",
+  pages =        "166",
+  year =         1994,
+  refs =         "54",
+  url =          "ftp://cs.rice.edu/public/languages/thesis-sitaram.dvi.Z",
+  url =          "ftp://cs.rice.edu/public/languages/thesis-sitaram.ps.Z",
+}
+
+@Article{Bal81,
+  author = 	 "R. Balzer",
+  title = 	 "Transformational Implementation: an Example",
+  journal = 	 "IEEE Transactions on Software Engineering",
+  year = 	 1981,
+  volume = 	 7,
+  number = 	 1,
+}
+
+@InProceedings{Bal92,
+  author = 	 "R. Balzer",
+  title = 	 "Design Refinement in DSSAs",
+  booktitle = 	 "Proc. JSGCC Software 
+                  Initiative Strategy Workshop",
+  year = 	 1992,
+}
+
+@InProceedings{BH+94,
+  author = 	 "J. Bell and F. Bellegarde and J. Hook and et~al.",
+  title = 	 "Software Design for Reliability and Reuse: 
+                  A Proof-of-Concept Demonstration",
+  booktitle = 	 "Proceedings of TRI-Ada'94",
+  year = 	 1994,
+  pages = 	 "396--404"
+}
+
+@Article{BST+94,
+  author = 	 "D. Batory and V. Singhal and J. Thomas and 
+                  S. Dasari and B. Geraci and M. Sirkin",
+  title = 	 "The GenVoca Model of Software-System Generators",
+  journal = 	 "IEEE Software",
+  year = 	 1994,
+}
+
+@TechReport{GLM+97,
+  author = 	 "G. Kiczales and J. Lamping and A. Mendhekar
+                  and C. Maeda and C. Lopes and J. Loingtier and J. Irwin",
+  title = 	 "Aspect Oriented Programming",
+  institution =  "PARC",
+  year = 	 1997,
+}
+
+@TechReport{[Jon75,
+  author = 	 "S. Johnson",
+  title = 	 "YACC --- Yet Another Compiler-Compiler",
+  institution =  "Bell Laboratories",
+  year = 	 1997,
+  number = 	 "32"
+}
+
+@InProceedings{[KMB96,
+  author = 	 "R. Kieburtz and L. Mckinney and J. Bell and 
+                  J. Hook and  A. Kotov and J. Lewis and
+                  D. Oliva and  T. Sheard and I. Smith and L. Walton",
+  title = 	 "A Software Engineering Experiment in Software 
+                  Component Generation",
+  booktitle = 	 "Proceedings of 18th International Conf. 
+                  on Software Engineering",
+  year = 	 1996,
+  publisher =    "IEEE Computer Society Press",
+  address = 	 "Berlin",
+}
+
+@InProceedings{LB95,
+  author = 	 "M. Lowry and J. van Baalen",
+  title = 	 "Meta-Amphion: Synthesis of Efficient 
+                  Domain-Specific Program Synthesis Systems",
+  booktitle = 	 "Proceedings  of 10th Knowledge-Based 
+                  Software Engineering Conf.",
+  year = 	 1995,
+  address = 	 "Boston",
+  pages = 	 "2--10"
+}
+
+
+@InProceedings{Jones:88,
+  author =       "Neil D. Jones",
+  title =        "Challenging Problems in Partial Evaluation and Mixed
+                 Computation",
+  booktitle =    "Partial Evaluation and Mixed Computation",
+  year =         "1988",
+  semno =        "D-26",
+  editor =       "D. Bj{\o}rner and A. P. Ershov and N. D. Jones",
+  pages =        "1--14",
+  organization = "IFIP World Congress Proceedings",
+  publisher =    "Elsevier Science Publishers B.V.",
+  address =      "North-Holland",
+  summary =      "After a discussion of the state of the art in this
+                 field, a list of challenging problems for future
+                 research is presented.",
+  keywords =     "partial evaluation, mixed computation, program
+                 specialization",
+}
+
+@InProceedings{MKS97,
+  author = 	 "A. Misra and G. Karsai and J. Sztipanovits and 
+                  A. Ledeczi and M. Moore and E. Long",
+  title = 	 "A Model-Integrated Information System for Increasing
+                  Throughput in Discrete Manufacturing",
+  booktitle = 	 "Proceeding of the Engineering of Computer 
+                  Based Systems (ECBS) Conf.",
+  year = 	 1997,
+  address = 	 "Monterey",
+}
+
+@Article{PW92,
+  author = 	 "D. Perry and A. Wolf",
+  title = 	 "Foundations for the Study of Software
+                  Architecture",
+  journal = 	 "ACM SIGSOFT Software Engineering Notes",
+  year = 	 1992,
+  OPTkey = 	 {},
+  volume = 	 "17",
+  number = 	 "4",
+  OPTpages = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{Distil,
+  author = 	 "Yannis Smaragdakis and Don Batory",
+  title = 	 "{DiSTiL}: A Transformation Library for Data Structures",
+  booktitle = 	 "USENIX Conf. on Domain-Specific Languages",
+  year = 	 1997,
+}
+
+@InProceedings{SJ94,
+  author = 	 "Y. Srinivas and R. Jullig",
+  title = 	 "SpecWare: Formal Support for Composing Software",
+  booktitle = 	 "Proc. Conf. on Mathematics of
+                  Program Construction",
+  year = 	 1995,
+  address = 	 "Kloster Irsee",
+  note = 	 "Also Kestrel Institute Technical Report KES.U.94.5."
+}
+
+@Article{Smi90,
+  author = 	 "Doug Smith",
+  title = 	 "{KIDS}: A Semi-Automatic Program Development System",
+  journal = 	 "IEEE Transactions on Software Engineering --- 
+                  Special Issue on Formal Methods",
+  year = 	 1990,
+  volume = 	 "16",
+  number = 	 "9",
+}
+
+@TechReport{TahaFacets97,
+  author = 	 "Walid Taha and Tim Sheard",
+  title = 	 "Facets of Multi-Stage Computation in
+                  Software Architectures",
+  institution =  "Oregon Graduate Institute",
+  year = 	 1997,
+  number = 	 "CSE-97-010",
+  note  =        "Available from \cite{ogi-tr-site}",
+}
+
+@TechReport{Wil81,
+  author = 	 "D. Wile",
+  title = 	 "POPART: Producer of Parsers and Related Tools. System
+                  Builders' Manual",
+  institution =  "USC Information Sciences Institute",
+  year = 	 1981
+}
+
+@Article{Wil90,
+  author = 	 "D. Wile",
+  title = 	 "Adding Relational Abstraction to Programming
+                  Languages",
+  journal = 	 "ACM SIGSOFT Software Engineering Notes",
+  year = 	 1990,
+  volume = 	 "15",
+  number = 	 "4",
+  pages = 	 "128--139"
+}
+
+@InProceedings{PfenningElliott88,
+  author =       "Frank Pfenning and Conal Elliott",
+  title =        "Higher-Order Abstract Syntax",
+  booktitle =    "Proc. Symposium on
+                 Language Design and Implementation",
+  address =      "Atlanta",
+  year =         1988,
+  pages =        "199--208",
+  urlps =        "http://www.cs.cmu.edu/~fp/papers/pldi88.ps.gz",
+  keywords =     "lambda-Prolog",
+}
+
+@Article{Takahashi,
+  title =        "Parallel Reductions in {$\lambda$}-Calculus",
+  author =       "Masako Takahashi",
+  pages =        "120--127",
+  journal =      "Information and Computation",
+  year =         1995,
+  volume =       "118",
+  number =       "1",
+}
+
+@Book{Gunter,
+  author =       "Carl A. Gunter",
+  title =        "Semantics of Programming Languages",
+  publisher =    "MIT Press",
+  year =         1992,
+}
+
+@Article{HatcliffD97,
+  title =        "Thunks and the {$\lambda$}-calculus",
+  author =       "John Hatcliff and Olivier Danvy",
+  pages =        "303--319",
+  journal =      "Journal of Functional Programming",
+  year =         "1997",
+  volume =       "7",
+  number =       "3",
+}
+
+@Book{Sterling,
+  author =       "Leon Sterling and Ehud Shapiro",
+  title =        "The Art of Prolog",
+  edition =      "Second",
+  publisher =    "MIT Press",
+  address =      "Cambridge",
+  year =         "1994",
+  annote =       "Explaination of logic programming, Prolog, and related
+                 programming techniques. Many references.",
+}
+
+@Book{Maier,
+  author =       "D. Maier and D. S. Warren",
+  title =        "Computing with logic:  Logic programming with
+                 {P}rolog",
+  year =         "1988",
+  publisher =    "The Benjamin/Cummings Publishing Company, Inc.",
+}
+
+
+
+@Book{Winskel,
+  author =       "Glynn Winskel",
+  title =        "The Formal Semantics of Programming Languages: An
+                 Introduction.",
+  series =       "Foundations of Computing series",
+  pages =        "384",
+  publisher =    "MIT Press",
+  year =         "1993",
+  keywords =     "text, book, denotational, DS, programming language
+                 definition",
+}
+
+@Book{Mitchell,
+  key =          "Mitchell",
+  author =       "John C. Mitchell",
+  title =        "Foundations for Programming Languages",
+  publisher =    "MIT Press",
+  address =      "Cambridge",
+  year =         "1996",
+  ISBN =         "0-262-13321-0",
+  annote =       "Graduate text on programming language theory. Focus on
+                 typed lambda calculus. Hundreds of references.",
+}
+
+@InProceedings{Muller3,
+  title =        "A Staging Calculus and its Application to the
+                 Verification of Translators",
+  author =       "Robert Muller",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  year =         "1994",
+  address =      "Portland",
+  pages =        "389--396",
+}
+
+@Article{Muller2,
+  author =       "Robert Muller",
+  title =        "{M-LISP}: {A} Representation-Independent Dialect of
+                 {LISP} with Reduction Semantics",
+  journal =      "ACM Transactions on Programming Languages and
+                 Systems",
+  volume =       "14",
+  number =       "4",
+  pages =        "589--616",
+  year =         "1992",
+  coden =        "ATPSDT",
+  ISSN =         "0164-0925",
+  url =          "http://www.acm.org/pubs/toc/Abstracts/0164-0925/133254.html",
+  abstract =     "In this paper we introduce M-LISP, a dialect of LISP
+                 designed with an eye toward reconciling LISP's
+                 metalinguistic power with the {\em structural} style of
+                 operational semantics advocated by Plotkin [28]. We
+                 begin by reviewing the original definition of LISP [20]
+                 in an attempt to clarify the source of its
+                 metalinguistic power. We find that it arises from a
+                 problematic clause in this definition. We then define
+                 the abstract syntax and operational semantics of
+                 M-LISP, essentially a hybrid of M-expression LISP and
+                 Scheme. Next, we tie the operational semantics to the
+                 corresponding equational logic. As usual, provable
+                 equality in the logic implies operational equality.\par
+                 Having established this framework we then extend M-LISP
+                 with the metalinguistic {\em eval} and {\em reify}
+                 operators (the latter is a nonstrict operator that
+                 converts its argument to its metalanguage
+                 representation). These operators encapsulate the
+                 matalinguistic representation conversions that occur
+                 globally in S-expression LISP. We show that the naive
+                 versions of these operators render LISP's equational
+                 logic inconsistent. On the positive side, we show that
+                 a naturally restricted form of the {\em eval} operator
+                 is confluent and therefore a conservative extension of
+                 M-LISP. Unfortunately, we must weaken the logic
+                 considerably to obtain a consistent theory of
+                 reification.",
+  acknowledgement = ack-pb,
+  keywords =     "languages; theory",
+  subject =      "{\bf F.3.2}: Theory of Computation, LOGICS AND
+                 MEANINGS OF PROGRAMS, Semantics of Programming
+                 Languages, Operational semantics. {\bf D.3.2}:
+                 Software, PROGRAMMING LANGUAGES, Language
+                 Classifications, LISP. {\bf D.3.1}: Software,
+                 PROGRAMMING LANGUAGES, Formal Definitions and Theory.
+                 {\bf D.3.3}: Software, PROGRAMMING LANGUAGES, Language
+                 Constructs and Features. {\bf D.3.4}: Software,
+                 PROGRAMMING LANGUAGES, Processors. {\bf F.3.3}: Theory
+                 of Computation, LOGICS AND MEANINGS OF PROGRAMS,
+                 Studies of Program Constructs. {\bf F.4.1}: Theory of
+                 Computation, MATHEMATICAL LOGIC AND FORMAL LANGUAGES,
+                 Mathematical Logic, Lambda calculus and related
+                 systems.",
+}
+
+@Article{fexprs,
+  author = 	 "Mitchell Wand",
+  title = 	 "The Theory of Fexprs is Trivial",
+  journal = 	 "Lisp and Symbolic Computation",
+  year = 	 1998,
+  OPTkey = 	 {},
+  volume = 	 10,
+  OPTnumber = 	 189,
+  pages = 	 "189--199",
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{Todd,
+  title =        "C++ Templates as Partial Evaluation",
+  author =       "Todd L. Veldhuizen",
+  booktitle =    "Proc. Workshop on
+                 Partial Evaluation and Semantics-Based Program
+                 Manipulation",
+  editor = 	 "O. Danvy",
+  address = 	 "San Antonio",
+  publisher =    "University of Aarhus, Dept. of Computer Science",
+  pages =        "13--18",
+  year =         1999
+}
+
+@PhdThesis{T99,
+  author =       "Walid Taha",
+  title =        "Multi-Stage Programming:  Its Theory and Applications",
+  school =       "Oregon Graduate Inst. of Sci. and Tech.",
+  year =         "1999",
+}
+
+@InProceedings{LawallThiemann:97,
+  author =       "J. Lawall and P. Thiemann",
+  title =        "Sound Specialization in the Presence of Computational
+                 Effects",
+  booktitle =    "Theoretical Aspects of Computer Software, Sendai,
+                 Japan, September 1997. (Lecture Notes in Computer
+                 Science, vol. 1281)",
+  year =         "1997",
+  publisher =    "Springer-Verlag",
+  pages =        "165--190",
+}
+
+@InProceedings{Mini-ML:86,
+  author =       {Dominique Clement and Joelle Despeyroux and Thierry
+                  Despeyroux and Gilles Kahn},
+  title =        {A simple applicative language: Mini-{ML}},
+  booktitle =    {Proc. 1986 {ACM} Conf. on Lisp and
+                 Functional Programming},
+  year =         "1986",
+  publisher =    "ACM press",
+  pages =        "13--27",
+}
+
+@InProceedings{DHT97,
+  author =       "D. Dussart and R.J.M. Hughes and P. Thiemann",
+  title =        "Type Specialization for Imperative Languages",
+  pages =        "204--216",
+  booktitle =    "Proc. 
+                  International Conf. on Functional Programming
+                 (ICFP), Amsterdam, The Netherlands, June 1997",
+  year =         "1997",
+  publisher =    "New York:\ ACM",
+}
+
+@Article{HD97,
+  title =        "A computational formalization for partial evaluation",
+  author =       "John Hatcliff and Olivier Danvy",
+  pages =        "507--541",
+  journal =      "Mathematical Structures in Computer Science",
+  year =         "1997",
+  volume =       "7",
+  number =       "5",
+}
+
+@Unpublished{TD,
+  author = 	 "Peter Thiemann and Dirk Dussart",
+  title = 	 "Partial Evaluation for Higher-Order Languages with
+      State",
+  note = 	 "Available online from 
+\fr{http://www.informatik.uni-freiburg.de/$\splicee{}$thiemann/papers/
+index.html}",
+  year =    "1996",
+  OPTkey = 	 {},
+  OPTyear = 	 {},
+  OPTannote = 	 {}
+}
+
+@ARTICLE{Sands:95,
+  author = {David Sands},
+  title = {A Na\"{\i}ve Time Analysis and its
+                 Theory of Cost Equivalence},
+  journal = {Journal of Logic and Computation},
+  year = {1995},
+  volume = {5},
+  number = {4},
+  optpages = {495--541},
+  optpostscript = {},
+  abstract = {Techniques for reasoning about extensional properties of
+functional programs are well-understood, but methods for analysing the
+underlying intensional, or operational properties have been much neglected.
+This paper begins with the development of a simple but useful
+calculus for time analysis of non-strict functional programs with lazy
+lists.  One limitation of this basic calculus is that the ordinary
+equational reasoning on functional programs is not valid. In order to buy
+back some of these equational properties we develop a non-standard
+operational equivalence relation called {\em cost equivalence}, by
+considering the number of computation steps as an ``observable'' component
+of the evaluation process.  We define this relation by analogy with Park's
+definition of bisimulation in {\sc ccs}. This formulation allows us to show
+that cost equivalence is a contextual congruence (and thus is substitutive
+with respect to the basic calculus) and provides useful proof techniques
+for establishing cost-equivalence laws.
+
+It is shown that basic evaluation time can be derived
+by demonstrating a certain form of cost equivalence, and we give a
+axiomatisation of cost equivalence which complete is with respect to
+this application. This shows that cost equivalence subsumes the basic
+calculus.
+
+Finally we show how a new operational interpretation of evaluation
+demands can be used to provide a smooth interface between this time
+analysis and more compositional approaches, retaining the advantages
+of both.},
+}
+
+@InProceedings{Moran-Sands99,
+  key =          "Moran \& Sands",
+  author =       "Andrew Moran and David Sands",
+  title =        "Improvement in a Lazy Context: An Operational Theory
+                 for Call-By-Need",
+  booktitle =    "the Symposium on Principles of
+                  Programming Languages {(POPL '99)}",
+  address =      "San Antonio, Texas",
+  year =         "1999",
+  organization = "ACM",
+  month =        jan,
+  pages =        "43--56",
+  annote =       "Operational theory for reasoning about optimization of
+                 lazy programs. 42 references.",
+}
+
+@InProceedings{T97,
+  author =       "P. Thiemann",
+  title =        "Correctness of a Region-Based Binding-Time Analysis",
+  booktitle =    "Mathematical Foundations of Programming Semantics,
+                 Thirteenth Annual Conf., Pittsburgh, Pennsylvania,
+                 March 1997",
+  year =         "1997",
+  publisher =    "Elsevier",
+  organization = "Carnegie Mellon University",
+  pages =        "26",
+}
+
+
+@InProceedings{MP99@HOOTS,
+  author =       {Moggi, Euegenio and Palumbo, Fabrizio},
+  title =        {Monadic Encapsulation of Effects: a Revised Approach},
+ booktitle =    {HOOTS 3rd International Workshop},
+  series =       {Electronic Notes in Theoretical Computer Science},
+  volume = {26},
+  year =         {1999}
+
+}
+
+@InProceedings{Danvy98,
+  author       = "Olivier Danvy",
+  title =        "A Simple Solution to Type Specialization",
+  booktitle =    "25th
+  International Colloquium on Automata, Languages, and
+  Programming",
+  year =         1998,
+  series =       LNCS,
+  volume =       1443,
+  address =      "Aalborg",
+}
+
+@InProceedings{HengleinJoergensen:94l,
+  author =       "Fritz Henglein and Jesper J{\o}rgensen",
+  title =        "Formally optimal boxing",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  address =      "Portland, Oregon",
+  year =         "1994",
+  semno =        "D-179",
+  pages =        "213--226",
+  summary =      "Representation analysis seeks to optimize the run-time
+                 representation of elements of data types in high-level
+                 programming languages. Using a language with explicit
+                 representation types and boxing/unboxing operations we
+                 axiomatize equationally the set of all explicitly boxed
+                 versions called {\em completions}. We give the equality
+                 axioms a rewriting interpretation that captures
+                 eliminating boxing/unboxing operations without relying
+                 on a specific implementation or even semantics of the
+                 underlying language. The rewriting system produces a
+                 unique ``optimal'' completion.",
+  keywords =     "representation analysis, polymorphism, type systems,
+                 Standard-ML",
+}
+
+@Article{Henglein:92Dynamic,
+  author =       "Fritz Henglein",
+  title =        "Dynamic typing: syntax and proof theory",
+  journal =      "Lecture Notes in Computer Science",
+  volume =       "582",
+  pages =        "197--230",
+  year =         "1992",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Wed Sep 15 10:01:31 MDT 1999",
+  acknowledgement = ack-nhfb,
+  keywords =     "ESOP; programming",
+}
+
+@Article{Pier91b,
+  author =       "Mart{\'\i}n Abadi and Luca Cardelli and Benjamin Pierce and
+                 Gordon D. Plotkin",
+  title =        "Dynamic Typing in a Statically Typed Language",
+  journal =      "ACM Transactions on Programming Languages and
+                 Systems",
+  volume =       "13",
+  number =       "2",
+  pages =        "237--268.",
+  year =         "1991",
+  keywords =     "types popl91 binder",
+  url =          "ftp://ftp.cs.indiana.edu/pub/pierce/dynamic.ps.gz",
+  abstract =     "Statically typed programming languages allow earlier
+                 error checking, better enforcement of disciplined
+                 programming styles, and generation of more efficient
+                 object code than languages where all type consistency
+                 checks are performed at run time. However, even in
+                 statically typed languages, there is often the need to
+                 deal with data whose type cannot be determined at
+                 compile time. To handle such situations safely, we
+                 propose to add a type Dynamic whose values are pairs of
+                 a value v and a type tag T where v has the type denoted
+                 by T. Instances of Dynamic are built with an explicit
+                 tagging construct and inspected with a type safe
+                 typecas construct. This paper explores the syntax,
+                 operational semantics, and denotational semantics of a
+                 simple language including the type Dynamic.",
+}
+
+@Unpublished{T00RTE,
+  author = 	 "Walid Taha",
+  title = 	 "Runtime Tag Elimination (Extended Abstract)",
+  note = 	 "Unpublished manuscript vailable online",
+  OPTkey = 	 {},
+  year = 	 2000,
+  OPTannote = 	 {}
+}
+
+
+@InProceedings{Henglein:92,
+  author =       "Fritz Henglein",
+  title =        "Global Tagging Optimization by Type Inference",
+  booktitle =    "1992 {ACM} Conferenc on Lisp and Functional
+                 Programming",
+  publisher =    "ACM Press",
+  year =         "1992",
+  pages =        "205--215",
+  refs =         "41",
+  checked =      "19950204",
+  source =       "Dept. Library",
+  abstract =     "Tag handling accounts for a substantial amount of
+                 execution cost in latently typed languages such as
+                 Common Lisp and Scheme, especially on architectures
+                 that provide no special hardware support. We present a
+                 tagging optimization algorithm based on type inference
+                 that is \begin{description} \item[global:] it traces
+                 tag information across procedure boundaries, not only
+                 withing procedures; \item[efficient:] it runs
+                 assymptotically in almost-linear time with excellent
+                 practical run-time behavior (e.g. 5,000 line Scheme
+                 programs are processed in a matter of seconds);
+                 \item[useful:] it eliminates at compile-time between 60
+                 and 95\% of tag handling operations in nonnumerical
+                 Scheme code (based on preliminary data);
+                 \item[structural:] it traces tag information in higher
+                 order (procedure) values and especially in structured
+                 (e.g. list) values, where reportedly 80\% of tag
+                 handling operations take place; \item[well-founded:] it
+                 is based on a formal static typing discipline with a
+                 special type {\tt Dynamic} that has a robust and
+                 semantically sound ``minimal typing'' property;
+                 \item[implementation-independent:] no tag
+                 implementation technology is presupposed; the results
+                 are displayed as an explicitly typed sources program
+                 and can be interfaced with compiler backends of
+                 statically typed languages such as Standard ML;
+                 \item[user-friendly:] no annotations by the programmer
+                 are necessary; it operates on the program source,
+                 provides useful type information to a programmer in the
+                 spirit of ML's type system, and makes all tag handling
+                 operations necessary at run-time explicit (and thus
+                 shows which ones can be eliminated without endangering
+                 correctness of program execution). \end{description}
+                 This agenda is accomplished by: \begin{itemize} \item
+                 maintaining and tracing only a minimum of information
+                 -- no sets of abstract colsures or cons points {\em
+                 etc.} that may reach a program point are kept, only
+                 their collective tagging information; no repeated
+                 analysis of program points is performed; \item
+                 scheduling processing steps such that each one
+                 contributes to the final result -- no idle or partially
+                 idle traversals of the syntax tree are performed;
+                 instead all relevant constraints are extracted in a
+                 single pass over the syntax tree; \item using
+                 theoretically and practically very efficient data
+                 structures; in particular, the union/find data
+                 structure is used to maintain and solve the extracted
+                 constraints. \end{itemize} This improves and
+                 complements previous work on tagging optimization in
+                 several respects. \begin{itemize} \item In the LISP
+                 compiler for
+                 S1~\cite{Brooks:Gabriel:Steele:acm:lfp:1982}, in
+                 Orbit~\cite{Kranz:Kelsey:Rees:Hudak:Philbin:Adams:acm:cc:1986},
+                 and in
+                 Screme~\cite{Vegdahl:Pleban:acm:asplos:1989,Pleban:tiall:1991}
+                 tagging optimization (representation analysis) is
+                 typically performed for atomic types (numbers), based
+                 on local control flow information. Our analysis is
+                 global and based on abstract data flow information.
+                 \item In TICL~\cite{Ma:Kessler:spe:1990} type analysis
+                 of Common LISP programs relies on costly repeated
+                 analysis and programmer type declarations. \item
+                 Shivers~\cite{Shivers:acm:pldi:1988} similarly uses
+                 potentially expensive and complicated data flow
+                 reanalysis for type recovery in Scheme and relies to
+                 some degree on programmer type declarations; his
+                 analysis works on the CPS transform of a Scheme program
+                 and as such the results are not presentable to the
+                 user/programmer. \end{itemize} The main practical
+                 contribution of our tagging optimization algorithm is
+                 likely to be its combination of execution efficiency
+                 and ability to eliminate tag handling operations in
+                 structured data, especially in lists: Steenkiste and
+                 Hennessy report that 80\% of all dynamic type checking
+                 operations are due to list operations, most of which
+                 are statically eliminated by our type inference
+                 algorithm. The computed information can also be used
+                 for unboxing and closure allocation (reference escape)
+                 analysis, although this is not pursued in this paper.",
+  reffrom =      "Wright:Cartwright:acm:lfp:1994",
+}
+@InProceedings{Peterson89,
+  author =       "J. Peterson",
+  title =        "Untagged Data in Tagged Environments: Choosing Optimal
+                 Representations at Compile Time",
+  booktitle =    "Proc. Conf. on Functional
+                 Programming Languages and Computer Architecture '89,
+                 Imperial College, London",
+  pages =        "89--99",
+  publisher =    "ACM Press",
+  address =      "New York, NY",
+  year =         "1989",
+  abstract =     "The inefficiency of tag bits can be alleviated by
+                 avoiding unnecessary conversions between tagged and
+                 untagged representations. An algorithm which determines
+                 the optimal representation of an object at each program
+                 point is presented.",
+}
+
+
+@InProceedings{Torben,
+  author =       "Torben {\AE}. Mogensen",
+  semno =        "D-159",
+  title =        "Constructor Specialization",
+  booktitle =    "ACM Symposium on Partial Evaluation and
+                 Semantics-Based Program Manipulation",
+  year =         "1993",
+  editor =       "David Schmidt",
+  pages =        "22--32",
+  publisher = "ACM press",
+  keywords =     "Partial evaluation, specialization, data-types,
+                 constructors",
+  summary =      "Constructors are specialized with respect to the
+                 static part of their arguments, similarly to
+                 specialization of functions. This allows specialized
+                 data-types to be invented and in general improves
+                 binding times.",
+}
+
+@InCollection{Pitts,
+  author =       "Andrew M. Pitts",
+  title =        "Operationally-Based Theories of Program Equivalence",
+  booktitle =    "Semantics and Logics of Computation",
+  editor =       "P. Dybjer and Andrew M. Pitts",
+  publisher =    "Cambridge University Press",
+  year =         "1995",
+  note =         "Based on lectures given at the CLICS-II Summer School
+                 on Semantics and Logics of Computation, Isaac Newton
+                 Institute for Mathematical Sciences, Cambridge UK,
+                 September 1995.",
+  citation-source = "Greg Sullivan, Thu Jun 27 11:28:21 1996",
+}
+
+
+@InProceedings{CorrectnessOfTS,
+  author =       "R.J.M. Hughes",
+  title =        "The Correctness of Type Specialisation",
+  booktitle =    "European Symposium on Programming (ESOP)",
+  OPTcrossref =  {},
+  OPTkey =       {},
+  year =         2000,
+  OPTeditor =    {},
+  OPTnumber =    {},
+  OPTaddress =   {},
+  OPTorganization = {},
+}
+
+@InProceedings{Mitchell91,
+  title =        "On Abstraction and the Expressive Power of Programming
+                 Languages",
+  author =       "John C. Mitchell",
+  pages =        "290--310",
+  booktitle =    "Theoretical Aspects of Computer Software",
+  editor =       "T. Ito and A. R. Meyer",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "526",
+  year =         "1991",
+  publisher =    "Springer-Verlag",
+  abstract =     "We present a tentative theory of programming language
+                 expressiveness based on reductions (language
+                 translations) that preserve observational equivalence.
+                 These are called ``abstraction-preserving'' because of
+                 a connection with a definition of ``abstraction'' or
+                 ``information-hiding'' mechanism. If there is an
+                 abstraction-preserving reduction from one language to
+                 another, then essentially every function on natural
+                 numbers that is definable in the first is also
+                 definable in the second. Moreover, regardless of the
+                 set of first-order functions definable in either
+                 language, no programming language with an abstraction
+                 mechanism can be reduced to a language without. Since
+                 Lisp with user-defined special forms does not have an
+                 abstraction mechanism, it is therefore not
+                 ``universal'' in this theory, in spite of the ability
+                 to define every partial recursive function on the
+                 natural numbers. Several examples and counter-examples
+                 to abstraction-preserving reductions are given. We do
+                 not know whether there is a natural universal language
+                 with respect to abstraction-preserving reduction.",
+}
+                                                                               
+@misc{fidel,
+   title = {Towards Principal Type Specialisation},
+   author = {Mart{\'\i}nez L\'opez, Pablo E. and Hughes, R.J.M.},
+   year = 2000,
+   note = {Unpublished manuscript.
+           Available from 
+  \texttt{http://www-lifia.info.unlp.edu.ar/\es{fidel}/Works/TowardsPTS.dvi}},
+}
+
+@TechReport{PST00TR,
+  author =       "Emir Pa\v{s}ali\'{c} and Tim Sheard and 
+                  Walid Taha",
+  title =        "{DALI}: An Untyped, {CBV} Functional Language Supporting
+                  First-Order Datatypes with Binders (Technical Development)",
+  institution =  "OGI",
+  year =         2000,
+  OPTkey =       {},
+  OPTtype =      {},
+  number =       "CSE-00-007",
+  note  =        "Available from \cite{ogi-tr-site}"
+}
+
+@Article{FP91,
+  author =       "Tim Freeman and Frank Pfenning",
+  title =        "Refinement Types for {ML}",
+  booktitle =    "Proc. Conf. on Programming Language Design
+                 and Implementation",
+  year =         "1991",
+  pages =        "268--277",
+  address =      "Toronto",
+  journal =      "SIGPLAN Notices",
+  volume =       "26",
+  number =       "6",
+  annote =       "Adds (explicitely defined) subtypes to MLs type
+                 system, which can help the static type checking.",
+}
+
+@InProceedings{L91,
+  author =       "John Launchbury",
+  title =        "A Strongly-Typed Self-Applicable Partial Evaluator",
+  pages =        "145--164",
+  booktitle =    "Proc. International Conf. on 
+                  Functional Programming Languages and Computer
+                  Architecture (FPCA)",
+  key =          "FPCA",
+  Conf. =   "5th {ACM} Conf.",
+  venue =        "Cambridge, MA, USA",
+  year =         1991,
+  editor =       "R.J.M. Hughes",
+  series =       LNCS,
+  volume =       523,
+}
+
+@InProceedings{Mogensen:93:ConstructorSpecialization,
+  author =       "Torben {\AE}. Mogensen",
+  semno =        "D-159",
+  title =        "Constructor Specialization",
+  booktitle =    "ACM Symposium on Partial Evaluation and
+                 Semantics-Based Program Manipulation",
+  year =         "1993",
+  editor =       "David Schmidt",
+  pages =        "22--32",
+  publisher = "ACM press",
+  keywords =     "Partial evaluation, specialization, data-types,
+                 constructors",
+  summary =      "Constructors are specialized with respect to the
+                 static part of their arguments, similarly to
+                 specialization of functions. This allows specialized
+                 data-types to be invented and in general improves
+                 binding times.",
+}
+
+@InCollection{Pitts95,
+  author =       "Andrew M. Pitts",
+  title =        "Operationally-Based Theories of Program Equivalence",
+  booktitle =    "Semantics and Logics of Computation",
+  editor =       "P. Dybjer and Andrew M. Pitts",
+  publisher =    "Cambridge University Press",
+  year =         "1995",
+  note =         "Based on lectures given at the CLICS-II Summer School
+                 on Semantics and Logics of Computation, Isaac Newton
+                 Institute for Mathematical Sciences, Cambridge UK,
+                 September 1995.",
+  citation-source = "Greg Sullivan, Thu Jun 27 11:28:21 1996",
+}
+
+@InProceedings{CTHL03,
+  title = 	 "Implementing Multi-stage Languages Using
+                  ASTs, Gensym, and Reflection", 
+  booktitle = "Generative Programming and Component Engineering (GPCE)",
+  author = "Cristiano Calcagno and Walid Taha and Liwen Huang and
+            Xavier Leroy",
+  year = 	 2003,
+  editor = 	 "Krzysztof Czarnecki 
+                  and Frank Pfenning and Yannis Smaragdakis",
+  OPTnumber = 	 {},
+  series = 	 "Lecture Notes in Computer Science",
+  OPTorganization = {},
+  publisher =    "Springer-Verlag",
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@Proceedings{saig00,
+  title = 	 "Semantics, Applications, and Implementation of 
+                  Program Generation",
+  year = 	 2000,
+  key = 	 {SAIG},
+  editor = 	 "Walid Taha",
+  volume = 	 1924,
+  OPTnumber = 	 {},
+  series = 	 "Lecture Notes in Computer Science",
+  address = 	 "Montr\'{e}al",
+  OPTorganization = {},
+  publisher =    "Springer-Verlag",
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@Proceedings{saig01,
+  title = 	 "Semantics, Applications, and Implementation of 
+                  Program Generation",
+  year = 	 2001,
+  key = 	 {SAIG},
+  editor = 	 "Walid Taha",
+  volume = 	 2196,
+  OPTnumber = 	 {},
+  series = 	 "Lecture Notes in Computer Science",
+  address = 	 "Firenze",
+  OPTorganization = {},
+  publisher =    "Springer-Verlag",
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+
+@InProceedings{Batory,
+  title = 	 "Refinements and Product Line Architectures",
+  author = 	 "Don Batory",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "3--4",
+  year = 2000,
+}
+
+@InProceedings{Pfenning,
+  title = 	 "Reasoning About Staged Computation",
+  author = 	 "Frank Pfenning",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "5--6",
+  year = 2000,
+}
+
+@InProceedings{Muller,
+  title = 	 "Specialization of Systems Programs:
+                  Lessons and Perspectives",
+  author = 	 "Gilles Muller",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "7--8",
+  year = 2000,
+}
+
+@inproceedings{fran-dsl
+    ,author={Conal Elliott}
+    ,title={Modeling Interactive {3D} and Multimedia Animation 
+            with an Embedded Language}
+    ,booktitle={Proc. first Conf. on 
+                Domain-Specific Languages}
+    ,organization={USENIX}
+    ,year=1997
+    ,pages={285-296}
+    }
+
+@Inproceedings(FrobIcra99,
+	Author="J. Peterson and G. Hager and P. Hudak",
+	Title="A Language for Declarative Robotic Programming",
+	BookTitle="Proceedings of IEEE Conf. on Robotics and Automation",
+	Year=1999
+        )
+
+@Inproceedings(FrobPadl99,
+	Author="J. Peterson and P. Hudak and C. Elliott",
+	Title="Lambda in Motion: Controlling Robots With {H}askell",
+       	BookTitle="Proc. 1st International Conf. on Practical Aspects of Declarative Languages (PADL'99)",
+        pages = "91-105",
+	Year=1999
+        )
+
+
+@Inproceedings(FVisionICSE99,
+	Author="A. Reid and J. Peterson and P. Hudak and G. Hager",
+	Title="Prototyping Real-Time Vision Systems: An Experiment in {DSL} Design",
+       	BookTitle="Proc. 21st International Conf. on Software Engineering (ICSE'99)",
+	Year=1999
+        )
+
+
+@InProceedings{Elliott,
+  title = 	 "Compiling Embedded Languages",
+  author = 	 "Conal Elliott and  Sigbj\o{}rn Finne and Oege de Moore",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "9--27",
+  year = 2000,
+}
+
+@InProceedings{Kamin,
+  author = 	 "Sam Kamin and Miranda Callahan and Lars Clausen",
+  title = 	 "Lightweight and Generative Components {II}:
+                  Binary-Level Components",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "28--50",
+  year = 2000,
+}
+
+@InProceedings{Helsen,
+  author = 	 "Simon Helsen and Peter Thiemann",
+  title = 	 "Fragmental Specialization",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "51--71",
+  year = 2000,
+}
+
+@InProceedings{Song,
+  author = 	 "Litong Song and Yoshihiko Futamura",
+  title = 	 "A New Termination Approach 
+                  for Specialization",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "72--91",
+  year = 2000,
+}
+
+@InProceedings{Calcagno,
+  author = 	 "Cristiano Calcagno and Eugenio Moggi",
+  title = 	 "Multi-Stage Imperative Languages:  A Conservative 
+                  Extension Result",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "92--107",
+  year = 2000,
+}
+
+@InProceedings{Fischbach,
+  author = 	 "Adam Fischbach and John Hannan",
+  title = 	 "Specification and Correctness of Lambda Lifting",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "108--128",
+  year = 2000,
+}
+
+@InProceedings{Makholm,
+  author = 	 "Henning Makholm",
+  title = 	 "On {J}ones-Optimal Specialization 
+                  for Strongly Typed Languages",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "129--148",
+  year = 2000,
+}
+
+@InProceedings{Ramsey,
+  title = 	 "Pragmatic Aspects of Reusable Software Generators",
+  author = 	 "Norman Ramsey",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "149--171",
+  year = 2000,
+}
+
+@InProceedings{Berardi,
+  title = 	 "Type-Based Useless-Code Elimination for Functional
+                  Programs",
+  author = 	 "Stefano Berardi and Marrio Coppo and Ferruccio Damiani
+                  and Paola Giannini",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "172--189",
+  year = 2000,
+}
+
+@InProceedings{Vuduc,
+  author = 	 "Richard Vuduc and James W. Demmel",
+  title = 	 "Code Generators for Automatic Tuning of Numerical:
+                  Experiences with {FFTW}",
+  booktitle = 	 "\cite{saig00}",
+  pages = 	 "190--211",
+  year = 2000,
+}
+
+@InProceedings{fftc,
+  author =       "Matteo Frigo",
+  title =        "A Fast {F}ourier Transform Compiler",
+  booktitle =    "Proc. ACM Conf. on
+                 Prog. Lang. Design and Impl. (PLDI~'99)",
+  year =         "1999",
+  pages =        "169--180",
+  url =          "http://www.acm.org/pubs/articles/proceedings/pldi/301618/p169-frigo/p169-frigo.pdf",
+  genterms =     "ALGORITHMS, DESIGN, LANGUAGES, MEASUREMENT,
+                 PERFORMANCE, THEORY",
+  categories =   "D.3.4 Software, PROGRAMMING LANGUAGES, Processors,
+                 Compilers. F.2.1 Theory of Computation, ANALYSIS OF
+                 ALGORITHMS AND PROBLEM COMPLEXITY, Numerical Algorithms
+                 and Problems, Computation of transforms.",
+  annote =       "incomplete",
+}
+
+@InProceedings{Dynamo,
+  author =       "V. Bala and E. Duesterwald and S. Banerjia",
+  title =        "Dynamo: A transparent dynamic optimization system",
+  booktitle =    "Proc. Conf. on
+                 Programming Language Design and Implementation",
+  year =         "1999",
+  pages =        "1--12",
+}
+
+@InProceedings{Fischer,
+  author = 	 "Bernd Fischer and Johann Schumann and Tom Pressburger",
+  title = 	 "Generating Data Analysis Programs from Statistical
+                  Models",
+  booktitle = 	 "Semantics, Applications, and Implementation of 
+                  Program Generation",
+  year = 	 2000,
+  volume = 	 1924,
+  series = 	 "LNCS",
+  publisher =    "Springer-Verlag",
+  pages = 	 "212--230",
+}
+
+@InCollection{Abramsky:LazyLambda,
+  author = 	 "Samson Abramsky",
+  title = 	 "The Lazy Lambda Calculus",
+  booktitle = 	 "Research topics in Functional Programming",
+  publisher =    "Addison-Wesley",
+  year = 	 "1990",
+  editor = 	 "D. Turner",
+}
+
+@Article{CG:Ambient,
+  author = 	 "Luca Cardelli and Andrew D. Gordon",
+  title = 	 "Mobile ambients",
+  journal = 	 "Theoretical Computer Science",
+  year = 	 "2000",
+  volume = 	 "240",
+  number = 	 "1",
+  pages = 	 "177-213",
+}
+
+@InProceedings{CGG:SecretPi,
+  author = 	 "Luca Cardelli and Giorgio Ghelli and Andrew D. Gordon",
+  title = 	 "Secrecy and Group Creation",
+  booktitle = 	 "CONCUR 2000",
+  year = 	 "2000",
+  editor = 	 "Catuscia Palamidessi",
+  volume = 	 "1877",
+  series = 	 "LNCS",
+  address = 	 "University Park, PA, USA",
+  publisher =    "Springer",
+}
+
+@InProceedings{Ene:Muntean:BPI,
+  author =       "Cristian Ene and Traian Muntean",
+  title =        "Expressivness of Point-to-Point versus Broadcast Communications",
+  bookTitle =    "Fundamentals of Computation Theory",
+  year =         "1999",
+  volume = 	 "1684",
+  series = 	 "LNCS",
+}
+
+@article{FerreiraJH98,
+  author =       "William Ferreira  and Matthew Hennessy and Alan Jeffrey",
+  title =        "A Theory of Weak Bisimulation for Core CML",
+  journal =      "Journal of Functional Programming",
+  pages =        "447--491",
+  year =         "1998",
+  volume =       8,
+  number =       "5"
+}
+
+@InProceedings{FG96:join,
+  author =       "C\'{e}dric Fournet and Georges Gonthier",
+  title =        "The Reflexive Chemical Abstract Machine and the Join-Calculus",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  pages =        "372--385",
+  publisher =    "ACM Press",
+  year =         "1996",
+  OPTaddress =      "St. Petersburg Beach, Florida",
+}
+
+
+
+@TechReport{Gordon:Bisimulation,
+  author =       "Andrew D. Gordon",
+  title =        "Bisimilarity as a theory of functional programming:
+                  mini-course",
+  institution =  "{BRICS}",
+  year =         "1995",
+  type =         "Notes Series",
+  number =       "BRICS-NS-95-3",
+  address =      "Department of Computer Science, University of Aarhus",
+}
+
+@Article{Howe,
+  title =        "Proving Congruence of Bisimulation in Functional
+                  Programming Languages",
+  author =       "Douglas J. Howe",
+  pages =        "103--112",
+  journal =      "Information and Computation",
+  year =         "1996",
+  volume =       "124",
+  number =       "2",
+  abstract =     "We give a method for proving congruence of
+                 bisimulation-like equivalences in functional
+                 programming languages. The method applies to languages
+                 that can be presented as a set of expressions together
+                 with an evaluation relation. We use this method to show
+                 that some generalizations of Abramsky's applicative
+                 bisimulation are congruences whenever evaluation can be
+                 specified by a certain natural form of structured
+                 operational semantics. One of the generalizations
+                 handles nondeterminism and diverging computations.",
+}
+
+@InProceedings{Rosenblum:DSL,
+  author = 	 "N. Medvidovic and D. Rosenblum",
+  title = 	 "Domains of Concern in Software Architectures and
+                  Architecture Description Languages",
+  booktitle = 	 "Proc. USENIX Conf. on Domain-Specific
+                  Languages",
+  address = 	 "Santa Barbara, CA",
+  year =         "1997",
+}
+
+@Book{Milner:CC,
+  author =       "Robin Milner",
+  title =        "Communication and Concurrency",
+  publisher =    "Prentice Hall",
+  year =         "1989",
+  series =       "International Series in Computer Science",
+}
+
+@Book{Milner:PI,
+  author = 	 "Robin Milner",
+  title = 	 "Communicating and Mobile Systems: the $\pi$-Calculus",
+  publisher = 	 "Cambridge University Press",
+  year = 	 "1999"
+}
+
+@TechReport{Milner:piI,
+  author =       "Robin Milner and Joachim Parrow and David Walker",
+  title =        "A Calculus of Mobile Processes, {Part I}",
+  institution =  "University of Edinburgh",
+  type =         "LFCS Report Series",
+  number =       "ECS-LFCS-89-85",
+  year =         "1989",
+}
+
+@TechReport{Milner:piII,
+  author =       "Robin Milner and Joachim Parrow and David Walker",
+  title =        "A Calculus of Mobile Processes, {Part II}",
+  institution =  "University of Edinburgh",
+  type =         "LFCS Report Series",
+  number =       "ECS-LFCS-89-86",
+  year =         "1989",
+}
+
+@TechReport{Milner:Pi91,
+  author =       "Robin Milner",
+  title =        "The Polyadic $\pi$-Calculus: a tutorial",
+  institution =  "Department of Computer Science, University of Edinburgh",
+  number =       "ECS-LFCS-91-180",
+  year =         "1991",
+  keywords =     "pcalc mobility binder",
+  url =          "ftp://ftp.cl.cam.ac.uk/users/rm135/ppi.ps.Z",
+}
+
+@InProceedings{OPT:WM2000,
+  author = 	 "Karol Ostrovsk\'y and K.~V.~S.~Prasad and Walid Taha",
+  title = 	 "A Preliminary Account of {P}rimitive {HOBS}: {A} Calculus
+                  for Higher Order Broadcasting",
+  booktitle = 	 "Proceedings of Winter Meeting",
+  year = 	 "2000",
+  organization = "Deptartment of Computing Science, Chalmers University of Technology",
+}
+
+@Misc{OPT:HOBS:ex,
+  author = 	 "Karol Ostrovsk\'y and K.~V.~S.~Prasad and Walid Taha",
+  title = 	 "Towards a Primitive Higher Order Calculus of Broadcasting Systems
+                  (Extended Version)",
+  howpublished = "available electronically: http://www.cs.chalmers.se/\~{}karol/Papers/,
+                  http://www.cs.chalmers.se/\~{}prasad/",
+  year = 	 "2000",
+}
+
+@Misc{OPT:ESOP2000:ex,
+  author =       "Karol Ostrovsk\'y and K.~V.~S.~Prasad and Walid Taha",
+  title =        "Towards a Primitive Higher Order Calculus of Broadcasting Systems",
+  year =         "2000",
+  note =         "extended version; http://www.cs.chalmers.se/\~{}karol/Papers/,
+                  http://www.cs.chalmers.se/\~{}prasad/",
+  URL =          "http://www.cs.chalmers.se/~karol/Papers\/, http://www.cs.chalmers.se/~prasad/",
+}
+
+@Unpublished{OldHobs,
+  author = 	 "K.~V.~S. Prasad",
+  title = 	 "Status report on ongoing work:  Higher Order
+                  Broadcasting Systems and Reasoning about Broadcasts",
+  note = 	 "Unpublished manuscript",
+  year = 	 "1994",
+}
+
+@Article{PrasadKVS:CalBro95,
+  author =       "K.~V.~S.~Prasad",
+  title =        "A Calculus of Broadcasting Systems",
+  journal =      "Science of Computer Programming",
+  volume =       "25",
+  year =         "1995",
+  URL =          "http://www.cs.chalmers.se/~prasad/scp.html",
+  abstract =     "
+  CBS is a simple and natural CCS-like calculus where processes speak
+  one at a time and are heard instantaneously by all others. Speech is
+  autonomous, contention between speakers being resolved
+  non-deterministically, but hearing only happens when someone else
+  speaks.  Observationally meaningful laws differ from those of CCS.
+  The change from handshake communication in CCS to broadcast in CBS
+  permits several advances. (1) Priority, which attaches only to
+  autonomous actions, is simply added to CBS in contrast to CCS, where
+  such actions are the result of communication.  (2) A CBS simulator
+  runs a process by returning a list of values it broadcasts. This
+  permits a powerful combination, CBS with the host language. It
+  yields several elegant algorithms.  Only processes with a unique
+  response to each input are needed in practice, so weak bisimulation
+  is a congruence. (3) CBS subsystems are interfaced by translators;
+  by mapping messages to silence, these can restrict hearing and hide
+  speech.  Reversing a translator turns its scope inside out. This
+  permits a new specification for a communication link: the
+  environment of each user should behave like the other user.
+  
+  This paper reports the stable aspects of an evolving study."
+}
+
+@InProceedings{PrasadKVS:CalBro91,
+  author =       "K. V. S. Prasad",
+  title =        "A Calculus of Broadcasting Systems",
+  bookTitle =    "TAPSOFT, Volume 1: CAAP",
+  year =         "1991",
+  note =         "Springer-Verlag LNCS 493",
+  URL =          "http://www.cs.chalmers.se/~prasad/caap91.html",
+  abstract =     "
+  Local area networks (LANs) and everyday speech inspire a model of
+  communication by unbuffered broadcast. Computation proceeds by a
+  sequence of messages, each transmitted by one agent and received by
+  zero or more others. Transmission is autonomous, but reception is not.
+  Each message is received instantaneously by all agents except the
+  transmitter, but is read only by those who were monitoring it at the
+  time; others discard it. As in CCS, agents learn about the environment
+  only through the messages they read. Programming such a system is hard
+  because we have to ensure that messages are read.
+
+  Testing resembles a viva-voce examination. Observation, restriction
+  and hidden actions differ from their CCS counterparts, as does testing
+  equivalence.
+
+  We capture this model in a Calculus of Broadcasting Systems (CBS). We
+  use transition systems with transmit, read and discard actions.
+  Discards are self-loops, and only auxiliary. We have some results on
+  strong bisimulation and testing, but much work remains to make CBS
+  tractable."
+}
+
+@phdthesis{Sangiorgi:PhD,
+   author =      "Sangiorgi, Davide",
+   title =       "Expressing Mobility in Process Algebras: First-Order and 
+                  Higher-Order Paradigms", 
+   school =      "Department of Computer Science, University of Edinburgh",
+   year =        "1992",
+   type =        "{PhD} thesis  {CST}--99--93"
+}
+
+@Article{Thomsen:1993:PCS,
+  author =       "Bent Thomsen",
+  title =        "Plain {CHOCS}: {A} Second Generation Calculus for
+                 Higher Order Processes",
+  journal =      "Acta Informatica",
+  volume =       "30",
+  number =       "1",
+  pages =        "1--59",
+  year =         "1993",
+  coden =        "AINFA2",
+  ISSN =         "0001-5903 (printed version), 1432-0525 (electronic
+                 version)",
+  mrclass =      "68Q65 (68Q60)",
+  mrnumber =     "94i:68197",
+  mrreviewer =   "Ferucio Laurentiu Tiplea",
+  bibdate =      "Sat Oct 9 09:56:22 MDT 1999",
+  acknowledgement = ack-nhfb,
+  source =       "nestmann",
+}
+
+@Article{Thomsen:IC:1995,
+  refkey =       "C1219",
+  title =        "A Theory of Higher Order Communicating Systems",
+  author =       "Bent Thomsen",
+  pages =        "38--57",
+  journal =      "Information and Computation",
+  year =         "1995",
+  volume =       "116",
+  number =       "1",
+  abstract =     "{\em A Calculus of Higher Order Communicating
+                  Systems\/} was presented in Thomsen [1989]. This
+                  calculus considers sending and receiving processes to
+                  be as fundamental as nondeterminism and parallel
+                  composition. In this paper we present an investigation
+                  of the foundation of the theory of this calculus,
+                  together with the full proofs of all major theorems.
+                  \par The calculus called CHOCS is an extension of
+                  Milner's CCS in the sense that all the constructions of
+                  CCS are included or may be derived from more
+                  fundamental constructs. Most of the mathematical
+                  framework of CCS carries over almost unchanged. The
+                  operational semantics of CHOCS is given as a labelled
+                  transition system and it is a direct extension of the
+                  semantics of CCS with value passing. A set of algebraic
+                  laws satisfied by the calculus is presented. These are
+                  similar to the CCS laws only introducing obvious extra
+                   laws for sending and receiving processes. The power of
+                  process passing is underlined by a result showing that
+                  recursion can be simulated by means of process passing
+                  and communication.",
+}
+
+@MastersThesis{Ostrovsky:MSc,
+  author = 	 "Karol Ostrovsk\'y",
+  title = 	 "Mobile Calculus Semantics of Concurrent Object-Oriented Languages",
+  school = 	 "Faculty of Mathematics and Physics, Comenius University",
+  address = 	 "Bratislava",
+  year = 	 "1998",
+}
+
+@PhdThesis{Turner:PhD,
+  author =       "David N. Turner",
+  title =        "The Polymorphic Pi-Calculus: Theory and
+                 Implementation",
+  school =       "Dept. of Computer Science, University of Edinburgh",
+  year =         "1996",
+  type =         "{PhD} thesis  {CST}--126--96",
+  note =         {(also published as ECS-LFCS-96-345)},
+}
+
+@misc{ocaml,
+    author = "Xavier Leroy",
+    title  = "Objective {C}aml",
+    year   = 2000,
+    note   = "Available from \fr{http://caml.inria.fr/ocaml/}",
+}
+
+@InProceedings{Wand85a,
+  author =      "Wand, Mitchell",
+  title =       "Embedding Type Structure in Semantics",
+  booktitle =   "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  year =        "1985",
+  pages =       "1--6",
+  source =  {/proj/wand/old/popl85/paper.tex},
+  URL = {ftp://ftp.ccs.neu.edu/pub/people/wand/papers/popl-85.ps},        
+  abstract = "We show how a programming language designer may embed
+the type structure of of a programming language in the more robust
+type structure of the typed lambda calculus.  This is done by
+translating programs of the language into terms of the typed lambda
+calculus.  Our translation, however, does not always yield a
+well-typed lambda term.  Programs whose translations are not
+well-typed are considered meaningless, that is, ill-typed.  We give a
+conditionally type-correct semantics for a simple language with
+continuation semantics.  We provide a set of static type-checking
+rules for our source language, and prove that they are sound and
+complete: that is, a program passes the typing rules if and only if
+its translation is well-typed.  This proves the correctness of our
+static semantics relative to the well-established typing rules of the
+typed lambda-calculus."  }
+
+@Article{OlivaRamsdellWand95,
+  author =      "Dino P. Oliva and John D. Ramsdell and Mitchell Wand",
+  title =       "The {VLISP} Verified PreScheme Compiler",
+  journal =     "Lisp and Symbolic Computation",
+  year =        "1995",
+  URL = {ftp://ftp.ccs.neu.edu/pub/people/wand/vlisp/lasc/prescheme.dvi},
+  volume =      "8",
+  number =      "1/2",
+  pages =       "111-182",
+  abstract =   "This paper describes a verified compiler for PreScheme, the
+implementation language for the {\vlisp} run-time system.  The
+compiler and proof were divided into three parts: A transformational
+front end that translates source text into a core language, a
+syntax-directed compiler that translates the core language into
+combinator-based tree-manipulation language, and a linearizer that
+translates combinator code into code for an abstract stored-program
+machine with linear memory for both data and code.  This factorization
+enabled different proof techniques to be used for the different phases
+of the compiler, and also allowed the generation of good
+code. Finally, the whole process was made possible by carefully
+defining the semantics of {\vlisp} PreScheme rather than just
+adopting Scheme's.  We believe that the architecture of the compiler
+and its correctness proof can easily be applied to compilers for
+languages other than PreScheme."
+}
+
+@Article{GuttmanRamsdellWand95,
+  author =      "Joshua Guttman and John Ramsdell and Mitchell Wand",
+  title =       "{VLISP}:  A Verified Implementation of Scheme",
+  journal =     "Lisp and Symbolic Computation",
+  year =        "1995",
+  volume =      "8",
+  number =      "1/2",
+  pages =       "5--32",
+  abstract = "The Vlisp project showed how to produce a
+                 comprehensively verified implementation for a
+                 programming language, namely Scheme.  This paper
+                 introduces two more detailed studies on Vlisp.  It
+                 summarizes the basic techniques that were used
+                 repeatedly throughout the effort.  It presents
+                 scientific conclusions about the applicability of the
+                 these techniques as well as engineering conclusions
+                 about the crucial choices that allowed the
+                 verification to succeed.", 
+ URL = {ftp://ftp.ccs.neu.edu/pub/people/wand/vlisp/lasc/overview.dvi},
+}
+
+@Inproceedings{cousot,
+    author = "Patrik Cousot",
+    year   = 1997,
+    title = "Constructive design of a hierarchy of semantics of a transition 
+             system by abstract interpretation",
+    booktitle = "Mathematical Foundations of Programming Semantics",
+}
+
+
+@Inproceedings{shao95,
+    author = "Zhong Shao and Andrew Appel",
+    title = "A Type-Based Compiler for {Standard ML}",
+    booktitle = "Conf. on Programming Language Design and Implementation",
+    pages = "116--129",
+    year = "1995"
+}
+
+@Inproceedings{league99,
+    author = "Christopher League and Zhong Shao and Valery Trifonov",
+    title = "Representing {Java} classes in a typed intermediate language",
+    booktitle = "International Conf. on Functional Programming",
+    year = "1999",
+    pages = "183--196",
+}
+
+@Article{sestoft,
+  title =        "Deriving a lazy abstract machine",
+  author =       "Peter Sestoft",
+  pages =        "231--264",
+  journal =      "Journal of Functional Programming",
+  year =         "1997",
+  volume =       "7",
+  number =       "3",
+  references =   "\cite{TCS::Josephs1989} \cite{POPL::Launchbury1993}
+                 \cite{JFP::Jones1992} \cite{POPL::SansomJ1995}
+                 \cite{POPL::Wand1982}",
+}
+
+@Misc{MetaMLOnline,
+  key = "MHP",
+  title = 	 "{The MetaML Home Page}",
+  year  =        2000,
+  note = 	 "Provides source code and documentation online at 
+                  \fr{http://www.cse.ogi.edu/PacSoft/projects/metaml/index.html}"
+}
+
+@PhdThesis{Sundaresh,
+  author =       "R. S. Sundaresh",
+  title =        "Incremental Computation via Partial Evaluation",
+  school =       "Yale University",
+  year =         "1992",
+  address =      "New Haven, Connecticut, USA",
+}
+
+@InProceedings{DyC,
+  author =       "Brian Grant and Matthai Philipose and Markus Mock and
+                 Craig Chambers and Susan J. Eggers",
+  title =        "An Evaluation of Staged Run-Time Optimizations in
+                 {DyC}",
+  booktitle =    "Proc. Conf. on
+                 Programming Language Design and Implementation",
+  year =         "1999",
+  pages =        "293--304",
+  url =          "http://www.acm.org/pubs/articles/proceedings/pldi/301618/p293-grant/p293-grant.pdf",
+  genterms =     "DESIGN, EXPERIMENTATION, LANGUAGES, MEASUREMENT,
+                 PERFORMANCE, THEORY",
+  categories =   "D.3.4 Software, PROGRAMMING LANGUAGES, Processors,
+                 Run-time environments. D.3.4 Software, PROGRAMMING
+                 LANGUAGES, Processors, Optimization.",
+  annote =       "incomplete",
+}
+
+@PhdThesis{Benaissa:thesis,
+  author = 	 "Zine El-Abidine Benaissa",
+  title = 	 "Explicit Substitution Calculi as a Foundation of
+    Functional Programming Languages Implementations",
+  school = 	 "INRIA",
+  year = 	 "1997",
+}
+
+@InProceedings{LevyMaranget:99,
+  author = 	 "Jean-Jacques Levy and Luc Maranget",
+  title = 	 "Explicit Substitutions and Programming Languages",
+  booktitle = 	 "19th Conf. on Foundations of Software Technology and
+  Theoretical Computer Science (FSTTCS)",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpages = 	 {},
+  year = 	 "1999",
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  address = 	 "Chennai, India",
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{Hofmann00,
+  author =       "Martin Hofmann",
+  title =        "A type system for bounded space and functional 
+                  in-place update",
+  booktitle =    "European Symposium on Programming (ESOP)",
+  pages =        "",
+  year =         2000,
+  series =       LNCS,
+  publisher =    "Springer-Verlag",
+}
+
+@InProceedings{Hofmann99,
+  author =       "Martin Hofmann",
+  title =        "Semantical Analysis of Higher-Order Abstract Syntax",
+  editor =       "G. Longo",
+  booktitle =    "Proc. 14th Annual Symposium on Logic in
+                 Computer Science (LICS'99)",
+  year =         "1999",
+  publisher =    "IEEE Computer Society Press",
+  address =      "Trento, Italy",
+  month =        jul,
+  keywords =     "misc",
+}
+
+@InProceedings{Fiore99lics,
+  author =       "Marcelo Fiore and Gordon D. Plotkin and Daniele Turi",
+  title =        "Abstract Syntax and Variable Binding",
+  editor =       "G. Longo",
+  pages =        "193--202",
+  booktitle =    "Proc. 14th Annual Symposium on Logic in
+                 Computer Science (LICS'99)",
+  year =         "1999",
+  publisher =    "IEEE Computer Society Press",
+  address =      "Trento, Italy",
+  month =        jul,
+  keywords =     "misc",
+}
+
+@Article{Chin99,
+  author =       "Wei-Ngan Chin and Siau-Cheng Khoo",
+  title =        "Calculating sized types",
+  journal =      "ACM SIG{\-}PLAN Notices",
+  volume =       "34",
+  number =       "11",
+  pages =        "62--72",
+  year =         "1999",
+  bibdate =      "Thu Apr 27 07:24:12 MDT 2000",
+  url =          "http://www.acm.org/pubs/citations/proceedings/pepm/328690/p62-chin/",
+  acknowledgement = ack-nhfb,
+}
+
+@InProceedings{sized96,
+  author =       "R.J.M. Hughes and Lars Pareto and Amr Sabry",
+  booktitle =    "Proc. ACM Symp. on Principles of
+                  Prog. Langs. {(POPL~'96)}",
+  title =        "Proving the Correctness of Reactive Systems using
+                 Sized Types",
+  year =         "1996",
+  abstract-url = "http://www.cs.chalmers.se/~rjmh/Papers/popl-96.html",
+  url =          "http://www.cs.chalmers.se/~rjmh/Papers/popl-96.ps",
+  keywords =     "sized types, reactive systems, embedded software,
+                 liveness and termination analysis, productivity",
+  publisher =    "ACM Press",
+  scope =        "static",
+}
+
+@InProceedings{CML,
+  author =       "J. H. Reppy",
+  title =        "{CML: A Higher-Order Concurrent Language}",
+  booktitle =    "Proc. Conf. on Programming Language Design
+                 and Implementation",
+  address =      "Toronto, Ontario, Canada, June 26--28",
+  year =         "1991",
+  series =       "SIGPLAN Notices",
+  volume =       "26(6)",
+  pages =        "294--305",
+  publisher =    "ACM Press, New York",
+  abstract =     "Concurrent ML (CML) is a high-level, high-performance
+                 language for concurrent programming. It is an extension
+                 of Standard ML (SML) and is implemented on top of
+                 Standard ML of New Jersey (SML/NJ). CML is a practical
+                 language and is being used to build real systems. It
+                 demonstrates that we need not sacrifice high-level
+                 notation in order to have a good performance.",
+  keywords =     "ML, Threads",
+}
+
+@inproceedings{split-c,
+        author  = {D. E. Culler and A. Dusseau and S. C.
+                  Goldstein and A. Krishnamurthy and S.
+                  Lumetta and T. von Eicken and K. Yelick},
+        title = "{Parallel Programming in {Split-C}}",
+        booktitle = "Supercomputing '93",
+        address = {Portland, Oregon},
+        year = {1993}}
+
+@inproceedings{KRI:ASPLOS,
+        author  = {A. Krishnamurthy and K. Schauser and C. Scheiman and
+                   R. Wang and D. Culler and K. Yelick},
+        title = {{Evaluation of Architectural Support for Global 
+        Address-Based Communication in Large-Scale Parallel Machines}},
+        booktitle = "Proceedings of Architecture Support for Programming
+Languages and Operating Systems",
+        year = {1996}}
+
+
+@inproceedings{KRI:SYNC,
+    author= {Arvind Krishnamurthy and Katherine Yelick},
+    title= {Optimizing Parallel Programs with Explicit
+Synchronization},
+    booktitle = {Programming Language Design and Implementation},
+    year = {1995}
+}
+
+@article{KRI:JPDC,
+        author  = {Arvind Krishnamurthy and Katherine Yelick},
+        title   = {{Analyses and Optimizations for Shared Address Space
+Programs}},
+        journal = "Journal of Parallel and Distributed Computation",
+        year    = 1996
+}
+
+@inproceedings{t3dperformstudy,
+   author = "R. Arpaci and D. Culler and A. Krishnamurthy
+            and S. Steinberg and K. Yelick",
+   title = {{Empirical Evaluation of the CRAY-T3D: A Compiler Perspective}},
+   booktitle = "International Symposium on Computer Architecture",
+   year = {1995},
+}
+
+@inproceedings{par-frp,
+   author= "John Peterson and Valery Trifonov and Andrei Serjantov",
+   title = {{Parallel Functional Reactive Programming}},
+   booktitle = "Proc. 2nd International Workshop on Practical Aspects of Declarative Languages",
+   year = {2000}
+}
+
+@Book{jones-97-ccbook,
+  author =       "Neil D. Jones",
+  title =        "Computability and Complexity From a Programming
+                 Perspective",
+  year =         "1997",
+  series =       "Foundations of Computing",
+  ISBN =         "0-262-10064-9",
+  publisher =    "The {MIT} Press",
+  address =      "Cambridge, MA, USA",
+}
+
+@InProceedings{inherit,
+  author =       "Torben Mogensen",
+  title =        "Inherited Limits",
+  booktitle =    "Partial Evaluation: Practice and Theory",
+  pages =        "189--202",
+  year =         1999,
+  volume =       1706,
+  series =       LNCS,
+  publisher =    "Springer-Verlag",
+}
+
+@InProceedings{HR95,
+  author =       "Fritz Henglein and Jakob Rehof",
+  year =         "1995",
+  title =        "Safe Polymorphic Type Inference for a Dynamically
+                 Typed Language: Translating {Scheme} to {ML}",
+  booktitle =    "Proc. International Conf. 
+                  on Functional Programming Languages
+                  and Computer Architecture (FPCA)",
+  address =      "La Jolla",
+  publisher =    "ACM Press",
+  summary =      "We describe a new method for polymorphic type
+                 inference for the dynamically typed language Scheme.
+                 The method infers both types and explicit {\em run-time
+                 type operations (coercions)} for a given program. It
+                 can be used to statically debug Scheme programs and to
+                 give a high-level translation to ML, in essence
+                 providing an ``embedding'' of Scheme into ML.",
+}
+@Misc{ghc,
+  key = 	 "GHC",
+  author = 	 "The {GHC Team}",
+  title = 	 "The Glasgow Haskell Compiler User's Guide, Version 4.08",
+  howpublished = "Available online from {\tt http://haskell.org/ghc/}",
+  OPTmonth = 	 {},
+  OPTyear = 	 {},
+  note = 	 "Viewed on 12/28/2000",
+  OPTannote = 	 {}
+}
+
+@Book{Gordon94,
+  author =       "Andrew D. Gordon",
+  title =        "Functional Programming and Input/Output.",
+  series =       "Distinguished Dissertations in Computer Science.",
+  publisher =    "Cambridge University Press",
+  month =        sep,
+  year =         "1994",
+  keywords =     "FP, input, output, monad, monads, PhD thesis, book,
+                 text, CSci, CS",
+  abstract =     "ISBN 0 521 47103 6 hardback Cambridge University
+                 Press, http://www.cl.cam.ac.uk/users/adg/fpio.html
+                 (Summary (11/'94)) 1. Introduction 2. A Calculus of
+                 Recursive Types 3. A Metalanguage for Semantics 4.
+                 Operational Precongruence 5. Theory of the Metalanguage
+                 6. An Operational Theory of FP 7. Four Mechanisms for
+                 Teletype I/O 8. Monadic I/O 9. Summary email:
+                 adg@cl.cam.ac.uk (11/'94)
+                 http://www.cl.cam.ac.uk/users/adg/ (home page
+                 (11/'94))",
+}
+
+@Article{Mason-Talcott91,
+  key =          "Mason \& Talcott",
+  author =       "Ian Mason and Carolyn L. Talcott",
+  title =        "Equivalence in Functional Languages with Effects",
+  journal =      "Journal of Functional Programming",
+  year =         "1991",
+  volume =       "1",
+  number =       "3",
+  month =        jul,
+  pages =        "287--328",
+  annote =       "Adds objects with memory to a call-by-value lambda
+                 calculus. 43 references.",
+}
+
+@Article{Talcott:1992:TPD,
+  author =       "Carolyn L. Talcott",
+  title =        "A theory for program and data type specification",
+  journal =      "Theoretical Computer Science",
+  volume =       "104",
+  number =       "1",
+  pages =        "129--159",
+  day =          "05",
+  month =        oct,
+  year =         "1992",
+  coden =        "TCSCDI",
+  ISSN =         "0304-3975",
+  bibdate =      "Mon Jul 19 22:16:43 MDT 1999",
+  url =          "http://www.elsevier.com/cgi-bin/cas/tree/store/tcs/cas_sub/browse/browse.cgi?year=1992&;volume=104&issue=1&aid=1163",
+  acknowledgement = ack-nhfb,
+  classification = "C4240 (Programming and algorithm theory); C6110B
+                 (Software engineering techniques); C6120 (File
+                 organisation)",
+  corpsource =   "Dept. of Comput. Sci., Stanford Univ., CA, USA",
+  keywords =     "abstraction; algebraic abstract data types; data
+                 structures; data type specification; data types;
+                 definedness; escape mechanisms; essentially
+                 first-order; formal specification; functional
+                 application; IOCC; program equivalence; programming
+                 theory; programs; reasoning; semantic models;
+                 two-layered theory",
+  pubcountry =   "Netherlands",
+  treatment =    "T Theoretical or Mathematical",
+}
+
+@InProceedings{PODC::VenkatasubramanianT1995,
+  title =        "Reasoning about Meta Level Activities in Open
+                 Distributed Systems",
+  author =       "Nalini Venkatasubramanian and Carolyn L. Talcott",
+  booktitle =    "Proc. Fourteenth Annual {ACM} Symposium
+                 on Principles of Distributed Computing",
+  address =      "Ottawa, Ontario, Canada",
+  month =        "2--23~" # aug,
+  year =         "1995",
+  pages =        "144--152",
+}
+
+@InCollection{PittsAM:operfl,
+  author =       "Andrew~M.~Pitts and Ian~D.~B.~Stark",
+  title =        "Operational Reasoning for Functions with Local State",
+  booktitle =    "Higher Order Operational Techniques in Semantics",
+  editor =       "Andrew~D.~Gordon and Andrew~M.~Pitts",
+  year =         "1996"
+}
+
+@Article{Felleisen:1992:RRS,
+  author =       "M. Felleisen and R. Hieb",
+  title =        "The revised report on the syntactic theories of
+                 sequential control and state",
+  journal =      "Theoretical Computer Science",
+  volume =       "103",
+  number =       "2",
+  pages =        "235--271",
+  day =          "14",
+  month =        sep,
+  year =         "1992",
+  coden =        "TCSCDI",
+  ISSN =         "0304-3975",
+  bibdate =      "Sat Nov 22 13:24:22 MST 1997",
+  acknowledgement = ack-nhfb,
+  classification = "C4210 (Formal logic); C4240 (Programming and
+                 algorithm theory); C6140 (Programming languages)",
+  corpsource =   "Dept. of Comput. Sci., Rice Univ., Houston, TX, USA",
+  keywords =     "Church-Rosser; equational reasoning; equivalence
+                 relations; formal languages; formal logic; fully
+                 compatible equational theories; functional programs;
+                 higher-order languages; imperative programming;
+                 programming languages; programming theory; sequential
+                 control; standardization theorems; state; syntactic
+                 theories",
+  pubcountry =   "Netherlands",
+  treatment =    "T Theoretical or Mathematical",
+}
+
+@InProceedings{GiuPT-FROCOS-96,
+  author =       "Fausto Giunchiglia and Paolo Pecchiari and Carolyn
+                 L. Talcott",
+  title =        "Reasoning Theories - Towards an Architecture for Open
+                 Mechanized Reasoning Systems",
+  editor =       "F.~Baader and K. U.~Schulz",
+  booktitle =    "Frontiers of Combining Systems: Proc. 1st
+                 International Workshop, Munich (Germany)",
+  publisher =    "Kluwer Academic Publishers",
+  series =       "Applied Logic",
+  month =        mar,
+  year =         "1996",
+  pages =        "157--174",
+}
+
+@inproceedings{icra99
+    ,author={John Peterson and Gregory Hager and Paul Hudak}
+    ,title={A Language for Declarative Robotic Programming}
+    ,booktitle={International Conf. on Robotics and Automation}
+    ,year=1999
+    ,pages={}
+    }
+ 
+@InProceedings{padl99,
+        author = "John Peterson and Paul Hudak and Conal Elliott",
+        title = "Lambda in Motion: Controlling Robots With Haskell",
+        booktitle = "First International Workshop on
+                     Practical Aspects of Declarative Languages",
+        organization = "SIGPLAN",
+        month = "Jan",
+        year = "1999" 
+}
+
+@inproceedings{RePeHaHu99,
+   title="Prototyping Real-Time Vision Systems: An Experiment 
+          in {DSL} Design",
+   author ="Alastair Reid and John Peterson and Greg Hager and Paul
+Hudak",
+   booktitle = "Proc. International Conf. on Software Engineering",
+   month = May,
+   year = 1999
+}
+
+@inproceedings{linearMADT
+    ,author={Chih-Ping Chen and Paul Hudak}
+    ,title={Rolling Your Own Mutable ADT---A Connection between Linear
+            Types and Monads}
+    ,booktitle = "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}"
+    ,year =        "1997"
+    ,publisher =   "ACM Press"
+    ,address =     "New York"
+    ,month =       "January"
+    ,pages={54--66}
+    }
+
+@InProceedings{sulzmann,
+  author =      "Martin Sulzmann and Martin Odersky and Martin Wehr",
+  title =       "Type Inference with Constrained Types",
+  booktitle =   "FOOL4: 4th. International Workshop on Foundations of
+Object-oriented programming Languages",
+  year =        "1997",
+  month =       "January"
+}
+
+
+@InProceedings{Pitts00,
+  author =       "Andrew M. Pitts and Murdoch J. Gabbay",
+  title =        "A Metalanguage for Programming with
+       Bound Names Modulo Renaming",
+  booktitle =    "Mathematics of Programme Construction",
+  pages =        "230-255",
+  year =         2000,
+  volume =       1837,
+  series =       LNCS,
+  publisher =    "Springer-Verlag",
+}
+
+@InProceedings{Twelf,
+  author =       "Frank Pfenning and Carsten Sch{\"u}rmann",
+  title =        "System Description: Twelf --- {A} Meta-Logical
+                 Framework for Deductive Systems",
+  editor =       "H. Ganzinger",
+  pages =        "202--206",
+  booktitle =    "the International Conf. on
+                 Automated Deduction (CADE-16)",
+  year =         "1999",
+  publisher =    "Springer-Verlag LNAI 1632",
+  address =      "Trento, Italy",
+  month =        jul,
+  keywords =     "LF, Elf",
+  urlps =        "http://www.cs.cmu.edu/~fp/papers/twelf98.ps.gz",
+}
+
+@Article{Isabelle,
+  author =       "L. C. Paulson",
+  title =        "{Isabelle}: {A} Generic Theorem Prover",
+  journal =      "Lecture Notes in Computer Science",
+  volume =       "828",
+  pages =        "xvii + 321",
+  year =         "1994",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Tue Apr 28 14:47:35 1998",
+  acknowledgement = ack-nhfb,
+}
+
+@InProceedings{Despeyroux97,
+  author =       "Jo{\"e}lle Despeyroux and Frank Pfenning and Carsten
+                  Sch{\"u}rmann",
+  title =        "Primitive Recursion for Higher-Order Abstract Syntax",
+  editor =       "J. Roger  Hindley",
+  pages =        "147--163",
+  booktitle =    "Proc. Third International Conf. on
+                  Typed Lambda Calculus and Applications (TLCA'97)",
+  year =         1997,
+  publisher =    "Springer-Verlag LNCS 1210",
+  address =      "Nancy, France",
+  month =        apr,
+  keywords =     "misc",
+  note =         "An extended version is available as Technical Report
+                  CMU-CS-96-172, Carnegie Mellon University",
+  urldvi =       "http://www.cs.cmu.edu/~fp/papers/tlca97.dvi.gz",
+  urlps =        "http://www.cs.cmu.edu/~fp/papers/tlca97.ps.gz"
+}
+
+@Manual{Pfenning98guide,
+  title =        "Twelf User's Guide",
+  author =       "Frank Pfenning and Carsten Sch{\"u}rmann",
+  edition =      "1.2",
+  year =         1998,
+  month =        sep,
+  keywords =     "LF, Elf",
+  note =         "Available as Technical Report CMU-CS-98-173, Carnegie
+                  Mellon University",
+  urlhtml =      "http://www.cs.cmu.edu/~twelf/guide"
+}
+
+@InProceedings{Pfenning98types,
+  author =       "Frank Pfenning and Carsten Sch{\"u}rmann",
+  title =        "Algorithms for Equality and Unification in the
+                  Presence of Notational Definitions",
+  editor =       "T. Altenkirch and W. Naraschewski and B. Reus",
+  booktitle =    "Types for Proofs and Programs",
+  month =        mar,
+  year =         1998,
+  pages =        "179--193",
+  address =      "Kloster Irsee, Germany",
+  publisher =    "Springer-Verlag LNCS 1657",
+  keywords =     "LF, Elf",
+  urlps =        "http://www.cs.cmu.edu/~fp/papers/types98.ps.gz"
+}
+
+@InProceedings{Pfenning99cade,
+  author =       "Frank Pfenning and Carsten Sch{\"u}rmann",
+  title =        "System Description: Twelf --- A Meta-Logical Framework for
+                  Deductive Systems",
+  editor =       "H. Ganzinger",
+  pages =        "202--206",
+  booktitle =    "Proc. 16th International Conf. on
+                  Automated Deduction (CADE-16)",
+  year =         1999,
+  publisher =    "Springer-Verlag LNAI 1632",
+  address =      "Trento, Italy",
+  month =        jul,
+  keywords =     "LF, Elf",
+  urlps =        "http://www.cs.cmu.edu/~fp/papers/cade99.ps.gz"
+}
+
+@MastersThesis{Schurmann95,
+  author =       "Carsten Sch{\"u}rmann",
+  title =        "A Computational Meta Logic for the {Horn} Fragment of {LF}",
+  school =       "Carnegie Mellon University",
+  year =         1995,
+  month =        dec,
+  note =         "Available as Technical Report CMU-CS-95-218",
+  keywords =     "LF"
+}
+
+@InProceedings{Schurmann98cade,
+  author =       "Carsten Sch{\"u}rmann and Frank Pfenning",
+  title =        "Automated Theorem Proving in a Simple Meta-Logic for {LF}",
+  editor =       "Claude Kirchner and H{\'e}l{\`e}ne Kirchner",
+  pages =        "286--300",
+  booktitle =    "Proc. 15th International Conf. on
+                  Automated Deduction (CADE-15)",
+  year =         1998,
+  publisher =    "Springer-Verlag LNCS 1421",
+  address =      "Lindau, Germany",
+  month =        jul,
+  keywords =     "LF, Elf",
+  urlps =        "http://www.cs.cmu.edu/~fp/papers/cade98m2.ps.gz"
+}
+
+@PhdThesis{Schurmann00phd,
+  author =       "Carsten Sch{\"u}rmann",
+  title =        "Automating the Meta Theory of Deductive Systems",
+  school =       "Department of Computer Science, Carnegie Mellon University",
+  year =         2000,
+  month =        aug,
+  note =         "Available as Technical Report CMU-CS-00-146",
+  keywords =     "LF, Elf",
+  urlps =        "http://cs-www.cs.yale.edu/homes/carsten/papers/S00b.ps.gz"
+}
+
+@InProceedings{Kreitz98,
+  author          = "Christoph Kreitz and Mark Hayden and Jason Hickey",
+  title           = "A Proof Environment for the Development of Group 
+                     Communication Systems",
+  booktitle       = "15$^{th}$ International Conf. on Automated
+Deduction", 
+  year            = "1998",
+  editor          = "C. Kirchner and H. Kirchner",
+  volume          = "1421",
+  series          = "Lecture Notes in Artificial Intelligence",
+  pages           = "317--332",
+  publisher       = "Springer Verlag"
+}
+
+@InProceedings{Kreitz99,
+  author          = "Christoph Kreitz",
+  title           = "Automated Fast-Track Reconfiguration of Group
+                     Communication Systems",
+  booktitle       = "5$^{th}$ International Conf. on Tools and Algorithms
+                     for the Construction and Analysis of Systems",
+  year            = "1999",
+  editor          = "R.~Cleaveland",
+  number          = "1579",
+  series          = "Lecture Notes in Computer Science",
+  pages           = "104--118",
+  publisher       = "Springer Verlag"
+}
+
+@TechReport{Luo92,
+  author =  "Zhaohui Luo and Robert Pollack",
+  title =  "The {LEGO} Proof Development System: A User's Manual",
+  institution =  "University of Edinburgh",
+  month = may,
+  year =  "1992",
+  number =  "ECS-LFCS-92-211",
+  keywords = "misc"
+}
+
+
+@InProceedings{Nordstrom93,
+  author = "Bengt Nordstr{\"o}m",
+  title = "The {ALF} proof editor",
+  booktitle = "Proc. Workshop on Types for Proofs and
+Programs",
+  address = "Nijmegen",
+  year = "1993",
+  pages = "253--266",
+  keywords =  "ALF"
+}
+
+@TechReport{Dowek93tr,
+  author = "Gilles Dowek and Amy Felty and Hugo Herbelin and
+    G{\'e}rard Huet and Chet Murthy and Catherine Parent and
+    Christine Paulin-Mohring and Benjamin Werner",
+  title = "The {Coq} Proof Assistant User's Guide",
+  institution = "INRIA",
+  address = "Rocquencourt, France",
+  type = "Rapport Techniques",
+  number = "154",
+  year = "1993",
+  note = "Version 5.8",
+  keywords =  "misc"
+}
+
+
+@InProceedings{Allen00,
+  author          = "Stuart Allen and Robert Constable and Richard Eaton and 
+                     Christoph Kreitz and Lori Lorigo",  
+  title           = "The {\sf Nuprl} Open Logical Environment",
+  booktitle       = "the International Conf. on Automated
+Deduction",
+  year            = "2000",
+  editor          = "D. McAllester",
+  volume          = "1831",
+  series          = "Lecture Notes in Artificial Intelligence",
+  pages           = "170--176",
+  publisher       = "Springer-Verlag"
+}
+
+@techreport{Goad80,
+author  =       "Christopher A. Goad" ,
+title   =       "Computational Uses of the Manipulation of Formal Proofs" ,
+institution=    "Stanford University" ,
+number  =       "Stan-CS-80-819" ,
+month   =       "August" ,
+year    =       "1980"
+}
+
+@inproceedings{Xi99@PADL,
+author = "Xi, Hongwei",
+title = {Dead Code Elimination through Dependent Types},
+booktitle = "First International Workshop on Practical Aspects of Declarative Languages",
+series =      "Lecture Notes in Computer Science",
+volume =       1551,
+year = 1999
+}
+
+@InCollection{HarperStone98,
+  author =       "Robert Harper and Chris Stone",
+  title =        "A Type-Theoretic Interpretation of {Standard ML}",
+  booktitle =    "Proof, Language and Interaction: Essays in Honour of
+                 Robin Milner",
+  publisher =    "MIT Press",
+  year =         "1998",
+  editor =       "Gordon D. Plotkin and Colin Stirling and Mads Tofte",
+  note =         "To appear",
+}
+
+@TechReport{HarperStone97,
+  author =       "Robert Harper and Chris Stone",
+  title =        "A Type-Theoretic Account of {S}tandard {ML} 1996
+                 (Version 2)",
+  institution =  "Carnegie Mellon University",
+  year =         "1997",
+  number =       "CMU--CS--97--147",
+  address =      "Pittsburgh, PA"
+}
+
+@InProceedings{miller90tr,
+  author =       "Dale Miller",
+  title =        "An Extension to {ML} to Handle Bound Variables in Data
+                 Structures: Preliminary Report",
+  month =        jun,
+  year =         "1990",
+  booktitle =    "Informal Proc. Logical Frameworks BRA
+                 Workshop",
+  where =        "Nice, France",
+  note =         "Available as UPenn CIS technical report MS-CIS-90-59",
+}
+
+@Article{Miller:1992:UUM,
+  author =       "Dale Miller",
+  title =        "Unification Under a Mixed Prefix",
+  journal =      "Journal of Symbolic Computation",
+  volume =       "14",
+  number =       "4",
+  pages =        "321--358",
+  month =        oct,
+  year =         "1992",
+  coden =        "JSYCEH",
+  ISSN =         "0747-7171",
+  mrclass =      "68T15 (03B35 03B40)",
+  mrnumber =     "93g:68121",
+  bibdate =      "Sat May 10 15:54:09 MDT 1997",
+  acknowledgement = ack-nhfb,
+  classcodes =   "C4240 (Programming and algorithm theory)",
+  corpsource =   "Dept. of Comput. Sci., Pennsylvania Univ.,
+                 Philadelphia, PA, USA",
+  keywords =     "decidability; mixed prefix; optimizations;
+                 pre-unifiers; search problems; symbol manipulation;
+                 unification problems; unification search problem",
+  treatment =    "T Theoretical or Mathematical",
+}
+
+@InProceedings{miller92rclp,
+  author =       "Dale Miller",
+  title =        "Abstract Syntax and Logic Programming",
+  booktitle =    "Logic Programming: Proc. First and Second
+                 Russian Conf.s on Logic Programming",
+  year =         "1992",
+  pages =        "322--337",
+  publisher =    "Springer-Verlag",
+  series =       "Lecture Notes in Artificial Intelligence",
+  number =       "592",
+  alsoavailable = "Also available as technical report MS-CIS-91-72,
+                 UPenn.",
+}
+
+@InProceedings{POPL00*133,
+  author =       "Alan Bawden",
+  title =        "First-Class Macros have Types.",
+  pages =        "133--141",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL)}",
+  month =        jan # " ~19--21",
+  publisher =    "ACM Press",
+  address =      "N.Y.",
+  year =         "2000",
+}
+
+@Article{Ingerman61,
+  author =       "P. Z. Ingerman",
+  title =        "Thunks: a way of compiling procedure statements with
+                 some comments on procedure declarations.",
+  journal =      "Comm. A.C.M.",   
+  volume =       "4",
+  number =       "1",
+  pages =        "55--58",
+  month =        jan,
+  year =         "1961",
+  keywords =     "Algol 60, call by name, call-by-name, by-name, FP,
+                 parameter, passing, thunk, think, pass, closure,
+                 algol-60, programming language",
+}
+
+
+
+@InProceedings{FM01A,
+  author = 	 "J. Ford and I. A. Mason",
+  title = 	 "Operational Techniques in PVS - A Preliminary Evaluation",
+  booktitle = 	 "The Australasian Theory Symposium, CATS '01",
+  year = 	 2001
+}
+
+@InProceedings{FM01B,
+  author = 	 "J. Ford and I. A. Mason",
+  title = 	 "Establishing a General Context Lemma in PVS",
+  booktitle = 	 "The 2nd Australasian Workshop on Computational Logic, 
+                  AWCL'01",
+  year = 	 2001
+}
+
+@manual{PVS,
+        TITLE = {PVS Tutorial},
+        AUTHOR = {N. Shankar and S. Owre and J. M. Rushby},
+        MONTH = feb,
+        YEAR = 1993,
+        ORGANIZATION = {Computer Science Laboratory, SRI International},
+        ADDRESS = {Menlo Park, CA},
+        NOTE = {Also appears in Tutorial Notes, {\em Formal Methods Europe
+                '93: Industrial-Strength Formal Methods}, pages 357--406,
+                Odense, Denmark, April 1993}}
+
+@InProceedings{CMA94,
+  key =          "CMA94",
+  author =       "L. Cardelli and F. Matthes and M. Abadi",
+  title =        "Extensible Grammars for Language Specialization",
+  booktitle =    "Database Programming Languages (DBPL-4)",
+  editor =       "C. Beeri and A. Ohori and D. E. Shasha",
+  series =       "Workshops in Computing",
+  publisher =    "Springer-Verlag",
+  month =        feb,
+  year =         "1994",
+  url =          "http://www.sts.tu-harburg.de/papers/1994/CMA94",
+  abstract =     "A basic dilemma in the design of a database
+                 programming language is the choice between a
+                 user-friendly language with a rich set of tailored
+                 notations for schema definitions, query expressions,
+                 etc., and a small, conceptually simple core language.
+                 We address this dilemma by proposing extensible
+                 grammars, a syntax-definition formalism for incremental
+                 language extensions and restrictions based on an
+                 initial core language.\\ The translation of programs
+                 written in tailored object languages into programs of a
+                 core language is defined via syntax-directed patterns.
+                 In contrast to traditional macro-expansion and
+                 program-rewriting tools, our extensible grammars
+                 respect scoping rules. Therefore, it is possible to
+                 introduce new binding constructs like quantifiers,
+                 iterators, and type declarations, while avoiding
+                 problems with variable captures and name clashes.\\ We
+                 develop extensible grammars and illustrate their use by
+                 extending the lambda calculus with let-bindings,
+                 conditionals, and SQL-style query expressions. We then
+                 give a formal description of the underlying parsing,
+                 transformation, and substitution rules. We also
+                 highlight some implementation details of a type-safe,
+                 extensible parser package based on the concept of
+                 extensible grammars developed for the Tycoon
+                 programming environment.",
+}
+
+@article{hashimoto97,
+    author = "M. Hashimoto and A. Ohori",
+    title = "A typed context calculus",
+    journal = "Theoretical Computer Science",
+    note = "To appear.  Preliminary version. Preprint          
+            RIMS-1098, Research Institute for Mathematical Sciences, Kyoto     
+            University, 1996",
+    url = "citeseer.nj.nec.com/hashimoto01typed.html"
+}
+
+@Article{Mason99,
+  author =       "Ian A. Mason",
+  title =        "Computing with Contexts",
+  journal =      "Higher-Order and Symbolic Computation",
+  volume =       "12",
+  number =       "2",
+  pages =        "171--201",
+  month =        sep,
+  year =         "1999",
+  coden =        "LSCOEX",
+  ISSN =         "1388-3690",
+  bibdate =      "Sat Jul 17 17:47:09 MDT 1999",
+  url =          "http://www.wkap.nl/oasis.htm/234970",
+  acknowledgement = ack-nhfb,
+}
+
+@InCollection{Sand98,
+  author =       "David Sands",
+  title =        "Computing with Contexts: {A} simple approach",
+  booktitle =    "Second Workshop on Higher-Order Operational Techniques
+                 in Semantics (HOOTS II)",
+  editor =       "Andrew D. Gordon and Andrew M. Pitts and Carolyn L. Talcott",
+  series =       "Electronic Notes in Theoretical Computer Science",
+  year =         "1998",
+  volume =       "10",
+  publisher =    "Elsevier Science Publishers B.V.",
+  keywords =     "pisem",
+}
+
+
+@TechReport{MS2000,
+  author = 	 "Stefan Monnier and Zhong Shao",
+  title = 	 "Inlining as Staged Computation",
+  institution =  "Department of Computer Science, 
+                  Yale University",
+  year = 	 2000,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "YALEU/DCS/TR-1193",
+  OPTaddress = 	 {},
+  month = 	 mar,
+  OPTnote = 	 {},
+  annote = 	 "{\sf http://flint.cs.yale.edu/flint/publications/isc.html}"
+}
+
+@InProceedings{Ong,
+  author = 	 "A. S. Murawski and C.-H. L. Ong",
+  title = 	 "Can safe recursion be interpreted in light logic?",
+  booktitle = 	 "Second International Workshop on 
+                  Implicit Computational Complexity",
+  year = 	 200,
+  address = 	 "Santa Barbara",
+  month = 	 jun
+}
+
+@Unpublished{Kieburtz2001,
+  author = 	 "Richard Kieburtz",
+  title = 	 "Real-time Reactive Programming for Embedded Controllers",
+  note = 	 "Available from author's home page",
+  OPTkey = 	 {},
+  month = 	 mar,
+  year = 	 2001,
+  OPTannote = 	 {}
+}
+
+@article{UpperBounds,
+author = {Hongwei Xi},            
+title = "{Upper bounds for standardizations and an application}",
+journal = {Journal of Symbolic Logic},
+volume = 64,
+number = 1,
+pages = "291-303",
+year = 1999,
+month = "March"
+}
+
+@InCollection{DepTypes,
+  author =       "Martin Hofmann",
+  title =        "Syntax and Semantics of Dependent Types",
+  editor =       "Andrew M. Pitts and Peter Dybjer",
+  booktitle =    "Semantics and Logics of Computation",
+  series =       "Publications of the Newton Institute",
+  volume =       "14",
+  pages =        "79--130",
+  publisher =    "Cambridge University Press",
+  address =      "Cambridge",
+  year =         "1997",
+}
+
+
+
+@InProceedings{Hofmann99b,
+  author =       "Martin Hofmann",
+  title =        "Linear Types and Non-Size-Increasing Polynomial Time
+                 Computation",
+  pages =        "464--473",
+  booktitle =    "the Symposium on Logic in Computer Science
+                 ({LICS} '99)",
+  ISBN =         "0-7695-0158-3",
+  month =        jul,
+  publisher =    "IEEE",
+  year =         "1999",
+}
+
+@InProceedings{Effects92,
+  author =       "Jean-Pierre Talpin and Pierre Jouvelot",
+  title =        "The Type and Effect Discipline",
+  editor =       "A. Scedrov",
+  booktitle =    "Proc. 1992 Logics in Computer Science
+                 Conf.",
+  pages =        "162--173",
+  year =         "1992",
+  publisher =    "IEEE",
+  abstract =     "The {\em type and effect discipline} is a new
+                 framework for reconstructing the principal type and the
+                 minimal effect of expressions in implicitly typed
+                 polymorphic functional languages that support
+                 imperative constructs. The type and effect discipline
+                 outperforms other polymorphic type systems. Just as
+                 types abstract collections of concrete values, {\em
+                 effects} denote imperative operations on regions. {\em
+                 Regions} abstract sets of possibly aliased memory
+                 locations. \par Effects are used to control type
+                 generalization in the presence of imperative constructs
+                 while regions delimit observable side-effects. The
+                 observable effects of an expression range over the
+                 regions that are free in its type environment and its
+                 type; effects related to local data structures can be
+                 discarded during type reconstruction. The type of an
+                 expression can be generalized with respect to the
+                 variables that are not free in the type environment or
+                 in the observable effect.",
+}
+
+@InProceedings{Wadler99,
+  key =          "Wadler",
+  author =       "Philip Wadler",
+  title =        "The marriage of effects and monads",
+  booktitle =    "the International
+                 Conf. on Functional Programming (ICFP '98)",
+  series =       "ACM SIGPLAN Notices",
+  volume =       "34(1)",
+  month =        jun,
+  year =         "1999",
+  organization = "ACM",
+  pages =        "63--74",
+  annote =       "Shows how effect systems can be adapted to monads. 33
+                 references.",
+}
+
+@Article{Regions97,
+  refkey =       "C1753",
+  title =        "Region-Based Memory Management",
+  author =       "Mads Tofte and Jean-Pierre Talpin",
+  pages =        "109--176",
+  journal =      "Information and Computation",
+  month =        "1~" # feb,
+  year =         "1997",
+  volume =       "132",
+  number =       "2",
+  abstract =     "This paper describes a memory management discipline
+                 for programs that perform dynamic memory allocation and
+                 de-allocation. At runtime, all values are put into
+                 \emph{regions}. The store consists of a stack of
+                 regions. All points of region allocation and
+                 de-allocation are inferred automatically, using a type
+                 and effect based program analysis. The scheme does not
+                 assume the presence of a garbage collector. The scheme
+                 was first presented in 1994 (M.~Tofte and J.-P. Talpin,
+                 \emph{in} ``Proc. 21st ACM SIGPLAN-SIGACT
+                 Symposium on Principles of Programming Languages,''
+                 pp.~188--201); subsequently, it has been tested in the
+                 ML Kit with Regions, a region-based, garbage-collection
+                 free implementation of the Standard ML Core Language,
+                 which includes recursive datatypes, higher-order
+                 functions and updatable references (L.~Birkedal,
+                 M.~Tofte, and M.~Vejlstrup, (1996), \emph{in}
+                 ``Proc. 23rd ACM SIGPLAN-SIGACT Symposium
+                 on Principles of Programming Languages,''
+                 pp.~171--183). This paper defines a region-based
+                 dynamic semantics for a skeletal programming language
+                 extracted from Standard ML\@. We present the inference
+                 system which specifies where regions can be allocated
+                 and de-allocated and a detailed proof that the system
+                 is sound with respect to a standard semantics. We
+                 conclude by giving some advice on how to write programs
+                 that run well on a stack of regions, based on practical
+                 experience with the ML Kit.",
+  references =   "pldi::AikenFL1995, book::Appel1992, CACM::Baker1978,
+                 clfp::Baker1990, popl::BirkedalTV1996,
+                 TR::GiffordJS1987, POPL::DamasM1982,
+                 MISC::Dijkstra1960, MISC::ElsmanH1995,
+                 toplas::Georgeff1984, clfp::Hudak1986,
+                 popl::JouvelotG1991, toplas::InoueSY1988:555,
+                 book::Knuth1972, cacm::LiebermanH1983,
+                 popl::LucassenG1988, thesis::Lucassen1987,
+                 jcss::Milner1978, book::MilnerTH1990,
+                 lncs::Mycroft1984, cacm::Backus+1963:1,
+                 popl::RuggieriM1988, thesis::Talpin1993,
+                 jfp::TalpinJ1992, TR::TofteT1993, popl::TofteT1994",
+  preliminary =  "POPL::TofteT1994",
+  references =   "\cite{PLDI::AikenFL1995} \cite{BOOK::Appel1992}
+                 \cite{CACM::Baker1978} \cite{CLFP::Baker1990}
+                 \cite{POPL::BirkedalTV1996} \cite{TR::GiffordJS1987}
+                 \cite{POPL::DamasM1982} \cite{MISC::Dijkstra1960}
+                 \cite{MISC::ElsmanH1995} \cite{TOPLAS::Georgeff1984}
+                 \cite{CLFP::Hudak1986} \cite{POPL::JouvelotG1991}
+                 \cite{TOPLAS::InoueSY1988} \cite{BOOK::Knuth1972}
+                 \cite{CACM::LiebermanH1983} \cite{POPL::LucassenG1988}
+                 \cite{THESIS::Lucassen1987} \cite{JCSS::Milner1978}
+                 \cite{BOOK::MilnerTH1990} \cite{LNCS::Mycroft1984}
+                 \cite{CACM::Backus+1963} \cite{POPL::RuggieriM1988}
+                 \cite{THESIS::Talpin1993} \cite{JFP::TalpinJ1992}
+                 \cite{TR::TofteT1993} \cite{POPL::TofteT1994}",
+}
+
+@InProceedings{Calcagno01,
+  author =       "Cristiano Calcagno",
+  title =        "Stratified Operational Semantics for Safety and
+                 Correctness of the Region Calculus",
+  booktitle =    "the Symposium on Principles of Programming Languages ({POPL}'01)",
+  year =         "2001",
+}
+
+
+
+
+
+@article{Caspi&Pouzet:1994a,
+        Author = {Paul Caspi and Marc Pouzet},
+        Title = {A functional extension to {Lustre}},
+        Year = 1994
+}
+
+@techreport{Caspi&Pouzet:1997,
+        Author = {Paul Caspi and Marc Pouzet},
+        Title = {A co-iterative characterization of synchronous stream functions},
+        Number = {{VERIMAG} Research Report 97-07},
+        Institution = {{VERIMAG}},
+        CITY = {Gieres, France},
+        Month = Oct,
+        Year = 1997
+}
+
+
+@InProceedings{Kieburtz,
+  title =        "Implementing Closed Domain-Specific Languages",
+  author =       "Richard B. Kieburtz",
+  booktitle =    "\cite{saig00}",
+  pages =        "1--2",
+  year = 2000,
+}
+
+
+@Article{arrow,
+  author =       {R.J.M. Hughes},
+  title =        {Generalising Monads to Arrows},
+  journal =      {Science of Computer Programming},
+  year =         {2000},
+  volume =       {37},
+  pages =        {67-111},
+  month =        {May}
+}
+
+@InProceedings{caspi96synchronous,
+  title =        "Synchronous {Kahn} networks",
+  author =       "Paul Caspi and Marc Pouzet",
+  pages =        "226--238",
+  booktitle =    "the International
+                 Conf. on Functional Programming (ICFP'96)",
+  month =        "24--26 " # may,
+  year =         "1996",
+  address =      "Philadelphia, Pennsylvania",
+}
+
+@article{ ,
+    author = "Paul Caspi and Marc Pouzet",
+    title = "Synchronous {Kahn} networks",
+    journal = "ACM SIG{\-}PLAN Notices",
+    volume = "31",
+    number = "6",
+    pages = "226--238",
+    year = "1996",
+    url = "citeseer.nj.nec.com/24360.html"
+}
+
+@InProceedings{rt-frp,
+  author =       {Zhanyong Wan and Walid Taha and Paul Hudak},
+  title =        {{R}eal-time {FRP}},
+  booktitle =    {Proc. Intl. Conf. on 
+                  Functional Programming ({ICFP} '01)},
+  year =         {2001},
+  address =      {Florence, Italy},
+  month =        {September},
+  organization = {ACM},
+}
+
+@InProceedings{efrp,
+  author =   {Zhanyong Wan and Walid Taha and Paul Hudak},
+  title =   {{E}vent-driven {FRP}},
+  booktitle =   {Proc. 4th. Intl. Sym. on Practical
+Aspects of Declarative Languages (PADL~'02)},
+  year =   {2002},
+  month =   {Jan},
+  organization = {ACM},
+}
+
+@InProceedings{typed-macros,
+  author =       {Steven Ganz and Amr Sabry and Walid Taha},
+  title =        {Macros as Multi-Stage Computations:
+                  Type-Safe, Generative, Binding Macros in {M}acro{ML}},
+  booktitle =    {the International Conf. on 
+                  Functional Programming (ICFP '01)},
+  year =         {2001},
+  address =      {Florence, Italy},
+  month =        {September},
+  organization = {ACM},
+}
+
+@inproceedings{mycroft00statically,
+    author = "Alan Mycroft and Richard Sharp",
+    title = "A Statically Allocated Parallel Functional Language",
+    booktitle = "Automata, Languages and Programming",
+    pages = "37-48",
+    year = "2000",
+    url = "citeseer.nj.nec.com/mycroft00statically.html"
+}
+
+@InProceedings{HP99,
+  author =       "R.J.M. Hughes and Lars Pareto",
+  title =        "Recursion and Dynamic Data-structures in Bounded
+                 Space: Towards Embedded {ML} Programming",
+  pages =        "70--81",
+  ISBN =         "1-58113-111-9",
+  booktitle =    "Proc. Fourth {ACM} {SIGPLAN}
+                 International Conf. on Functional Programming
+                 ({ICFP}-99)",
+  month =        sep # " ~27--29",
+  series =       "ACM Sigplan Notices",
+  volume =       "34.9",
+  publisher =    "ACM Press",
+  address =      "N.Y.",
+  year =         "1999",
+}
+
+@techreport{esterel-semantics
+    ,author={Gerard Berry}
+    ,title={The Constructive Semantics of Pure {E}sterel (Draft Version 3)}
+    ,institution={Ecole des Mines de Paris and INRIA}
+    ,type={Draft Version}
+    ,number={3}
+    ,month=Jul
+    ,year=1999
+    }
+@phdthesis{acd-phd,
+author = {Anthony C. Daniels},
+title = {A Semantics for Functions and Behaviours},
+month = {December},
+year = {1999},
+pages = {193},
+url = {http://www.cs.ukc.ac.uk/pubs/1999/1172},
+publication_type = {phdthesis},
+submission_id = {24157_981726971},
+school = {The University of Nottingham}
+} 
+
+
+@InProceedings{franTk,
+  author =       {Meurig Sage},
+  title =        {{F}ran{T}k -- A Declarative {GUI} Language for {H}askell},
+  booktitle =    {Proceedings of Fifth ACM SIGPLAN International Conf. on Functional Programming},
+
+  pages =        {106-118},
+  year =         {2000},
+  address =      {Montreal, Canada},
+  month =        {September},
+  organization = {ACM},
+}
+
+@InProceedings{frappe,
+  author =       {Antony Courtney},
+  title =        {{F}rapp\'e: Functional Reactive Programming in {J}ava},
+  booktitle =    {Proceedings of Symposium on Practical Aspects of Declarative Languages},
+  year =         {2001},
+  organization = {ACM},
+}
+
+@TechReport{henzinger-hybrid-automata,
+  author =       {Thomas A. Henzinger},
+  title =        {The theory of hybrid automata},
+  institution =  {University of California, Berkeley},
+  year =         {1996}
+}
+
+@phdthesis{sulzmann-phd
+    ,author={Sulzmann, Martin}
+    ,title={A General Framework for Hindley/Milner Type Systems
+            with Constraints}
+    ,school={Department of Computer Science, Yale University}
+    ,month=May
+    ,year=2000
+    }
+
+@phdthesis{chen-chih-ping-phd
+    ,author={Chen, Chih-Ping}
+    ,title={Mutable Abstract Datatypes--A Connection 
+            Between Linear Types and State Monads}
+    ,school={Department of Computer Science, Yale University}
+    ,month=Dec
+    ,year=1999
+    }
+
+@book{barnsley
+    ,author={Barnsley, Michael F.}
+    ,title={Fractals Everywhere (Second Edition)}
+    ,publisher={Morgan Kaufmann}
+    ,address={New York}
+    ,year=2000
+    }
+@book{logo
+    ,author={Michael Friendly}
+    ,title={Advanced Logo: A Language for Learning}
+    ,publisher={Lawrence Erlbaum Associates}
+    ,address={}
+    ,year=1988
+    }
+
+@book{karel
+    ,author={Richard E. Pattis}
+    ,title={Karel the Robot}
+    ,publisher={John Wiley and Sons}
+    ,address={New York}
+    ,year=1981
+    }
+
+@book{littleschemer
+    ,author={Daniel P. Friedman and Matthias Felleisen}
+    ,title={The Little Schemer}
+    ,publisher={MIT Press}
+    ,address={Cambridge}
+    ,year=1996
+    }
+
+@book{labanotation
+    ,author={Ann Hutchinson}
+    ,title={Labanotation}
+    ,publisher={Routledge Theatre Arts Books}
+    ,address={New York}
+    ,year=1991
+    }
+
+@book{hofstadter
+    ,author={Douglas R. Hofstadter}
+    ,title={G\"{o}del, Escher, Bach: an Eternal Golden Braid}
+    ,publisher={Basic Books}
+    ,address={New Yorl}
+    ,year=1979
+    }
+
+@book{emmer
+    ,editor={Michele Emmer}
+    ,title={The Visual Mind}
+    ,publisher={MIT Press}
+    ,address={Cambridge}
+    ,year=1993
+    }
+
+@book{rothstein
+    ,author={Edward Rothstein}
+    ,title={Emblems of Mind: The Inner Life of Music and Mathematics}
+    ,publisher={Times Books}
+    ,address={New York}
+    ,year=1995
+    }
+ 
+@inproceedings{frp-pldi
+    ,author={Zhanyong Wan and Paul Hudak}
+    ,title={Functional Reactive Programming From First Principles}
+    ,booktitle={the Symposium on Programming Language Design
+                and Implementation ({PLDI} '00)}
+    ,organization={ACM}
+    ,year=2000
+    ,pages={}
+    }
+
+@Book{inside-com,
+  author =      "Dale Rogerson",
+  title =       "Inside COM",
+  publisher =   "Microsoft Press",
+  year =        "1997",
+}
+
+@Book{javabeans-ref,
+
+  author =      "Dan Brookshier",
+  title =       "JavaBeans Developer's Reference",
+  publisher =   "Macmillan Computer Publishing",
+  year =        "1997",
+}
+
+@Book{corba-ref,
+  author =      "Thomas Mowbray and Ron Zahavi",
+  title =       "The Essential Corba",
+  publisher =   "John Wiley and Sons",
+  year =        "1995",
+}
+
+@book{nelson91,
+editor="Greg Nelson",
+title="Systems programming with {M}odula-3",
+publisher="Prentice Hall",
+address ="Englewood Cliffs, NJ",
+year="1991"
+}
+
+@misc{PITAC
+    ,author={President's Information Technology Advisory Committee}
+    ,title={Information Technology Research:
+            Investing in Our Future}
+    ,note={chaired by Bill Joy and Ken Kennedy}
+    ,month=Feb
+    ,year=1999
+    }
+
+@book{soe
+    ,author={Paul Hudak}
+    ,title={The Haskell School of Expression -- 
+            Learning Functional Programming through Multimedia}
+    ,publisher={Cambridge University Press}
+    ,address={New York}
+    ,year=2000
+    }
+
+@book{java
+    ,author={Gosling, J. and Joy, B. and Steele, G.}
+    ,title={The Java Language Specification}
+    ,publisher={Addison-Wesley}
+    ,address={Reading, MA}
+    ,year=1996
+    }
+
+@misc{ada
+    ,key={Ada}
+    ,title={Rationale for the Design of the Ada Programming Language}
+    ,organization={United States Department of Defense}
+    ,journal={ACM Sigplan Notices}
+    ,volume=14
+    ,number=6
+    ,year=1979
+    ,month=Jun
+    }
+
+@misc{cobol
+    ,key={Cobol}
+    ,title={American National Standard COBOL (ANS X3.23-1968)}
+    ,organization={American National Standards Institue, New York}
+    ,year=1968
+    }
+
+@article{algol
+    ,author={de Morgan, R.M. and Hill, I.D. and Wichmann, B.A.}
+    ,title={Modified Report on the Algorithmic Language {ALGOL} 60}
+    ,journal={Computer Journal}
+    ,volume=19
+    ,number=4
+    ,year=1976
+    ,pages={364-379}
+    }
+
+@inproceedings{lisp
+    ,author={McCarthy, J.}
+    ,title={Towards a Mathematical Theory of Computation}
+    ,booktitle={Porc. IFIP Congress 6.2}
+    ,publisher={North-Holland, Amsterdam}
+    ,year=1962
+    ,pages={21-28}
+    }
+
+@article{backus:fortran78
+    ,author={Backus, J.}
+    ,title={The history of {FORTRAN} {I}, {II}, and {III}}
+    ,journal={ACM Sigplan Notices}
+    ,volume=13
+    ,number=8
+    ,year=1978
+    ,month=Aug
+    ,pages={165-180}
+    }
+
+@inproceedings{metaml
+    ,author={Taha, Walid and Sheard, Tim}
+    ,title={Mult-Stage Programming with Explicit Annotations}
+    ,booktitle={Proceedings of Symposium on Partial Evaluation and 
+                Semantics Based Program manipulation}
+    ,organization={ACM SIGPLAN}
+    ,year=1997
+    ,pages={203-217}
+    }
+
+@book{pierce-ct
+    ,author={Pierce, Benjamin}
+    ,title={Basic Category Theory for Computer Scientists}
+    ,publisher={MIT Press}
+    ,address={Cambridge, MA}
+    ,year=1991
+    }
+
+@INPROCEEDINGS{Widen&98,
+        AUTHOR = {Tanya Widen and James Hook},
+        TITLE = {Software design automation:  language design in the context of
+domain engineering},
+        BOOKTITLE = {Proc. 10th International Conf. on Software
+Engineering and Knowledge Engineering},
+        YEAR = 1998,
+        PAGES = {308-317},
+        PUBLISHER = {Knowledge Systems Institute},
+        ADDRESS = {Skokie, Illinois}
+}
+
+@Article{R5RS,
+  author =       "Richard Kelsey and William Clinger and
+                  Jonathan {Rees, editors}",
+  title =        "Revised${}^5$ Report on the Algorithmic Language {S}cheme",
+  journal =      "Higher-Order and Symbolic Computation",
+  year =         1998,
+  volume =       11,
+  number =       1,
+  pages =        "7-105",
+  note =         "Also appears in ACM SIGPLAN Notices 33(9), September 1998"
+}
+
+@inproceedings{jcp-ms-ifip
+    ,author={John Peterson and Martin Sulzmann}
+    ,title={Analysis of Architectures using Constraint--Based Types
+            (position paper)}
+    ,booktitle={First Working IFIP Conf. on Software Architecture}
+    ,organization={IFIP}
+    ,month=Feb
+    ,year=1999
+    }
+
+@inproceedings{h-direct
+    ,author={Sigbjorn Finne and Daan Leijen and Erik Meijer and 
+             Simon L. {Peyton Jones}}
+    ,title={H/Direct: A Binary Foreign Language Interface for Haskell}
+    ,booktitle={Proceedings of International Conf. on Functional
+                Programming}
+    ,organization={ACM/IFIP}
+    ,year=1998
+    ,pages={}
+    }
+
+@article{Arya86
+    ,author={Kavi Arya}
+    ,title={A Functional Approach To Animation}
+    ,journal={Computer Graphics Forum}
+    ,volume=5
+    ,number=4
+    ,month=Dec
+    ,year=1986
+    ,pages={297--311}
+    }
+ 
+@techreport{Bartlett91
+    ,author={Joel F. Bartlett}
+    ,title={Don't Fidget With Widgets, Draw!}
+    ,institution={DEC Western Digital Laboratory}
+    ,type={Technical Report}
+    ,number=6
+    ,month=May
+    ,year=1991
+    }
+ 
+@inproceedings{Elliott94
+    ,author={Conal Elliott, Greg Schechter, Ricky Yeung, and Salim Abi-Ezzi}
+    ,title={TBAG: A High Level Framework For Interactive, 
+            Animated 3D Graphics Applications}
+    ,booktitle={Proceedings of SIGGRAPH '94}
+    ,organization={ACM SIGGRAPH}
+    ,month=Jul
+    ,year=1994
+    ,pages={421-434}
+    }
+ 
+@techreport{Elliott96a
+    ,author={Conal Elliott}
+    ,title={A Brief Introduction to ActiveVRML}
+    ,institution={Microsoft Research}
+    ,type={Technical Report}
+    ,number={MSR-TR-96-05}
+    ,year=1996
+    }
+ 
+@inproceedings{Escher88
+    ,author={S.N. Zilles, P. Lucas, T.M. Linden, J.B. Lotspiech, 
+             and A.R. Harbury}
+    ,title={The Escher Document Imaging Model}
+    ,booktitle={Proc. ACM Conf. on 
+                Document Processing Systems}
+    ,month=Dec
+    ,year=1988
+    ,pages={159-168}
+    }
+ 
+@inproceedings{HaggisGraphics95}
+    ,author={Sigbjorn Finne and Simon L. {Peyton Jones}}
+    ,title={Pictures: A Simple Structured Graphics Model}
+    ,booktitle={Proceedings of Glasgow Functional Programming Workshop}
+    ,month=Jul
+    ,year=1995
+    ,pages={}
+    }
+
+@techreport{LucasZilles87
+    ,author={Peter Lucas and Stephen N. Zilles}
+    ,title={Graphics in an Applicative Context}
+    ,institution={IBM Almaden Research Center}
+    ,type={Technical Report}
+    ,number={}
+    ,month=Jul
+    ,year=1987
+    }
+
+@inproceedings{PJGordonFinne96
+    ,author={Simon L. {Peyton Jones}, Andrew D. Gordon and Sigbjorn Finne}
+    ,title={Concurrent Haskell}
+    ,booktitle={Proceedings of ACM Symposium on Principles of 
+                Programming Languages}
+    ,organization={ACM SIGPLAN}
+    ,month=Jan
+    ,year=1996
+    ,pages={}
+    }
+ 
+@inproceedings{Schecht.er94
+    ,author={Greg Schechter, Conal Elliott, Ricky Yeung, and Salim Abi-Ezzi}
+    ,title={Functional 3D Graphics in C++ - 
+            With an Object-Oriented, Multiple Dispatching Implementation}
+    ,booktitle={Proc. 1994 Eurographics Object-Oriented 
+                Graphics Workshop}
+    ,organization={Eurographics, Springer Verlag}
+    ,year=1994
+    ,pages={}
+    }
+
+@article{Scheifler90
+    ,author={R.W. Scheifler and J. Gettys}
+    ,title={The X Window system}
+    ,journal={Software---Practice and Experience}
+    ,volume=20
+    ,number={S2}
+    ,month=Oct
+    ,year=1990
+    ,pages={5-34}
+    }
+@inproceedings{video-dsl
+    ,author={S. Thibault, R. Marlet, C. Consel}
+    ,title={A Domain-Specific Language for Video Device Drivers: 
+            From Design to Implementation}
+    ,booktitle={Proc. first Conf. on 
+                Domain-Specific Languages}
+    ,organization={USENIX}
+    ,year=1997
+    ,month=Oct
+    ,pages={11--26}
+    }
+
+@inproceedings{sw-eng-dsl
+    ,author={D. Spinellis, V. Guruprasad}
+    ,title={Lightweight Languages for Software Engineering Tools}
+    ,booktitle={Proc. first Conf. on 
+                Domain-Specific Languages}
+    ,organization={USENIX}
+    ,year=1997
+    ,month=Oct
+    ,pages={67--76}
+    }
+@article{strategies98
+    ,author={P.W. Trinder, K. Hammond, H.-W. Loidl, and Simon L. {Peyton Jones}}
+    ,title={Algorithm + strategy = parallelism}
+    ,journal={Journal of Functional Programming}
+    ,volume=8
+    ,number=1
+    ,year=98
+    ,pages={23--60}
+    }
+ 
+@inproceedings{hudak-shaumyan-LACL97
+    ,author={Sebastian Shaumyan and Paul Hudak}
+    ,title={Linguistic, Philosophical, and Pragamatic Aspects
+            of Type-Directed Natural Language Parsing}
+    ,booktitle={Proceedings of Logical Aspects of Computational Linguistics}
+    ,organization={Springer-Verlag}
+    ,year=1997
+    ,month=Sep
+    }
+
+@misc{modular-monadic-semantics-98
+    ,author={Sheng Liang and Paul Hudak}
+    ,title={Modular Monadic Semantics}
+    ,note={submitted to {\em Journal of ACM}}
+    ,month=Mar
+    ,year=1998
+    }
+
+@inproceedings{dsel-reuse-98
+    ,author={Paul Hudak}
+    ,title={Modular Domain Specific Languages and Tools}
+    ,booktitle={Proceedings of Fifth International Conf. 
+                on Software Reuse}
+    ,organization={IEEE Computer Society}
+    ,year=1998
+    ,month=Jun
+    ,pages={134-142}
+    }
+
+@TechReport{Tullsen:Hudak:1998,
+  author =       "Mark Tullsen and Paul Hudak",
+  email =        "mark.tullsen@yale.edu and paul.hudak@yale.edu",
+  title =        "An Intermediate Meta-Language for Program Transformation",
+  institution =  "Yale University",
+  month =        jun,
+  year =         "1998",
+  url =          "ftp://haskell.systemsz.cs.yale.edu/pub/tullsen/imlforpt.ps",
+  pages =        "15",
+  number =       "YALEU/DCS/RR-1154",
+  abstract =     "As part of an effort to bridge the gap between the
+                  theory and practice of program transformation, we
+                  have designed a meta-language for transforming
+                  functional programs.  The meta-language is sound in
+                  preserving both value and termination properties of
+                  programs (and is thus superior to the unfold/fold
+                  methodology).  Our key contribution is an equational
+                  specification of Scherlis's expression procedures, in
+                  which we express the essence of expression procedures
+                  as a single transformation rule.  Our approach has
+                  the following advantages over both unfold/fold and
+                  expression procedures: (1) all program derivations
+                  are reversible; (2) many transformations can be done
+                  which unfold/fold and expression procedures cannot
+                  do; and (3) the proof of correctness is far simpler."
+}
+
+@Proceedings{Maler:1997:HRT,
+  editor =       "O. (Oded) Maler",
+  booktitle =    "Hybrid and real-time systems: international workshop,
+                 {HART} '97, Grenoble, France, March 26--28, 1997:
+                 proceedings",
+  title =        "Hybrid and real-time systems: international workshop,
+                 {HART} '97, Grenoble, France, March 26--28, 1997:
+                 proceedings",
+  volume =       "1201",
+  publisher =    "Springer-Verlag",
+  address =      "New York, NY, USA",
+  pages =        "ix + 414",
+  year =         "1997",
+  coden =        "LNCSD9",
+  ISBN =         "3-540-62600-X (Berlin softcover)",
+  ISSN =         "0302-9743",
+  LCCN =         "QA76.38 .H37 1997",
+  bibdate =      "Mon Aug 25 10:50:15 MDT 1997",
+  series =       "Lecture Notes in Computer Science",
+  acknowledgement = ack-nhfb,
+  keywords =     "Hybrid computers -- Congresses.; Real-time data
+                 processing -- Congresses.",
+}
+
+@Proceedings{Alur:1996:HSI,
+  editor =       "Rajeev Alur and T. A. (Thomas A.) Henzinger and
+                 Eduardo D. Sontag",
+  booktitle =    "Hybrid systems {III}: verification and control",
+  title =        "Hybrid systems {III}: verification and control",
+  volume =       "1066",
+  publisher =    "Springer-Verlag",
+  address =      "New York, NY, USA",
+  pages =        "ix + 618",
+  year =         "1996",
+  coden =        "LNCSD9",
+  ISBN =         "3-540-61155-X",
+  ISSN =         "0302-9743",
+  LCCN =         "QA267.A1 L43 no.1066",
+  bibdate =      "Sat Dec 21 16:06:37 MST 1996",
+  note =         "Proc. DIMACS/SYCON Workshop on
+                 Verification and Control of Hybrid Systems, organized
+                 October 22--25, 1995 at Rutgers University, New
+                 Brunswick, New Jersey",
+  series =       "Lecture Notes in Computer Science",
+  acknowledgement = ack-nhfb,
+  alttitle =     "Hybrid systems 3 Hybrid systems three",
+  annote =       "``Proc. DIMACS/SYCON Workshop on
+                 Verification and Control of Hybrid Systems, organized
+                 October 22--25, 1995 at Rutgers University, New
+                 Brunswick, New Jersey''",
+  keywords =     "Hybrid computers -- Congresses; Digital control
+                 systems -- Congresses.",
+}
+@Proceedings{Best:1993:CIC,
+  editor =       "Eike Best",
+  booktitle =    "{CONCUR} '93: 4th International Conf. on
+                 Concurrency Theory, Hildesheim, Germany, August 993:
+                 proceedings",
+  title =        "{CONCUR} '93: 4th International Conf. on
+                 Concurrency Theory, Hildesheim, Germany, August 993:
+                 proceedings",
+  volume =       "715",
+  publisher =    "Springer-Verlag",
+  address =      "New York, NY, USA",
+  pages =        "ix + 540",
+  year =         "1993",
+  coden =        "LNCSD9",
+  ISBN =         "0-387-57208-2 (New York), 3-540-57208-2 (Berlin)",
+  ISSN =         "0302-9743",
+  LCCN =         "QA76.58 .I53 1993",
+  bibdate =      "Fri Apr 12 07:38:03 1996",
+  series =       "Lecture Notes in Computer Science",
+  acknowledgement = ack-nhfb,
+  keywords =     "parallel processing (electronic computers) ---
+                 congresses",
+  xxvolume =     "4004199954",
+}
+
+@Proceedings{Grossman:1993:HS,
+  editor =       "Robert L. Grossman",
+  booktitle =    "Hybrid systems",
+  title =        "Hybrid systems",
+  volume =       "736",
+  publisher =    "Springer-Verlag",
+  address =      "New York, NY, USA",
+  pages =        "viii + 474",
+  year =         "1993",
+  coden =        "LNCSD9",
+  ISBN =         "0-387-57318-6 (New York), 3-540-57318-6 (Berlin)",
+  ISSN =         "0302-9743",
+  LCCN =         "QA76.5 .H93 1993",
+  bibdate =      "Fri Apr 12 07:14:59 1996",
+  note =         "Papers presented at a workshop held Oct. 19--21, 1992
+                 at the Technical University, Lyngby, Denmark.",
+  price =        "DM86.00",
+  series =       "Lecture Notes in Computer Science",
+  acknowledgement = ack-nhfb,
+  keywords =     "hybrid computers --- congresses",
+  xxvolume =     "4004351807",
+}
+
+@article{devanbu
+    ,author={Devanbu, P. and Rosenblum, D. and Wolf, A.}
+    ,title={Generating Testing and Analysis tools}
+    ,journal={ACM Transactions on Software Engineering and Methodology}
+    ,year=1996
+    }
+
+@inproceedings{haskell-com
+    ,author={Simon L. {Peyton Jones} and Erik Meijer and Dan Leijen}
+    ,title={Scripting {COM} Components in Haskell}
+    ,booktitle={Proceedings of 5th International Conf. on Software Reuse}
+    ,organization={IEEE/ACM}
+    ,year=1998
+    ,pages={224--233}
+    }
+
+@inproceedings{jakarta
+    ,author={Don Batory and Bernie Lofaso and Yannis Smaragdakis}
+    ,title={{JTS}: A Tool Suite for Building {GenVoca} Generators}
+    ,booktitle={Proceedings of 5th International Conf. on Software Reuse}
+    ,organization={IEEE/ACM}
+    ,year=1998
+    ,pages={}
+    }
+ 
+@inproceedings{fran-dsl
+    ,author={Conal Elliott}
+    ,title={Modeling Interactive {3D} and Multimedia Animation 
+            with an Embedded Language}
+    ,booktitle={Proc. first Conf. on 
+                Domain-Specific Languages}
+    ,organization={USENIX}
+    ,year=1997
+    ,month=Oct
+    ,pages={285-296}
+    }
+
+@book{design-patterns
+    ,author={Gamma, E. and Helm, R. and Johnson, R. and Vlissides, J.}
+    ,title={Design Pattens: Elements of Reusable Object-Oriented Software}
+    ,publisher={Addison-Wesley}
+    ,year=1995
+    }
+
+@article{little-languages
+    ,author={Jon Bentley}
+    ,title={Little Languages}
+    ,journal={CACM}
+    ,volume=29
+    ,number=8
+    ,year=1986
+    ,pages={711-721}
+    }
+ 
+@misc{tullsen-hudak-97
+    ,author={Mark Tullsen and Paul Hudak}
+    ,title={An Intermediate Meta-Language for Program Transformation}
+    ,note={submitted to 1998 ACM Symposium on Programming Language
+           Design and Implementation}
+    ,month=Nov
+    ,year=1997
+    }
+ 
+@TechReport{dynamic-code
+  ,author={John Peterson and Paul Hudak and Gary Shu Ling}
+  ,title={Principled Dynamic Code Improvement}
+  ,institution={Yale University, Department of Computer Science}
+  ,month=Jul
+  ,year=1997
+  ,type={Research Report}
+  ,number={YALEU/DCS/RR-1135}
+}
+
+@TechReport{Hugs
+  ,author={Mark P. Jones and John C. Peterson}
+  ,title={Hugs 1.4 {U}ser {M}anual}
+  ,institution={Yale University, Department of Computer Science}
+  ,year=1997
+  ,type={Research Report}
+  ,number={YALEU/DCS/RR-1123}
+}
+
+@misc{appel-hot-sliding
+    ,author={Appel, Andrew W.}
+    ,title={Hot Sliding in Standard ML}
+    ,month=Dec
+    ,year=1994
+    ,note={unpublished manuscript}
+    }
+ 
+@TechReport{sulzmann-odersky-wehr:tr-type-inference,
+  author =       "Martin Sulzmann and Martin Odersky and Martin Wehr",
+  title =        "Type {I}nference with {C}onstrained {T}ypes",
+  institution =  "Yale University, Department of Computer Science",
+  year =         1997,
+  folder =       "13-23",
+  type =         "Research Report",
+  number =       "YALEU/DCS/RR-1129",
+  month =        "April"
+}
+
+@TechReport{sulzmann:tr-records,
+  author =       "Martin Sulzmann",
+  title =        "Designing {R}ecord {S}ystems",
+  institution =  "Yale University, Department of Computer Science",
+  year =         1997,
+  folder =       "13-23",
+  type =         "Research Report",
+  number =       "YALEU/DCS/RR-1128",
+  month =        "April",
+  abstract = "We explore the design space for type systems with
+  polymorphic records.  We design record systems for extension,
+  concatenation and removal of fields.  Furthermore, we design a record
+  system where field labels become first class values.  That means, we
+  can now quantify over field lables and pass them around as arguments.
+  All designed record systems enjoy type inference with principal
+  types. Especially, we can combine any features into a new record
+  system retaining type inference with principal types.
+
+  We also point out some problems which are present in previous record
+  systems.  Our designed record systems can be seen as the proper
+  logical formulation of previous approaches with even more expressive
+  power.
+
+   We base our design on the HM(X) framework. HM(X) is a general
+  framework for Hindley/Milner type systems that are parameterized in
+  the constraint domain X. HM(X) enables us to design record systems in
+  a systematic way retaining type inference with principal types.  That
+  means, designing record systems becomes construction of constraint
+  systems which model record systems."  }
+
+@TechReport{sulzmann:tr-type-inference,
+  author =       "Martin Sulzmann",
+  title =        "Proofs of {S}oundness and {C}ompleteness of {T}ype
+  {I}nference for {HM(X)}",
+  institution =  "Yale University, Department of Computer Science",
+  year =         1997,
+  folder =       "13-23",
+  type =         "Research Report",
+  number =       "YALEU/DCS/RR-1102",
+  month =        "February"
+}
+
+@InProceedings{type-inf-constrained-types,
+  author =      "Martin Sulzmann and Martin Odersky and Martin Wehr",
+  title =       "Type Inference with Constrained Types",
+  booktitle =   "FOOL4: 4th. International Workshop on Foundations of
+Object-oriented programming Languages",
+  year =        "1997",
+  month =       "January"
+}
+
+@article{dsls-on-line
+    ,author={Paul Hudak}
+    ,title={Building Domain Specific Embedded Languages}
+    ,journal={ACM Computing Surveys}
+    ,volume={28A}
+    ,month=Dec
+    ,year=1996
+    ,pages={(electronic)}
+    }
+
+@inproceedings{Fran
+    ,author={Conal Elliott and Paul Hudak}
+    ,title={Functional Reactive Animation}
+    ,booktitle={International Conf. on Functional Programming}
+    ,month=Jun
+    ,year=1997
+    ,pages={163--173}
+    }
+
+@inproceedings{elliott98
+    ,author={Conal Elliott}
+    ,title={Functional Implementations of Continuous Modeled Animation}
+    ,booktitle={Proceedings of PLILP/ALP '98}
+    ,organization={Springer-Verlag}
+    ,year=1998
+    ,pages={}
+    }
+
+@TechReport{Haskell1.4,
+  author =       {John Peterson et. al},
+  title =        {Haskell 1.4: A Non-strict, Purely Functional Language},
+  institution =  {Department of Computer Science, Yale University},
+  year =         {1997},
+  number =       {YALEU/DCS/RR-1106},
+  month =        {Mar},
+  note =         {World Wide Web version at
+                  \fr{http://haskell.cs.yale.edu/haskell-report}}
+}
+
+@TechReport{Haskell1.3,
+  author =       {John Peterson et. al},
+  title =        {Haskell 1.3: A Non-strict, Purely Functional Language},
+  institution =  {Department of Computer Science, Yale University},
+  year =         {1996},
+  key =          {Has96},
+  number =       {YALEU/DCS/RR-1106},
+  month =        {May},
+  note =         {World Wide Web version at
+                  {\tt http://haskell.cs.yale.edu/haskell-report}}
+}
+
+@inproceedings{haskore-tutorial
+    ,author={Paul Hudak}
+    ,title={Haskore Music Tutorial}
+    ,booktitle={Second International School on Advanced Functional Programming}
+    ,publisher={Springer Verlag, LNCS 1129}
+    ,year=1996
+    ,month=Aug
+    ,pages={38-68}
+    }
+ 
+@book{ML-definition
+    ,author={Milner, R. and Tofte, M. and Harper, R.}
+    ,title={The Definition of Standard ML}
+    ,publisher={The MIT Press}
+    ,address={Cambridge, MA}
+    ,year=1990
+    }
+ 
+@phdthesis{chenphd
+    ,author={Kung Chen}
+    ,title={A Parametric Extension of Haskell's Type Classes}
+    ,school={Yale University, Department of Computer Science}
+    ,month=May
+    ,year=1994
+    }
+
+@phdthesis{miraniphd
+    ,author={Rajiv Mirani}
+    ,title={High-Level Abstractions for Parallel Functional Programming}
+    ,school={Yale University, Department of Computer Science}
+    ,month=Jul
+    ,year=1996
+    }
+
+@phdthesis{rabinphd
+    ,author={Daniel Rabin}
+    ,title={Calculi for Functional Programming with Assignment}
+    ,school={Yale University, Department of Computer Science}
+    ,month=May
+    ,year=1996
+    }
+
+@inproceedings{jones-hudak-NLP
+    ,author={Jones, M.P. and Hudak, P. and Shaumyan, S.}
+    ,title={Using Types to Parse Natural Language}
+    ,booktitle={Proceedings of Glasgow Functional Programming Workshop}
+    ,organization={IFIP}
+    ,publisher={Springer Verlag}
+    ,year=1995
+    ,pages={}
+    }
+
+@InProceedings{liang-hudak-jones:monad-transformers,
+  author =      "Sheng Liang and Paul Hudak and Mark Jones",
+  title =       "Monad Transformers and Modular Interpreters",
+  booktitle =   "22nd {ACM} Symposium on Principles of
+                 Programming Languages ({POPL '95}), {San Francisco,
+                 California}",
+  year =        "1995",
+  publisher =   "ACM Press",
+  address =     "New York",
+  month =       "January",
+  pages={333-343}
+}
+
+@phdthesis{espinosa:thesis
+    ,author={David Espinosa}
+    ,title={Semantic Lego}
+    ,school={Columbia University}
+    ,year=1995
+    }
+
+@Unpublished{espinosa:modular,
+  author =      "David Espinosa",
+  title =       "Modular Denotational Semantics",
+  note =        "Unpublished manuscript",
+  year =        "1993",
+  month =       "December",
+}
+
+@InProceedings{liang-hudak:modular-semantics,
+  author =      "Sheng Liang and Paul Hudak",
+  title =       "Modular Denotational Semantics for Compiler
+                 Construction",
+  booktitle =   "European Symposium on Programming",
+  year =        "1996",
+  month =       "April"
+}
+
+@PhDThesis{liang:thesis,
+  author =      "Sheng Liang",
+  title =       "Modular Monadic Semantics and Compilation",
+  school =      "Yale University, Department of Computer Science",
+  year =        "1998",
+  month =       "May"
+}
+
+@InProceedings{steele:building,
+  author =      "Guy L. {Steele Jr.}",
+  title =       "Building Interpreters by Composing Monads",
+  pages =       "472--492",
+  booktitle =   "Conf. Record of {POPL '94}: 21st {ACM
+                 SIGPLAN-SIGACT} Symposium on Principles of
+                 Programming Languages, {Portland, Oregon}",
+  year =        "1994",
+  publisher =   "ACM Press",
+  address =     "New York",
+  month =       "January"
+}
+
+@article{ernoult-mycroft-95
+    ,author={Ernoult, C. and Mycroft, M.}
+    ,title={Untyped strictness analysis}
+    ,journal={Journal of Functional Programming}
+    ,volume=5
+    ,number=1
+    ,year=1995
+    ,pages={37-49}
+    }
+
+@inproceedings{Bur95,
+  author = {C. T. P. Burton},
+  title = {Conceptual structures for recursion},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {179-194}}
+
+@inproceedings{Cla95,
+  author = {C. Clack and C. Myers},
+  title = {The dys-functional student},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {289-309}}
+
+@inproceedings{Dav95,
+  author = {A. Davison},
+  title = {Teaching {C} after {Miranda}},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {35-50}}
+
+@inproceedings{Fok95,
+  author = {J. Fokker},
+  title = {Explaining algebraic theory with functional programs},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {139-158}}
+
+@inproceedings{Har95,
+  author = {P. H. Hartel and B. van Es and D. Tromp},
+  title = {Basic proof skills of computer science students},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {269-288}}
+
+@inproceedings{Hil95,
+  author = {E. Hilsdale and J. M. Ashley and R. K. Dybvig and D. P. Friedman},
+  title = {Compiler construction using Scheme},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {251-268}}
+
+@inproceedings{Jac95,
+  author = {J.-P. Jacquot and J. Guyard},
+  title = {Requirements for an ideal first language},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {51-64}}
+
+@inproceedings{Jar95,
+  author = {S. Jarvis and S. Poria and R. Morgan},
+  title = {Understanding {LOLITA}: Experiences in teaching large scale functional programming},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {103-120}}
+
+@inproceedings{Kar95,
+  author = {J. Karczmarczuk},
+  title = {Functional programming and mathematical objects},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {121-138}}
+
+@inproceedings{Ker95,
+  author = {E. T. Keravnou},
+  title = {Introducing computer science undergraduates to principles of programming through a functiona
+l language},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {15-34}}
+
+@inproceedings{Klu95,
+  author = {W. E. Kluge and C. Rathsack and S.-B. Scholz},
+  title = {Using $\pi$-{\sc red} as a teaching tool for functional programming and program execution},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {231-250}}
+
+@inproceedings{Koo95,
+  author = {P. Koopman and V. Zweije},
+  title = {Functional programming in a basic database course},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {215-230}}
+
+@inproceedings{Les95,
+  author = {D. Lester and S. Mintchev},
+  title = {Inducing students to induct},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {159-178}}
+
+@inproceedings{Nun95,
+  author = {M. N\'u\~nez and P. Palao and R. Pe\~na},
+  title = {A second year course on data structures based on functional programming},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {65-84}}
+
+@inproceedings{ODo95,
+  author = {J. O'Donnell},
+  title = {From transistors to computer architecture: Teaching functional circuit specification in Hydr
+a},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {195-214}}
+
+@inproceedings{Tho95,
+  author = {S. Thompson and S. Hill},
+  title = {Functional programming through the curriculum},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {85-102}}
+
+@inproceedings{Tur95,
+  author = {D. A. Turner},
+  title = {Elementary strong functional programming},
+  booktitle = {Functional programming languages in education ({FPLE}), {LNCS} 1022},
+  editor = {P. H. Hartel and M. J. Plasmeijer},
+  publisher = {Springer-Verlag, Heidelberg},
+  address = {Nijmegen, The Netherlands},
+  month = {Dec},
+  year = {1995},
+  pages = {1-13}}
+
+@book{revesz
+    ,author={Revesz, G.}
+    ,title={Lambda Calculus, Combinators, and Functional Programming}
+    ,publisher={Cambridge University Press}
+    ,address={Cambridge}
+    ,year=1988
+    }
+
+@inproceedings{hudakberger95
+    ,author={Hudak, P. and Berger, J.}
+    ,title={A Model of Performance, Interaction, and Improvisation}
+    ,booktitle={Proceedings of International Computer Music Conf.}
+    ,organization={International Computer Music Association}
+    ,year=1995
+    }
+ 
+@article{arya94
+    ,author={Arya, K.}
+    ,title={A Functional Animation Starter-Kit}
+    ,journal={Journal of Functional Programming}
+    ,volume=4
+    ,number=1
+    ,year=1994
+    ,pages={1-18}
+    }
+ 
+@incollection{musickit
+    ,author={Jaffe, D. and Boynton, L.}
+    ,title={An Overview of the Sound and Music Kits for the
+            {NeXT} Computer}
+    ,booktitle={The Well-Tempered Object}
+    ,publisher={MIT Press}
+    ,year=1991
+    ,editor={Pope, S.T.}
+    ,pages={107-118}
+    }
+ 
+@incollection{balaban92
+    ,author={Balaban, M.}
+    ,title={Music Structures: Interleaving the Temporal and Hierarchical
+            Aspects of Music}
+    ,booktitle={Understanding Music With AI}
+    ,publisher={AAAI Press}
+    ,year=1992
+    ,editor={Balaban, M. and Ebcioglu, K. and Laske, O.}
+    ,pages={110-139}
+    }
+ 
+@inproceedings{grame94
+    ,author={Orlarey, O. and Fober, D. and Letz, S. and Bilton, M.}
+    ,title={Lambda Calculus and Music Calculi}
+    ,booktitle={Proceedings of International Computer Music Conf.}
+    ,organization={International Computer Music Association}
+    ,year=1994
+    }
+ 
+@article{berger-91
+    ,author={Berger, J.}
+    ,title={A Theory of Musical Ambiguity}
+    ,journal={Journal of Computers in Music Research}
+    ,volume="II"
+    ,year=1991
+    }
+ 
+@techreport{huberman-hogg-94
+    ,author={Huberman, B. and Hogg, T.}
+    ,title={Communities in Practice: Performance and Evolution}
+    ,institution={Dynamics of Computation Group, Xerox PARC}
+    ,year=1994
+    }
+
+@book{rapoport
+    ,author={Rapoport, A.}
+    ,title={N-Person Game Theory}
+    ,publisher={University of Michigan Press}
+    ,address={Ann Arbor}
+    ,year=1970
+    }
+ 
+@book{luce-raiffa
+    ,author={Luce, D. and Raiffa, H.}
+    ,title={Games and Decisions}
+    ,publisher={John Wiley and Sons}
+    ,address={New York}
+    ,year=1957
+    }
+ 
+@incollection{ames-domino-92
+    ,author={Ames, C. and Domino, M.}
+    ,title={Cybernetic Composer: An Overview}
+    ,booktitle={Understanding Music with AI: Perspectives on Music Cognition}
+    ,publisher={AAAI Press/MIT Press}
+    ,year=1992
+    ,editor={Balaban, M. and Ebcioglu, K. and Laske, O.}
+    ,pages={186-205}
+    }
+ 
+@incollection{baggi-92
+    ,author={Baggi, D.L.}
+    ,title={NeurSwing: An Intelligent Workbench for the Investigation
+            of Swing in Jazz}
+    ,booktitle={Readings in Computer-Generated Music}
+    ,publisher={IEEE Computer Society Press}
+    ,year=1992
+    ,editor={Baggi, D.L.}
+    ,pages={79-94}
+    }
+ 
+@incollection{johnson-laird-91
+    ,author={Johnson-Laird, P.N.}
+    ,title={Jazz Improvisation: A Theory at the Computational Level}
+    ,booktitle={Representing Musical Structure}
+    ,publisher={Academic Press}
+    ,year=1991
+    ,editor={Howell, P. and West, R. and Cross, I.}
+    ,pages={291-325}
+    }
+ 
+@inproceedings{fpca95:parafun
+    ,author={Mirani, Rajiv and Hudak, Paul}
+    ,title={First Class Schedules and Virtual Maps}
+    ,booktitle = "Proceedings of Conf. on Functional Programming
+                  Languages and Computer Architecture"
+    ,organization={ACM/IFIP}
+    ,month=Jun
+    ,year=1995
+    ,pages={78--85}
+    }
+
+@InProceedings{popl95:monadint,
+  author =      "Sheng Liang and Paul Hudak and Mark Jones",
+  title =       "Monad Transformers and Modular Interpreters",
+  booktitle ={Proceedings of 22nd ACM Symposium on Principles of
+              Programming Languages},
+  year =        "1995",
+  publisher =   "ACM Press",
+  address =     "New York",
+  month =       "January",
+  pages={333-343}
+}
+
+@TechReport{Haskell-vs-ada,
+  author = 	"Hudak, P. and Jones, M.P.",
+  title = 	"Haskell vs. Ada vs. C++ vs. Awk vs. ...
+                 An Experiment in Software Prototyping Productivity",
+  institution = "Department of Computer Science, Yale University",
+  year = 	"1994",
+  type = 	"Research Report",
+  number = 	"YALEU/DCS/RR-1049",
+  address = 	"New Haven, CT",
+  month = 	"Oct",
+  note  =       "Available from
+                {\tt http://haskell.org/practice.html}"
+  }
+
+@article{hutton
+    ,author={Hutton, G.}
+    ,title={Combinator Parsing}
+    ,journal={Journal of Functional Programming}
+    ,year=1993
+    }
+
+@article{haskore
+    ,author={Hudak, P. and Makucevich, T. and 
+             Gadde, S. and Whong, B.}
+    ,title={Haskore Music Notation -- An Algebra of Music}
+    ,month=May
+    ,year=1996
+    ,volume=6
+    ,number=3
+    ,pages={465--483}
+    ,journal={Journal of Functional Programming}
+    }
+ 
+@misc{haskore-old
+    ,author={Hudak, P. and Makucevich, T. and 
+             Gadde, S. and Whong, B.}
+    ,title={Haskore Music Notation -- An Algebra of Music}
+    ,month=Sep
+    ,year=1994
+    ,note={To appear in the Journal of Functional Programming; 
+           preliminary version available via\\
+{\tt ftp://nebula.systemsz.cs.yale.edu/pub/yale-fp/papers/haskore/hmn-lhs.ps}}
+    }
+ 
+@article{milner-turing
+    ,author={Milner, R.}
+    ,title={Elements of Interaction}
+    ,journal={CACM}
+    ,volume=36
+    ,number=1
+    ,year=1993
+    ,month=Jan
+    ,pages={78--89}
+    }
+
+@incollection{salishan-book-chapter
+        ,author="Hudak, P. and Anderson, S."
+        ,title="{H}askell Solutions to the Language Session Problems
+                at the 1988 {S}alishan {H}igh-{S}peed {C}omputing {C}onference"
+        ,booktitle={A Comparative Study of Parallel Programming Languages:
+                    The Salishan Problems}
+        ,publisher={North-Holland, Amsterdam}
+        ,editor={Feo, J.T.}
+        ,year=1992
+        }
+
+@article{canon
+    ,author={Dannenberg, R.B.}
+    ,title={The {C}anon Score Language}
+    ,journal={Computer Music Journal}
+    ,volume=13
+    ,number=1
+    ,year=1989
+    ,pages={47-56}
+    }
+ 
+@techreport{csound
+    ,author={Vercoe, B.}
+    ,title={Csound: A Manual for the Audio Processing System
+            and Supporting Programs}
+    ,institution={MIT Media Lab}
+    ,year=1986
+    }
+ 
+@article{pla
+    ,author={Schottstaedt, B.}
+    ,title={PLA: A Composer's Idea of a Language}
+    ,journal={Computer Music Journal}
+    ,volume=7
+    ,number=1
+    ,year=1983
+    ,pages={11-20}
+    }
+ 
+@inproceedings{moxie
+    ,author={Collinge, D.}
+    ,title={Moxie: A Languge for Computer Music Performance}
+    ,booktitle={Proc. International Computer Music Conf.}
+    ,organization={Computer Music Association}
+    ,year=1984
+    ,pages={217-220}
+    }
+ 
+@incollection{formula
+    ,author={Anderson, D.P. and Kuivila, R.}
+    ,title={Formula: A Programming Language for Expressive Computer Music}
+    ,booktitle={Computer Generated Music}
+    ,publisher={IEEE Computer Society Press}
+    ,year=1992
+    ,editor={Denis Baggi}
+    }
+
+@incollection{fugue
+    ,author={Dannenberg, R.B. and Fraley, C.L. and Velikonja, P.}
+    ,title={A Functional Language for Sound Synthesis with
+            Behavioral Abstraction and Lazy Evaluation}
+    ,booktitle={Computer Generated Music}
+    ,publisher={IEEE Computer Society Press}
+    ,year=1992
+    ,editor={Denis Baggi}
+    }
+
+@incollection{scoresynth
+    ,author={Haus, G. and Sametti, A.}
+    ,title={ScoreSynth: A System for the Synthesis of Music Scores
+            Based on Petri Nets and a Music Algebra}
+    ,booktitle={Computer Generated Music}
+    ,publisher={IEEE Computer Society Press}
+    ,year=1992
+    ,editor={Denis Baggi}
+    }
+
+@misc{midi
+    ,key={IMA}
+    ,title={MIDI 1.0 Detailed Specification: Document Version 4.1.1}
+    ,publisher={International MIDI Association}
+    ,address={Los Angeles, CA}
+    ,month=Feb
+    ,year=1990
+    }
+
+@inproceedings{formes
+    ,author={Cointe, P. and Rodet, X.}
+    ,title={Formes: an Object and Time Oriented System
+            for Music Composition and Synthesis}
+    ,booktitle={Proc. 1984 ACM Symposium on Lisp and 
+                Functional Programmming}
+    ,organization={ACM}
+    ,year=1984
+    ,pages={85-95}
+    }
+
+@misc{common-music
+    ,key={CM}
+    ,title={Common Music}
+    ,note={Unpublished release notes.}
+    }
+ 
+@book{forte
+    ,author={Forte, A.}
+    ,title={The Structure of Atonal Music}
+    ,publisher={Yale University Press}
+    ,address={New Haven, CT}
+    ,year=1973
+    }
+
+@book{hindemith
+    ,author={Hindemith, P.}
+    ,title={Elementary Training for Musicians}
+    ,publisher={Associated Music Publishers}
+    ,address={New York}
+    ,edition=2
+    ,year=1949
+    }
+ 
+@inproceedings{rapide
+    ,author={Luckham, D. and Vera, J. and Bryan, D. and Augustin, L. and
+             Belz, F.}
+    ,title={Partial Orderings of Event Sets and Their Application to
+             Prototyping Concurrent Timed Systems}
+    ,booktitle={Proceedings of Software Technology Conf.}
+    ,organization={DARPA}
+    ,year=1992
+    ,pages={443-457}
+    }
+
+@inproceedings{griffin
+    ,author={Harrison, M.C. and Hsieh, C-H. and Laufer, C. and Henglein, F.}
+    ,title={Polymorphism and Type Abstraction in the {G}riffin Prototyping
+            Language}
+    ,booktitle={Proceedings of Software Technology Conf.}
+    ,organization={DARPA}
+    ,year=1992
+    ,pages={458-470}
+    }
+
+@inproceedings{proteus
+    ,author={Mills, P. and Reif, J.H. and Nyland, L.S. and Prins, J.F.}
+    ,title={Prototyping High-Performance Parallel Computing Applications
+            in {P}roteus}
+    ,booktitle={Proceedings of Software Technology Conf.}
+    ,organization={DARPA}
+    ,year=1992
+    ,pages={433-442}
+    }
+
+@techreport{NSWC-spec
+    ,author={Caruso, J.}
+    ,title={Prototyping Demonstration Problem for the Prototech
+            HiPer-D Joint Prototyping Demonstration Project}
+    ,institution={Naval Surface Warfare Center}
+    ,type={CCB Report}
+    ,number={0.2}
+    ,month=Aug
+    ,year=1993
+    ,annote={Last modified October 27, 1993; further changes specified by
+           J.~Caruso are described in "Addendum to Prototyping Demonstration
+           Problem for the Prototech HiPer-D Joint Prototyping Demonstration
+           Project," November 9, 1993.}
+    }
+
+@article{kishonhudak95
+    ,author =      "Kishon, A. and Hudak, P."
+    ,title =       "Semantics-Directed Program Execution Monitoring"
+    ,journal=      "Journal of Functional Programming"
+    ,volume=5
+    ,number=4
+    ,month=Oct
+    ,year=1995
+    }
+
+@book{salishan-book
+    ,author={Feo, J.T.}
+    ,title={A Comparative Study of Parallel Programming Languages:
+            The Salishan Problems}
+    ,publisher={North-Holland}
+    ,address={Amsterdam}
+    ,year=1992
+    }
+ 
+@techreport{runciman-rt
+    ,author={Wallace, M. and Runciman, C.}
+    ,title={Extending a Functional Programming System for
+            Embedded Real-Time Applications}
+    ,institution={Department of Computer Science, University of York}
+    ,type={Technical Report}
+    ,month=Apr
+    ,year=1994
+    }
+
+@TechReport{parmonads,
+  author = 	"Jones, M.P. and Hudak, P.",
+  title = 	"Implicit and Explicit Parallel Programming in Haskell",
+  institution = "Department of Computer Science, Yale University",
+  year = 	"1993",
+  type = 	"Research Report",
+  number = 	"YALEU/DCS/RR-982",
+  address = 	"New Haven, Connecticut",
+  month = 	"Nov"
+  }
+
+@misc{rt-erlang
+    ,author={Persson, M. and Odling, K. and Eriksson, D.}
+    ,title={A Switching Software Architecture Prototype 
+            Using Real Time Declarative Language}
+    ,institution={Ericsson Business Communication AB}
+    ,year=1993
+    }
+ 
+@misc{erlang
+    ,author={Armstrong, J.L and Virding, S.R.}
+    ,title={Erlang -- An Experimental Telephony Programming Language}
+    ,institution={Computer Science Laboratory, Ellemtel Etvecklings AB}
+    ,month=Jun
+    ,year=1990
+    }
+
+@book{ADA:83,
+  key = "Ada",
+  title = "Reference Manual for the ADA Programming Language",
+  publisher =  "U.S. Department of Defense",
+  year =  "1983"
+}
+
+@book{OCCAM:83,
+  key = "Occam",
+  title = "OCCAM Programming Manual",
+  publisher =  "INMOS Limited",
+  year =  "1983"
+}
+
+@Article{CSP:78,
+  author = "C.A.R. Hoare",
+  title = "Communicating Sequential Processes",
+  journal = "Comm. of the ACM",
+  volume = "21",
+  number =  "8", 
+  month = "August",  
+  year = "1978", 
+  pages = "666-677"
+}
+
+@InProceedings{esterel,
+  author = "Gerard  Berry and L. Cosserat",
+  title = "The ESTEREL Synchronous Programming Language
+           and its Mathematical Semantics", 
+  booktitle = "Seminar on Concurrency",
+  editor =  "S.D. Brookes, A.W. Roscoe and G. Winskel, editors",
+  volume = "197",
+  pages = "389-448",
+  series = "Lect. Notes in Computer Science",
+  publisher =  "Springer Verlag", 
+  year = "1985"
+}
+
+@InProceedings{signal,
+	author = "Thierry Gautier and Paul Le Guernic and Loic Besnard", 
+	title = "SIGNAL: A Declarative Language For Synchronous Programming
+                 of Real-Time Systems",
+	booktitle = "Functional Programming Languages and Computer 
+                     Architecture", 
+	editor = "Gilles Kahn",
+	volume = "274",
+	pages = "257-277",
+	series = "Lect Notes in Computer Science, 
+                  edited by G. Goos and J. Hartmanis",
+	publisher = "Springer-Verlag",
+	year = "1987"
+}
+
+@InProceedings{ada9x-rt,
+	author = "Mike Kamrad and Jim Hassett",
+	title = "Applying Ada9X to Two Real Time Applications:  A Case Study",
+	booktitle = "Ada - Europe '93",
+	editor = "Michel Gauthier",
+	volume = "688",
+	pages = "79-94",
+	series = "Lecture  Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "June",
+	year = "1993"
+}
+
+@InProceedings{ISL,
+	author = "Asis Goswami and Michael Bell and Mathai Joseph",
+	title = "ISL: An Interval Logic for the Specification
+                 of Real-time Programs",
+	booktitle ="Formal Techniques in Real-Time and Fault-Tolerant Systems",
+	editor = "J. Vytopil",
+	volume = "571",
+	pages = "1-21",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "January",
+	year = "1992"
+}
+
+@InProceedings{rlucid,
+	author = "John A. Plaice",
+	title = "RLucid, a general real-time dataflow language ",
+	booktitle ="Formal Techniques in Real-Time and Fault-Tolerant Systems",
+	editor = "J. Vytopil",
+	volume = "571",
+	pages = "363-374",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "January",
+	year = "1992"
+}
+
+@InProceedings{Z-RTL,
+	author = "C. J. Fidge",
+	title = "Specification and Verification of Real-Time Behaviour
+                 Using Z and RTL",
+	booktitle ="Formal Techniques in Real-Time and Fault-Tolerant Systems",
+	editor = "J. Vytopil",
+	volume = "571",
+	pages = "393-410",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "January",
+	year = "1992"
+}
+
+@InProceedings{TAM,
+	author = "D.J. Scholefield and H.S.M. Zedan",
+	title = "TAM: A Formal Framework for the Development of 
+                 Distributed Real-Time Systems",
+	booktitle ="Formal Techniques in Real-Time and Fault-Tolerant Systems",
+	volume = "571",
+	editor = "J. Vytopil",
+	pages = "411-428",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "January",
+	year = "1992"
+}
+
+
+@InProceedings{asynch-esterel,
+	author = "Martin Richard and Olivier Roux",
+	title = "An Attempt to Confront Asynchronous Reality to
+                 Synchronous Modelization in the ESTEREL Language",
+	booktitle ="Formal Techniques in Real-Time and Fault-Tolerant Systems",
+	volume = "571",
+	editor = "J. Vytopil",
+	pages = "429-450",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "January",
+	year = "1992"
+}
+
+@InProceedings{rt-csp,
+	author = "Frank de Boer and Jozef Hooman",
+	title = "The Real-Time Behaviour of Asynchronously
+                 Communicating Processes",
+	booktitle ="Formal Techniques in Real-Time and Fault-Tolerant Systems",
+	editor = "J. Vytopil",
+	volume = "571",
+	pages = "451-472",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "January",
+	year = "1992"
+}
+
+@InProceedings{baeten-bergstra,
+	author = "J.C.M. Baeten and J.A. Bergstra",
+	title = "Asynchronous Communication in Real Space Process Algebra",
+	booktitle ="Formal Techniques in Real-Time and Fault-Tolerant Systems",
+	editor = "J. Vytopil",
+	volume = "571",
+	pages = "473-492",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "January",
+	year = "1992"
+}
+
+@InProceedings{RAISE,
+	author = "Chris George",
+	title = "The RAISE Specification Language A Tutorial",
+	booktitle = "VDM '91 Formal Software Development Methods",
+	editor = "S. Prehn and W.J. Toetenel",
+	volume = "552",
+	pages = "238-319",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "October",
+	year = "1991"
+}
+
+@InProceedings{good-young,
+	author = "Donald I. Good and William D. Young",
+	title = "Mathematical Methods for Digital Systems Development",
+	booktitle = "VDM '91 Formal Software Development Methods",
+	editor = "S. Prehn and W.J. Toetenel",
+	volume = "552",
+	pages = "406-430",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "October",
+	year = "1991"
+}
+
+@InProceedings{timed-proc-alg,
+	author = "Xavier Nicollin and Joseph Sifakis",
+	title = "An Overview and Synthesis on Timed Process Algebras",
+	Booktitle = "Computer Aided Verification",
+	editor = "K.G. Larsen and A. Skou",
+	volume = "575",
+	pages = "376-398",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "July",
+	year = "1991"
+}
+
+
+@InProceedings{action-tranducers,
+	author = "Frits Vaandrager and Nancy Lynch",
+	title = "Action Transducers and Timed Automata",
+	Booktitle = "CONCUR '92",
+	editor = "W.R. Cleaveland",
+	volume = "630",
+	pages = "436-455",
+	series = "Lecture Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "August",
+	year = "1991"
+}
+
+@InProceedings{hard-rt-ada,
+	author = "Nasser Kettani and Vincent Celier",
+	title = "Toward a Secondary Standard for Hard Real-Time Ada:
+                 The Real-Time Rapporteur Group",
+	booktitle = "Ada - Europe '93",
+	editor = "Michel Gauthier",
+	volume = "688",
+	pages = "330-352",
+	series = "Lecture  Notes in Computer Science",
+	publisher = "Springer-Verlag",
+	month = "June",
+	year = "1993"
+}
+
+@Article{rt-lisp,
+	author = "James R. Allard and Lowell B. Hawkinson",
+	title = "Real-Time Programming in Common Lisp",
+	journal ="Communications  of the ACM",
+	volume = "34",
+	number = "9",
+	pages = "65-69",
+	publisher = "ACM",
+	month = "September",
+	year = "1991"
+
+}
+@Article{fpos:jones-sinclair,
+	author = "S.B. Jones and A.F. Sinclair",
+	title = "Functional Programming and Operating Systems",
+	journal = "The Computer Journal 
+                  (Special Issue of Lazy Functional Programming)",
+	volume = "32",
+	number = "2",
+	pages = "162-172",
+	publisher = "Cambridge University Press",
+	month = "April",
+	year = "1989"
+}
+
+@Article{ieee-oores:92,	
+	author = "Thomas E. Bihari and Prabha Gopinath",
+	title = "Object-Oriented Real-Time Systems:  Concepts and Examples",
+	journal = "Computer",
+	volume = "25",
+	number = "12",
+	pages = "25-32",
+	publisher = "IEEE",
+	month = "December",
+	year = "1992"
+}
+
+@InProceedings{lustre,
+	author = "Paul Caspi and Halbwachs Halbwachs and Nicolas Pilaud and John A. Plaice",
+	title = "LUSTRE: A declarative language for programming 
+                 synchronous systems",
+        booktitle = "the Symposium on Principles of Programming
+                    Languages ({POPL} '87)", 
+        month = "January",
+        year =  "1987"
+}
+
+@Book{wadge-ashcroft:85,
+	author = "W.W. Wadge and E.A. Ashcroft",
+	title = "Lucid, the Dataflow Programming Language",
+	publisher = "Academic Press U.K.",
+	year =  "1985"
+}
+
+@Book{burns-wellings:89,
+	author = "A. Burns and A.J. Wellings",
+	title = "Real-time systems and their programming languages",
+	publisher = "Addison Wesley",
+	year = "1989"
+}  
+
+@Article{spj:89,
+	author = "Simon L. {Peyton Jones}",
+	title = "Parallel Implementations of functional programming languages",
+	journal = "The Computer Journal",
+	volume = "32",
+	number = "2",
+	pages =  "175-186",
+	publisher =  "Cambridge University Press",
+	month = "April",
+	year = "1989"
+}  
+
+@Article{wirth:77,
+	author =  "Niklaus Wirth",
+	title = "Design and Implementation of Modula",
+	journal = "Software Practice and Experience",
+	volume = "7",
+	number = "1",
+	pages = "67-84",
+	month = "January",
+	year = "1977"
+}
+
+@Article{burns-review:91,
+	author = "Alan Burns",
+	title = "Scheduling hard real-time systems: a review",
+	journal = "Software Engineering Journal", 
+	volume = "6",
+	number = "3",
+	pages = "116-128",
+	month = "May",
+	year =  "1991"
+}
+
+@InProceedings{reppy-cml:91,
+	author = "John H. Reppy",
+	title = "CML:  A higher-order concurrent language",
+	booktitle = "Conf. on Programming Language Design 
+                     and Implementation", 
+	organization = "SIGPLAN",
+	pages = "293-305",
+	month = "June",
+	year = "1991" 
+}
+  
+@InProceedings{SETSS:92,
+	author = "J.L. Armstrong and B. O. Dacker
+                  and S.R. Virding and M.C. Williams",
+	title = "Implementing a functional language for highly parallel 
+                 real time applications", 
+	booktitle =  "Proceedings of SETSS 92, Florence",
+	month = "April",
+	year =  "1992"
+}
+
+@InProceedings{wallace-runciman:R73,
+	author = "Malcolm Wallace and Colin Runciman",
+	title = "An incremental garbage collector
+                for embedded real-time systems",
+	booktitle ="in Proc. Winter Meeting, PMG-R73",
+	organization = "Chalmers University of Technology, Gothenburg, Sweden",
+	month  = "June",
+	year = "1993"  
+}
+
+@techreport{NSWC-haskell
+    ,author={Carlson, W.E. and Hudak, P. and Jones, M.P.}
+    ,title={An Experiment Using {H}askell To Prototype
+            "Geometric Region Servers" for Navy Command And Control}
+    ,institution={Department of Computer Science, Yale University}
+    ,type={Research Report}
+    ,number={1031}
+    ,month=Nov
+    ,year=1993
+    }
+
+@misc{NSWC-report
+    ,author={Lee, J.A.N. and Blum, B. and Kanellakis, P. and Crisp, H.
+             and Caruso, J.A.}
+    ,title={{ProtoTech HiPer-D Joint Prototyping Demonstration Project}}
+    ,note={Unpublished; 400 pages}
+    ,month=Feb
+    ,year=1994
+    }
+
+@inproceedings{lo-ml92,
+	author = {L\"aufer, Konstantin and Odersky, Martin},
+	title = {An Extension of {ML} with First-Class Abstract Types},
+	month = {June},
+	year = {1992},
+	booktitle = {Proc. Workshop on ML and its Applications}
+}
+
+@InProceedings{orh:assignment,
+  author = 	"Martin Odersky and Dan Rabin and Paul Hudak",
+  title = 	"Call-by-name, Assignment, and the Lambda Calculus",
+  booktitle =	{Proc. Twentieth Annual {ACM} Symposium
+                 on Principles of Programming Languages, Charleston,
+                 South Carolina},
+  pages =	"43-57",
+  year = 	"1993",
+  month = 	"January"
+}
+
+@TechReport{or:assignment-tr-revised,
+  author = 	"Martin Odersky and Dan Rabin",
+  title = 	"The Unexpurgated Call-by-name, Assignment, and the
+                 Lambda-Calculus, Revised Report",
+  institution = 	"Department of Computer Science, Yale
+                 University",
+  year = 	"1993",
+  type = 	"Research Report",
+  number = 	"YALEU/DCS/RR-930",
+  address = 	"New Haven, Connecticut",
+  month = 	"May",
+}
+
+@TechReport{od:lamnu-report,
+  author = 	"Martin Odersky",
+  title = 	"A Syntactic Theory of Local Names",
+  institution = "Yale University",
+  year = 	"1993",
+  number = 	"YALEU/DCS/RR-965",
+  month = 	"May"
+}
+
+@TechReport{odersky:critical-pairs,
+  author = 	"Martin Odersky",
+  title = 	"A Syntactic Method for Proving Operational
+		 Equivalences",
+  institution =	{Department of Computer Science, Yale University},
+  type =	{Research Report},
+  number =	{YALEU/DCS/RR-964},
+  year = 	"1993",
+  month = 	"May"
+}
+
+@TechReport{tyinf:ptc,
+  author = 	"Kung Chen and Martin Odersky and Paul Hudak",
+  title = 	"Type Inference for Parametric Type Classes",
+  institution = 	"Yale University",
+  year = 	"1992",
+  OPTtype = 	"",
+  number = 	"YALEU/DCS/RR-900",
+  OPTaddress = 	"",
+  month = 	"June",
+  OPTnote = 	""
+}
+
+@TechReport{chen-odersky:tlvar,
+  author = 	"Kung Chen and Martin Odersky",
+  title = 	"A Type System for a Lambda Calculus with Assignments",
+  institution = 	"Yale University",
+  year = 	"1993",
+  OPTtype = 	"",
+  number = 	"YALEU/DCS/RR-963",
+  OPTaddress = 	"",
+  month = 	"May",
+  OPTnote = 	""
+}
+
+% Added Thu Oct 22 14:11:21 1992
+% Modified Mon Oct 26 14:10:20 1992
+@TechReport{odersky-rabin-hudak:assignment-conf-tr,
+  author = 	"Martin Odersky and Dan Rabin and Paul Hudak",
+  title = 	"Call-by-name, Assignment, and the Lambda-calculus",
+  institution = 	"Department of Computer Science, Yale
+                 University",
+  year = 	"1992",
+  type = 	"Research Report",
+  number = 	"YALEU/DCS/RR-929",
+  address = 	"New Haven, Connecticut",
+  month = 	"October",
+  status =	{binder-14}
+}
+
+% Added Thu Oct 22 14:13:04 1992
+@TechReport{odersky-rabin:assignment-tr,
+  author = 	"Martin Odersky and Dan Rabin",
+  title = 	"The Unexpurgated Call-by-name, Assignment, and the
+                 Lambda-Calculus",
+  institution = 	"Department of Computer Science, Yale
+                 University",
+  year = 	"1993",
+  type = 	"Research Report",
+  number = 	"YALEU/DCS/RR-930",
+  address = 	"New Haven, Connecticut",
+  month = 	"May",
+}
+@misc{ansicl,
+	title = "X3.226, 199x, Programming Language Common Lisp",
+	note = "Draft proposed American National Standard",
+	editor = "Kent Pitman and Kathy Chapman and Richard P. Gabriel
+		and Sandra Loosemore",
+	publisher = "Global Engineering Documents",
+	year = 1992
+	}
+
+@TechReport{mpj:partial-explosion,
+  author =      "Mark P. Jones",
+  title =       "Partial Evaluation for Dictionary-free Overloading",
+  institution =  "Department of Computer Science, Yale University",
+  year =        "1993",
+  type =        "Research Report",
+  number =      "YALEU/DCS/RR-959",
+  address =     "New Haven, Connecticut",
+  month =       "April",
+  note =        "Elaboration on \cite{orh:assignment}."
+}
+
+@InProceedings{mpj:prog-with-con-classes,
+  author =      "Mark P. Jones",
+  title =       "Programming with constructor classes (preliminary
+                 summary)",
+  booktitle =   {Proc. Fifth Annual Glasgow Functional
+                 Programming Workshop, Ayr, Scotland},
+  year =        "1992",
+  month =       "July"
+}
+
+@InProceedings{mpj:con-classes,
+  author =      "Mark P. Jones",
+  title =       "A system of constructor classes: overloading and
+                 implicit higher-order polymorphism",
+  booktitle =   {Proc. Conf. on Functional Programming
+                 Languages and Computer Architecture, Copenhagen, Denmark},
+  year =        "1993",
+  month =       "June"
+}
+
+@InJournal{mpj:compute-lattices,
+  author = 	"Mark P. Jones",
+  title = 	"Computing with lattices: An application of type classes",
+  journal = 	"Journal of Functional Programming, Volume 2, Part 4",
+  month = 	"October",
+  year =	"1992",
+}
+
+@Thesis{mpj:qualified-types,
+  author =	"Mark P. Jones",
+  title = 	"Qualified types: Theory and Practice",
+  degree =	"D.Phil. Thesis",
+  institution = "Programming Research Group, University of Oxford",
+  month = 	"July",
+  year =	"1992",
+  toAppear =	"To appear as PRG Technical Monograph"
+}
+
+@inproceedings{petersonjones93
+    ,author={John Peterson and Mark P. Jones}
+    ,title={Implementing Type Classes}
+    ,booktitle={Proceedings of ACM SIGPLAN Symposium on Programming
+                Language Design and Implementation}
+    ,organization={ACM SIGPLAN}
+    ,month=Jun
+    ,year=1993
+    }
+
+@InProceedings{pitts&stark,
+  author = 	"Pitts, A. and Stark, I.",
+  title = 	"On the Observable Properties of Higher Order
+		 Functions that Dynamically Create Local Names",
+  booktitle = 	"Proc. ACM SIGPLAN Workshop on State in Programming
+		 Languages, Copenhagen, Denmark",
+  year = 	"1993",
+  publisher = 	"Yale University, Department of Computer Science,
+                 Research Report YALEU/DCS/RR-968",
+  month = 	"June"
+}
+
+@phdthesis{mohrphd
+    ,author={Mohr, E.}
+    ,title={Dynamic Partitioning of Parallel Lisp Programs}
+    ,school={Yale University, Department of Computer Science}
+    ,month=Oct
+    ,year=1991
+    }
+ 
+@phdthesis{khoophd,
+   author = "Khoo, S.C.",
+   title = "Parameterized Partial Evaluation",
+   school = "Yale University, Department of Computer Science",
+   year = "1992"
+}
+
+@phdthesis{berry:thesis,
+    author = "Gerard  Berry",
+    title = "Generating Program Animators from Programming Language Semantics",
+    school = "University of Edinburgh",
+    year = 1991,
+    month = "June"
+}
+ 	
+@book{sterling:art,
+        author = "L. Sterling and E. Shapiro",
+        title = "The Art of Prolog, Advanced Programming Techniques",
+        publisher = "The MIT PRess",
+        address = "Cambridge, MA",
+        year = 1986
+}
+
+@inproceedings{toyn:snapshots,
+	author = "I. Toyn and C. Runichman",
+	title = "Adapting Combinator and SECD Machines to Display
+                 Snapshots of Functional Computations",
+	booktitle = "New Generation Computing(4)",
+	pages = "339-363",
+	year = 1986
+	}
+
+@inproceedings{bertot:occurrences,
+	author = "Y. Bertot",
+	title = "Occurrences in Debugger Specifications",
+	booktitle = "Proc. 1991 ACM Conf.
+                     on Programming Languages Design and Implementation",      
+        publisher = "ACM",
+        month = "June",
+	year = 1988
+	}
+
+@TechReport{yale-haskell,
+  author = 	"John Peterson",
+  title = 	"The {Y}ale {H}askell {U}sers {M}anual",
+  institution = "Department of Computer Science, Yale
+                 University",
+  year = 	"1992",
+  type = 	"Research Report",
+  number = 	"Version Y2.0",
+  address = 	"New Haven, Connecticut",
+  month = 	"October",
+}
+
+@phdthesis{aasaphd92
+    ,author={Aasa, A.}
+    ,title={User Defined Syntax}
+    ,school={Chalmers University of Technology}
+    ,address={Goteborg, Sweden}
+    ,year=1992
+    }
+
+@misc{karrhudak91
+    ,author={Karr, M. and Hudak, P.}
+    ,title={A Kernel Family and the Common Prototyping System}
+    ,institution={Software Options, Cambridge, MA}
+    ,type={Technical Report}
+    ,month=Jan
+    ,year=1991
+    }
+ 
+@techreport{karrsyntax90
+    ,author={Karr, M.}
+    ,title={CPL Working Notes on Grammars and Related Technology}
+    ,institution={Software Options, Cambridge, MA}
+    ,type={Technical Report}
+    ,month=Mar
+    ,year=1990
+    }
+
+@inproceedings{mauny89
+    ,author={Mauny, M.}
+    ,title={Parsers and Printers as Stream Destructors Embedded in
+            Functional Languages}
+    ,booktitle={Proc. Conf. on Functional Programming
+                Languages and Computer Architecture}
+    ,organization={ACM/IFIP}
+    ,year=1989
+    ,pages={360-370}
+    }
+
+@techreport{yacc
+    ,author={Johnson, S.C.}
+    ,title={Yacc -- Yet Another Compiler Compiler}
+    ,institution={Bell Labs}
+    ,type={Technical Report}
+    ,number={32}
+    ,year=1975
+    }
+
+@techreport{lex
+    ,author={Lesk, M.E.}
+    ,title={LEX -- A Lexical Analyzer Generator}
+    ,institution={Bell Labs}
+    ,type={Technical Report}
+    ,number={39}
+    ,year=1975
+    }
+
+@phdthesis{kishonphd,
+author = "Kishon, A.",
+title = "Theory and Art of Semantics-Directed Program Execution Monitoring",
+school = "Yale University, Department of Computer Science",
+year = "1992"
+}
+
+@inproceedings{wadler-popl92
+    ,author={Wadler, Philip}
+    ,title={The Essence of Functional Programming}
+    ,booktitle={the Symposium on Principles of Programming
+           Languages ({POPL} '92)}
+    ,organization={ACM}
+    ,month=Jan
+    ,year=1992
+    ,pages={1-14}
+    }
+
+@inproceedings{moggi89
+    ,author={Moggi, E.}
+    ,title={Computational Lambda-Calculus and Monads}
+    ,booktitle={Proceedings of Symposium on Logic in Computer Science}
+    ,organization={IEEE}
+    ,year=1989
+    ,month=Jun
+    ,pages={14--23}
+    }
+
+@inproceedings{peytonjoneswadler-popl93
+    ,author={Peyton Jones, Simon and Wadler, Philip}
+    ,title={Imperative Functional Programming}
+    ,booktitle={the Symposium on Principles of Programming
+           Languages ({POPL} '93)}
+    ,organization={ACM}
+    ,month=Jan
+    ,year=1993
+    ,note={71--84}
+    }
+
+@phdthesis{guzmanphd
+    ,author={Guzm\'an, J.}
+    ,title={On Expressing the Mutation of State in a 
+            Functional Programming Language}
+    ,school="Yale University, Department of Computer Science"
+    ,year="1993"
+    }
+
+@book{appelbook
+    ,author={Appel, A.}
+    ,title={Compiling with Continuations}
+    ,publisher={Cambridge University Press}
+    ,address={Cambridge}
+    ,year=1992
+    }
+ 
+@techreport{hudakcmadttr
+    ,author={Hudak, P.}
+    ,title={Mutable Abstract Datatypes -- or --
+            How to Have Your State and Munge It Too}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-914}
+    ,month=Dec
+    ,year=1992
+    }
+ 
+@InCollection(Filinski-continuations,
+	Author = "Filinski, A.",
+	Title = "Declarative Continuations: {A}n Investigation of
+		 Duality in Programming Language Semantics",
+	BookTitle = "Category Theory and Computer Science",
+	Pages = "224-249",
+	Editor = "Pitt, D. H.",
+	Publisher = "Springer-Verlag",
+	Address = "Berlin",
+	Note = "(Lect. Notes in Comp. Science Vol. 389)",
+	Year = "1989"
+	)
+
+@inproceedings{lfp92,
+	author = {Chen, K. and Hudak, P. and Odersky, M.},
+	title = {Parametric Type Classes},
+	month = {June},
+	year = {1992},
+        pages ={170--181},
+        publisher =   "ACM",
+	booktitle = {Proceedings of ACM Conf. on Lisp and 
+                     Functional Programming}
+}
+
+@article{haskell-tutorial
+    ,author={Hudak, Paul and Fasel, Joe}
+    ,title={A Gentle Introduction to {H}askell}
+    ,journal={ACM SIGPLAN Notices}
+    ,volume=27
+    ,number=5
+    ,month=May
+    ,year=1992
+    }
+
+@Article{fradet-le-metayer:compilation,
+  author = 	"Pascal Fradet and Daniel Le M\'{e}tayer",
+  title = 	"Compilation of Functional Languages by Program
+		 Transformation",
+  journal = 	"{ACM} Transactions on Programming Languages and
+		 Systems",
+  year = 	"1991",
+  volume = 	"13",
+  number = 	"1",
+  pages = 	"21--51",
+  month = 	"January",
+  status =	{own-journal}
+}
+
+@misc{hudak91FPCAtut
+    ,author={Hudak, P.}
+    ,title={Manipulating State in Functional Languages}
+    ,note={Tutorial given at ACM/IFIP-sponsored FPCA Conf.}
+    ,month=Aug
+    ,year=1991
+    }
+ 
+@misc{odersky91b
+    ,author={Odersky, M.}
+    ,title={Observers for Linear Types}
+    ,note={(draft)}
+    ,month=Jul
+    ,year=1991
+    }
+ 
+@techreport{abramsky90
+    ,author={Abramsky, S.}
+    ,title={Computational Interpretations of Linear Logic}
+    ,institution={Imperial College}
+    ,type={Research Report}
+    ,number={{DOC} 90/20}
+    ,month=Oct
+    ,year=1990
+    }
+
+@inproceedings{holmstrom88
+    ,author={Holmstrom, S.}
+    ,title={A Linear Functional Language}
+    ,booktitle={Proc. Workshop on the Implementation of
+                Lazy Functional Languages, PMG Report 53}
+    ,institution={Chalmers University of Technology}
+    ,year=1988
+    ,pages={13-32}
+    }
+
+@article{lafont88
+    ,author={Lafont, Y.}
+    ,title={The Linear Abstract Machine}
+    ,journal={Theoretical Computer Science}
+    ,volume=59
+    ,year=1988
+    ,pages={157-180}
+    }
+
+@techreport{rabinhudak91
+    ,author={Rabin, D. and Hudak, P.}
+    ,title={Mutable Heaps with Structure Sharing in a Pure Functional Language}
+    ,institution="Yale University, Department of Computer Science"
+    ,month=Aug
+    ,type="Research Report"
+    ,number="YALEU/DCS/RR"
+    ,year=1991
+    }
+
+@inproceedings{odonnell85
+    ,author={O'Donnell, J.}
+    ,title={Dialogues: A basis for constructing programming
+            environments}
+    ,booktitle={Proc. ACM Symposium on Language Issues in
+                Programming Environments}
+    ,organization={ACM}
+    ,year=1985
+    ,pages={19-27}
+    }
+
+@inbook{thompson89
+    ,author={Thompson, S.J.}
+    ,title={Interactive functional programs: a method and formal
+            semantics}
+    ,booktitle={Declarative Programming}
+    ,chapter=10
+    ,pages={249-285}
+    ,editors={Turner, D.A.}
+    ,year=1989
+    ,publisher={Addison Wesley}
+    }
+
+@inproceedings{dwelly89
+    ,author={Dwelly, A.}
+    ,title={Dialogue Combinators and Dynamic User Interfaces}
+    ,booktitle={Proc. Conf. on Functional Programming
+                Languages and Computer Architecture}
+    ,organization={ACM/IFIP}
+    ,year=1989
+    ,pages={371-381}
+    }
+ 
+@inproceedings{masontalcott89
+    ,author={Mason, I.A. and Talcott, Carolyn L.}
+    ,title={Axiomatizing Operational Equivalence in the Presence of
+            Side Effects}
+    ,booktitle={Proceedings of Symposium on Logic in Computer Science}
+    ,organization={IEEE}
+    ,year=1989
+    ,pages={284-293}
+    }
+
+@inproceedings{swarupetal91
+    ,author={Swarup, V. and Reddy, U. and Ireland, E.}
+    ,title={Assignments for Applicative Languages}
+    ,booktitle={Proc. Conf. on Functional Programming
+                Languages and Computer Architecture}
+    ,organization={ACM/IFIP}
+    ,year=1991
+    }
+
+@inproceedings{wakelingrunciman91
+    ,author={Wakeling, D. and Runciman, C.}
+    ,title={Linearity and Laziness}
+    ,booktitle={Proc. Conf. on Functional Programming
+                Languages and Computer Architecture}
+    ,organization={ACM/IFIP}
+    ,year=1991
+    }
+
+@inproceedings{barthetal91
+    ,author={Barth, P.S. and Nikhil, R.S. and Arvind}
+    ,title={M-Structures: Extending a Parallel, Non-Strict, Functional
+            Language with State}
+    ,booktitle={Proc. Conf. on Functional Programming
+                Languages and Computer Architecture}
+    ,organization={ACM/IFIP}
+    ,year=1991
+    }
+
+@inproceedings{wadler91a
+    ,author={Wadler, Philip}
+    ,title={Is There a Use for Linear Logic?}
+    ,booktitle={the Symposium on Partial Evaluation and Semantics Based
+                Program Manipulation}
+    ,organization={ACM/IFIP}
+    ,year=1991
+    ,pages={255-273}
+    }
+
+@inproceedings{odersky91
+    ,author={Odersky, M.}
+    ,title={How To Make Destructive Updates Less Destructive}
+    ,booktitle={Proceedings 18th Symposium on Principles of Programming
+           Languages}
+    ,organization={ACM}
+    ,month=Jan
+    ,year=1991
+    ,pages={25-36}
+    }
+
+@inproceedings{guzmanhudak91
+    ,author={Guzm\'an, J. and Hudak, P.}
+    ,title={First-order liveness analysis via type inference}
+    ,booktitle={XVII Latin American Informatics Conf.}
+    ,year=1991
+    ,month=Jul
+    }
+
+@inproceedings{henderson82
+    ,author={Henderson, P.}
+    ,title={Functional Geometry}
+    ,booktitle={Proc. 1982 ACM Symposium on Lisp and 
+                Functional Programmming}
+    ,organization={ACM}
+    ,year=1982
+    ,pages={179--187}
+    }
+
+@inproceedings{arya89
+    ,author={Arya, K.}
+    ,title={Processes in a Functional Animation System}
+    ,booktitle={Proc. Conf. on Functional Programming
+                Languages and Computer Architecture}
+    ,organization={ACM/IFIP}
+    ,year=1989
+    ,pages={382-395}
+    }
+
+@InProceedings{consel-khoo:91,
+  author =      "C. Consel and Khoo, S. C.",
+  title =       "Parameterized Partial Evaluation",
+  booktitle =   "ACM SIGPLAN Conf. on Programming Language Design and Implementation",
+  year =        "1991",
+  pages = "92-106"
+}
+
+@InProceedings{kishonhudakconsel91,
+  author =      "A. Kishon and C. Consel and P. Hudak",
+  title =       "Monitoring Semantics: a Formal Framework for Specifying,
+                 Implementing and Reasoning about Execution Monitors",
+  booktitle =   "ACM SIGPLAN Conf. on Programming Language Design 
+                 and Implementation",
+  month =	Jun,
+  year =        "1991",
+  pages = "338-352"
+}
+
+@inproceedings{baker90
+    ,key={baker}
+    ,author={Baker, Henry G.}
+    ,title={Unify and Conquer (Garbage, Updating, Aliasing, ...) in 
+            Functional Languages}
+    ,booktitle={Proc. 1990 ACM Conf. on Lisp and 
+                Functional Programmming}
+    ,year=1990
+    ,publisher={ACM}
+    }
+
+@book{K&R,
+author = "Brian W. Kernighan and Dennis M. Ritchie",
+title = "The C Programming Language",
+publisher = {Prentice-Hall},
+year = 1978
+}
+@book{DRAGON2,
+author = "A. V. Aho and R. Sethi and J. D. Ullman",
+title = "Compilers Principles, Techniques and Tools",
+publisher = "Addison-Wesley",
+year = 1987
+}
+@book{REPS,
+author = "T. W. Reps",
+title = "Generating Language-Based Environments",
+publisher = "The MIT Press",
+year = 1984
+}
+@book{SPJ,
+author = "Simon L. {Peyton Jones}",
+title = "The Implementation of Functional Programming Languages",
+publisher = {Prentice-Hall},
+year = 1987
+}
+@techreport{PFL,
+author = {S\"{o}ren Holmstr\"{o}m},
+title = "PFL: A Functional Language for Parallel Programming, and
+its Implementation",
+institution = {Programming Methodology Group, University of
+G\"{o}teborg and Chalmers University of Technology},
+year = 1983,
+month = "September",
+number = "7"
+}
+@techreport{INCTECH,
+author = "R. S. Sundaresh and P. Hudak",
+title = "A theory of incremental computation and its application",
+institution =  "Yale University, Department of Computer Science",
+year = 1990,
+month = "March",
+number = "YALEU/DCS/RR770"
+}
+@techreport{INC,
+author = "D. Yellin and R. Strom",
+title = "{INC}: A Language for Incremental Computation",
+institution = "IBM",
+year = 1989,
+month = "RC 14375(\#64375)"
+}
+@book{CCS,
+author = "Robin Milner",
+title = "A Calculus of Communicating Systems",
+publisher = {Springer-Verlag},
+year = 1981,
+volume = 81,
+series = LNCS
+}
+@incollection{HMERGE,
+author = "P. Henderson",
+title = "Purely Functional Operating Systems",
+pages = "177-189",
+editor = "J. Darlington and P. Henderson and D.A. Turner",
+booktitle = "Functional Programming and its Applications",
+publisher = {Cambridge University Press},
+year = 1982
+}
+@inproceedings{NDCLINGER,
+author = "W. Clinger",
+title = "Nondeterministic call by need is neither lazy nor by name",
+booktitle = "Proc. 1982 ACM Symp. LISP and Functional Programming",
+year = 1982
+}
+@techreport{AUSNDFL,
+author = "Harald Sondergaard and Peter Sestoft",
+title = "Nondeterminism in Functional Languages",
+institution = {Department of Computer Science, University of Melbourne},
+year = 1988,
+number = " 88/18"
+}
+@techreport{STOYE,
+author = "W. Stoye",
+title = "A New Scheme for Writing Functional Operating Systems",
+institution = {Cambridge University Computer Laboratory},
+year = 1984,
+number = "56"
+}
+@inbook{KAOS,
+author = "David Turner",
+title = "Functional Programming and Communicating Processes",
+booktitle = "PARLE Parallel Architectures and Languages Europe",
+year = 1987,
+publisher = {Springer Verlag},
+pages = "54-74",
+volume = 259,
+series = LNCS
+}
+@article{BURTON,
+author = "F. W. Burton",
+title = "Nondeterminism with Referential Transparency in Functional Programming
+Languages",
+journal = "The Computer Journal",
+year = 1988,
+volume = 31,
+number = 3,
+pages = {243-247}
+}
+@book{DIJKSTRA,
+author = "Edsger W. Dijkstra",
+title = "A Discipline of Programming",
+publisher = {Prentice-Hall},
+year = 1976
+}
+@book{AGHA1,
+author = "Gul Agha",
+title = "Actors A Model of Concurrent Computation in Distributed Systems",
+publisher = {The MIT Press},
+year = 1986
+}
+@inbook{AGHA2,
+author = "Gul Agha",
+title = "Semantic Considerations in the Actor Paradigm of Concurrent Computation",
+pages = "151-179",
+volume = 197,
+series = LNCS,
+publisher = {Springer Verlag},
+year = 1984
+}
+@book{UNITY,
+author = "K. Mani Chandy and Jayadev Misra",
+title = "Parallel Program Design",
+publisher = {Addison-Wesley},
+year = 1988
+}
+@article{LINDA,
+author = "David Gelernter",
+title = "Generative Communication in Linda",
+journal = "ACM Trans. Program. Lang. Syst.",
+year = 1985,
+month = "January",
+pages = "80-112",
+volume = 7,
+number = 1 
+}
+@article{CSP1,
+author = "C. A. R. Hoare",
+title = "Communicating Sequential Processes",
+journal = "Comm. ACM",
+year = 1978,
+pages = "666-677",
+volume = 21,
+number = 8
+}
+@book{CSP2,
+author = "C. A. R. Hoare",
+title = "Communicating Sequential Processes",
+publisher = {Prentice-Hall},
+year = 1985
+}
+@inbook{KAHN,
+author = "G. Kahn",
+chapter = "The Semantics of a simple language for Parallel Programming",
+title = "Information Processing",
+pages = "471-475",
+publisher = {North Holland},
+year = 1974,
+volume = 74
+}
+@techreport{HASKELL0,
+author = "Paul Hudak and Philip Wadler et al.",
+title = "Report on the Functional Programming Language Haskell",
+institution = "Department of Computer Science, Yale University",
+year = 1988,
+month = "December",
+number = "YALEU/DCS/RR-666"
+}
+@techreport{NEBULA,
+author = "K. Karlsson",
+title = "Nebula, a Functional Operating System",
+institution = "Chalmers University",
+year = 1981
+}
+@misc{HOPEIO,
+author = "Lee M. McLoughlin and Sean Hayes",
+title = "Interlanguage Working from a Pure Functional Language",
+howpublished = "Functional Programming mailing list",
+month = "November",
+year = 1988
+}
+@techreport{FL,
+author = "John Backus and John H. Williams and Edward L. Wimmers",
+title = "FL Language Manual (Preliminary Version)",
+institution = "IBM Almaden Research Center",
+year = 1986,
+month = "November",
+number = "RJ 5339 (54809)"
+}
+@techreport{SML-v2,
+author = "Robert Harper and Robin Milner and Mads Tofte",
+title = "The Definition of Standard ML Version 2",
+institution = "Laboratory for Foundations of Computer Science, Department of Computer Science - University of Edinburgh",
+year = 1988,
+month = "August",
+number = "ECS-LFCS-88-62"
+}
+@techreport{PONDER,
+author = "Jon Fairbairn",
+title = "Design and Implementation of a Simple Typed Language Based on the Lambda-Calculus",
+institution = "University of Cambridge Computer Laboratory",
+year = 1985,
+month = "May",
+number = 75
+}
+@inproceedings{HOPE,
+author = "Burstall and McQueen and Sanella",
+title = "HOPE: An experimental applicative language",
+booktitle = "Proceedings 1st International LISP Conf., Stanford",
+year = 1980
+}
+@techreport{ALFL,
+author = "Paul Hudak",
+title = "ALFL Reference Manual and Programmer's Guide",
+institution = "Yale University Department of Computer Science",
+year = 1984,
+month = "August",
+number = "YALEU/DCS/TR-322"
+}
+@techreport{IO,
+author = "Paul Hudak and Raman S. Sundaresh",
+title = "On the Expressiveness of Purely Functional I/O Systems",
+institution = "Yale University Department of Computer Science",
+year = 1988,
+month = "December",
+number = "YALEU/DCS/RR-665"
+}
+@inproceedings{MIRANDA,
+author = "David Turner",
+title = "Miranda: A non-strict functional language with polymorphic types",
+booktitle = "Proceedings IFIP International Conf. on Functional Programming Languages and Computer Architecture, 
+Nancy France (Springer Lecture Notes in Computer Science, vol 201)",
+year = 1985,
+month = "September"
+}
+@article{LANDIN1,
+author = "P. J. Landin",
+title = "A Correspondence between ALGOL 60 and Church's Lambda Notation",
+journal = "Comm. ACM",
+year = 1965,
+volume = 21,
+number = 11,
+pages = {931-933}
+}
+@inproceedings{FIO,
+author = "John H. Williams and Edward L. Wimmers",
+title = "Sacrificing simplicity for convenience: Where do you draw the line?",
+booktitle = "Proc. Fifteenth Annual ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages
+, San Diego, California",
+year = 1988,
+month = "January"
+}
+@techreport{SALISHAN,
+author = "Paul Hudak and Steve Anderson",
+title = "Haskell Solutions to the Language Session Problems at the 1988 Salishan High-Speed Computing Conf.",
+institution = "Yale University, Department of Computer Science",
+year = "1988",
+month = "January",
+number = "YALEU/DCS/RR-627"
+}
+@article{PF,
+author = "Paul Hudak",
+title = "Denotational Semantics of a Para-functional Programming Language",
+journal = "International Journal of Parallel Programming",
+year = 1986,
+volume = 15,
+number = 2,
+pages = {103-125}
+}
+@inproceedings{CHOCS,
+author = "Bent Thomsen",
+title = "A Calculus of Higher Order Communicating Systems",
+booktitle = "POPL",
+year = 1989
+}
+@inproceedings{MARRYD,
+author = "T. J. Marlowe and B. G. Ryder",
+title = "An Efficient Hybrid Algorithm for Incremental Data Flow
+Analysis",
+booktitle = "Conf. Record of the Seventeenth Annual ACM
+Symposium on Principles of Programming Languages",
+year = 1990
+}
+@inproceedings{CONSDAN,
+author = "C. Consel and O. Danvy",
+title = "From Interpreting to Compiling Binding times",
+booktitle = "Proc. 3rd European Symposium on Programming,
+Lecture Notes in Computer Science, Vol. 432",
+publisher = "Springer-Verlag",
+month = "May",
+year = 1990
+}
+@article{REPSTD,
+author = "T. Reps and T. Teitelbaum and A. Demers",
+title = "Incremental Context Dependent Analysis for Language-Based
+Editors",
+journal = "ACM Transactions on Programming Languages and Systems",
+year = 1983,
+volume = 5,
+number = 3,
+month = "July",
+pages = {449-477}
+}
+@phdthesis{sundareshphd,
+author = "Sundaresh, R.S.",
+title = "Incremental Computation via Partial Evaluation",
+school = "Yale University, Department of Computer Science",
+year = "1992"
+}
+@phdthesis{PUGH,
+author = "Pugh, Jr., W. W.",
+title = "Incremental Computation and the Incremental Evaluation of Functional Programs",
+school = "Cornell University",
+year = 1988,
+month = "August"
+}
+@phdthesis{LAUNCHTH,
+author = "Launchbury, J.",
+title = "Projection Factorisations in Partial Evaluation",
+school = "University of Glasgow",
+year = 1990,
+month = "January"
+}
+@phdthesis{MARLOWE,
+author = "T. J. Marlowe",
+title = "Data Flow Analysis and Incremental Iteration",
+school = "Rutgers, The State University of New Jersey",
+year = 1989,
+month = "October"
+}
+@phdthesis{ZANDEN,
+author = "B. T. Vander\ Zanden",
+title = "Incremental constraint satisfaction and its application to
+graphical interfaces",
+school = "Cornell University",
+year = 1989,
+month = "January"
+}
+@inproceedings{LAUNCH,
+author = "J. Launchbury",
+title = "Projections for Specialisation",
+booktitle = "Partial Evaluation and Mixed Computation",
+year = 1988,
+editor = "D.Bj{\o}rner, A.P.Ershov and N.D.Jones",
+publisher = "North-Holland"
+}
+@inproceedings{RYDEHEARD,
+author = "D. Rydeheard",
+title = "Tutorial on Natural Transformations",
+booktitle = "Category Theory and Computer Programming",
+year = 1985,
+publisher = "Springer LNCS 240",
+}
+@article{BROUWER,
+author = "J. C. C. McKinsey and A. Tarski",
+title = "On Closed Elements in Closure Algebras",
+journal = "Annals of Mathematics",
+year = 1946,
+volume = 47,
+number = 1,
+month = "January"
+}
+@article{FUT,
+author = "Y. Futamura",
+title = "Partial Evaluation of Computation Process-An approach to a Compiler-Compiler",
+journal = "Systems, Computers, Controls",
+year = 1971,
+volume = 2,
+number = 5
+}
+@article{MIX,
+author = "N. D. Jones and P. Sestoft and H. S{\o}ndergaard",
+title = "Mix: A Self-Applicable Partial Evaluator for Experiments in Compiler Generation",
+journal = "Lisp and Symbolic Computation",
+year = 1989,
+volume = 2,
+number = 1
+}
+@inproceedings{FIELD,
+author = "J. Field and T. Teitelbaum",
+title = "Incremental Reduction in the Lambda Calculus",
+booktitle = "Proc. 1990 ACM Conf. on Lisp and
+Functional Programming",
+month = "June",
+year = 1990
+}
+@inproceedings{LOM,
+author = "L. A. Lombardi and B. Raphael",
+title = "LISP as the Language for an Incremental Computer",
+booktitle = "The Programming Language LISP: Its Operation and
+Applications",
+year = 1964,
+publisher = "Information International Inc., The MIT Press",
+pages = "204-219"
+}
+@inproceedings{REPSB,
+author = "T. Reps",
+title = "Algebraic properties of program integration",
+booktitle = "Proc. 3rd European Symposium on Programming,
+Lecture Notes in Computer Science, Vol. 432",
+publisher = "Springer-Verlag",
+month = "May",
+year = 1990
+}
+@inproceedings{HUDYOUNG,
+author = "P. Hudak and J. Young",
+title = "Higher-order strictness analysis for the untyped lambda
+calculus",
+booktitle = "Proc. 12th ACM symposium on principles of
+programming languages",
+month = "January",
+year = 1986
+}
+
+@Book{aho-al:86,
+  author =      "Aho, A. D. and R. Sethi and Ullman, J. D.",
+  title =       "Compilers: Principles, Techniques and Tools",
+  publisher =   aw,
+  year =        "1986"
+}
+
+@InProceedings{backus:85,
+  author =      "J. Backus",
+  title =       "From Function Level Semantics to Program Transformation 
+                 and Optimization",
+  booktitle =   "International Conf. on Theory and Practice of Software 
+                 Development",
+  pages =       "60-91",
+  year =        "1985",
+  editor =      "H. Ehrig and C. Floyd and M. Nivat and J. Thatcher",
+  volume =      "186",
+  series =      lncs,
+  publisher =   sv
+}
+
+@Article{bauer-al:89,
+  author =      "Bauer, F. L. and B. Moller and H. Partsch and P. Pepper",
+  title =       "Formal Program Construction by trasformations -- Computer-Aided, 
+                 Intuition-Guided Programming",
+  journal =     "IEEE Transactions on Software Engineering",
+  year =        "1989",
+  volume =      "15",
+  number =      "2",
+  pages =       "165-180"
+}
+
+
+@Article{beckman-al:76,
+  author =      "L. Beckman and A. Haraldsson and {O}. Oskarsson
+                 and E. Sandewall",
+  title =       "A Partial Evaluator, and Its Use as a Programming Tool",
+  journal =     "Artificial Intelligence",
+  year =        "1976",
+  volume =      "7",
+  number =      "4",
+  pages =       "319-357"
+}
+
+@InProceedings{berlin:90,
+  author =      "A. Berlin",
+  title =       "Partial Evaluation Applied to Numerical Computation",
+  booktitle =   "ACM Conf. on Lisp and Functional Programming",
+  pages =       "139-150",
+  year =        "1990"
+}
+
+@Book{book:abs-int,
+  title =       "Abstract Interpretation of Declarative Languages",
+  publisher =   "Ellis Horwood",
+  year =        "1987",
+  editor =      "Abramsky, S. and Hankin, C."
+}
+
+@Article{boyer-moore:75,
+  author =      "Boyer, R. S. and Moore, J. S.",
+  title =       "Proving theorems about {LISP} functions",
+  journal =     "Journal of ACM",
+  year =        "1975",
+  pages =       "129-144",
+  volume =      "22",
+  number =      "1"
+}
+
+@InProceedings{bondorf1:88,
+  author =      "A. Bondorf",
+  title =       "Towards a Self-Applicable Partial Evaluator for Term
+                  Rewriting Systems",
+  booktitle =   "Partial Evaluation and Mixed Computation",
+  year =        "1988",
+  editor =      "D. Bj{\o}rner and Ershov, A. P. and Jones, N. D.",
+  publisher =   nh
+}
+
+@TechReport{bondorf2:88,
+  author =      "A. Bondorf",
+  title =       "Pattern Matching in a Self-Applicable Partial Evaluator",
+  institution =         "University of Copenhagen",
+  year =        "1988",
+  type =        "Diku Report",
+  address =     "Copenhagen, Denmark"
+}
+
+@TechReport{bondorf-al:88,
+  author =      "A. Bondorf and Jones, N. D. and T. Mogensen and P. Sestoft",
+  title =       "Binding Time Analysis and the Taming of Self-Application",
+  institution =         "University of Copenhagen",
+  year =        "1988",
+  type =        "Diku Report",
+  address =     "Copenhagen, Denmark"
+}
+
+@TechReport{bondorf-danvy:89,
+  author =      "A. Bondorf and O. Danvy",
+  title =       "Automatic Autoprojection of Recursive Equations with 
+                 Global Variables and Abstract Data Types",
+  institution =         "University of Copenhagen",
+  number =      "90/04",
+  year =        "1990",
+  type =        "Diku Research Report",
+  note =        "To appear in Science of Computer Programming",
+  address =    "Copenhagen, Denmark"
+ }
+
+@InProceedings{bondorf:90,
+  author =      "A. Bondorf",
+  title =       "Automatic Autoprojection of Higher Order Recursive Equations",
+  booktitle =   "ESOP'90, 3$^{rd}$ European Symposium on Programming",
+  pages =       "70-87",
+  year =        "1990",
+  editor =      "Jones, N. D.",
+  volume =      "432",
+  series =      lncs,
+  publisher =   sv
+}
+
+@Article{burstall-darlington:77,
+  author =      "Burstall, R. M. and J. Darlington",
+  title =       "A Transformational System for Developing Recursive Programs",
+  journal =     "Journal of ACM",
+  year =        "1977",
+  pages =       "44-67",
+  volume =      "24",
+  number =      "1"
+}
+
+@TechReport{burge:76,
+  author =      "W. Burge",
+  title =       "An Optimizing Technique for High Level Programming Languages",
+  institution = "IBM Thomas J. Watson Research Center",
+  number =      "RC 5834 (\# 25271)",
+  year =        "1976",
+  type =        "Research Report",
+  address =     "Yorktown Heights, New York, New York"
+}
+
+@Book{common-lisp,
+  author =      "Steele, G. L.",
+  title =       "Common Lisp: The Language",
+  publisher =   "Digital Press",
+  year =        "1984"
+}
+
+@TechReport{consel:86,
+  author =      "C. Consel",
+  title =       "{P}ils: un interpr\`ete {L}isp, un syst\`eme multiprocessus
+                 et un compilateur",
+  institution =         "Universit\'e de Paris VIII",
+  year =        "1986",
+  type =        "M\'emoire de ma\^itrise",
+  address =     "Saint Denis, France"
+}
+
+
+
+@Manual{consel-al:86,
+  title =       "Cskim Reference Manual",
+  author =      "C. Consel and A. Deutsch and R. Dumeur
+                 and J.-D. Fekete ",
+  organization =        "Universit\'e de Paris VIII",
+  address =     "Saint Denis, France",
+  year =        "1986",
+  note =        "Informal report"
+}
+
+
+@TechReport{consel:87,
+  author =      "C. Consel",
+  title =       "Skipe: un \'evaluateur partiel",
+  institution =         "Universit\'e de Paris VIII",
+  year =        "1987",
+  type =        "M\'emoire de DEA",
+  address =     "Saint Denis, France"
+}
+
+@InProceedings{consel1:88,
+  author =      "C. Consel",
+  title =       "New Insights into Partial Evaluation: the {S}chism
+                 Experiment",
+  booktitle =   "ESOP'88, 2$^{nd}$ European Symposium on Programming",
+  pages =       "236-246",
+  year =        "1988",
+  editor =      "H. Ganzinger",
+  volume =      "300",
+  series =      lncs,
+  publisher =   sv
+}
+
+@TechReport{consel2:88,
+  author =      "C. Consel",
+  title =       "Realistic Compiler Generation using Partial Evaluation",
+  institution =         "LIX, Ecole Polytechnique",
+  year =        "1989",
+  type =        "Research Report",
+  number =      "89-02",
+  address =     "Palaiseau, France"
+}
+
+@Article{consel-danvy:89,
+  author =      "C. Consel and O. Danvy",
+  title =       "Partial Evaluation of Pattern Matching in Strings",
+  journal =     "Information Processing Letters",
+  year =        "1989",
+  pages =       "79-86",
+  volume =      "30",
+  number =      "2"
+}
+
+@TechReport{consel-al:88,
+  author =      "C. Consel and O. Danvy and K. Malmkj{\ae}r",
+  title =       "Generating Compacted Weiner Trees Automatically:
+                an Exercise in Partial Evaluation",
+  institution =         "LITP--DIKU",
+  year =        "1988",
+  type =        "Working Report"
+}
+
+@Article{consel-al:89,
+  author =      "C. Consel and A. Deutsch and R. Dumeur and J-D. Fekete",
+  title =       "Cskim: an Extended Dialect of {S}cheme",
+  journal =     "Bigre Journal",
+  year =        "1989",
+}
+
+@PhdThesis{consel1:89,
+  author =      "C. Consel",
+  title =       "Analyse de Programmes, Evaluation Partielle et
+                 Generation de Compilateurs", 
+  school =      "Universit\'e de Paris VI",
+  year =        "1989",
+  address =     "Paris, France"
+}
+
+@InProceedings{consel-danvy2:89,
+  author =      "C. Consel and O. Danvy",
+  title =       "Static and Dynamic Semantics Processing",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  note =        "Also Yale Research Report 761",
+  year =        "1991"
+}
+
+@InProceedings{consel-danvy1:90,
+  author =      "C. Consel and O. Danvy",
+  title =       "From Interpreting to Compiling Binding Times",
+  booktitle =   "ESOP'90, 3$^{rd}$ European Symposium on Programming",
+  year =        "1990",
+  editor =      "Jones, N. D.",
+  volume =      "432",
+  pages =       "88-105",
+  series =      lncs,
+  publisher =   sv
+}
+
+@InProceedings{consel2:89,
+  author =      "C. Consel",
+  title = "Binding time analysis for higher order untyped functional
+          languages",
+  booktitle =   "ACM Conf. on Lisp and Functional Programming",
+  pages =       "264-272",
+  year =        "1990"
+}
+
+@TechReport{consel-khoo1:90,
+  author =      "C. Consel and Khoo, S. C.",
+  title =       "Semantics-Directed Generation of a {P}rolog Compiler",
+  number =      "781",
+  institution = "Yale University",
+  year =        "1990",
+  address =     "New Haven, Connecticut, USA",
+  type =        "Research Report"
+}
+
+@Misc{consel-khoo2:90,
+  author =      "C. Consel and Khoo, S. C.",
+  title =       "Higher Order Polyvariant Analysis",
+  year =        "1990",
+  note =        "Paper in preparation"
+}
+
+@Manual{consel1:90,
+  author =      "C. Consel",
+  title =       "The {S}chism {M}anual",
+  Organization = "Yale University",
+  address =      "New Haven, Connecticut, USA",
+  year =        "1990",
+  note =        "Version 1.0"
+}
+
+@Misc{consel2:90,
+  author =      "C. Consel",
+  title =       "Higher Order Partial Evaluation with Data Structures",
+  year =        "1990",
+  note =        "Paper in preparation"
+}
+
+@Misc{consel3:90,
+  author =      "C. Consel",
+  title =       "Partial Evaluation for Scientific Computing",
+  year =        "1990",
+  note =         "Presented at the 1990 Workshop on Advanced Programming
+                  Environment for Scientific Computing"
+}
+
+@TechReport{consel-danvy:90,
+  author =      "C. Consel and O. Danvy",
+  title =       "Partial Evaluation in Parallel",
+  number =      "820",
+  institution = "Yale University",
+  year =        "1990",
+  address =     "New Haven, Connecticut, USA",
+  type =        "Research Report"
+}
+
+@InProceedings{cousot:81,
+  author =      "P. Cousot",
+  title =       "Semantic foundations of program analysis: Theory and
+                 Applications",
+  publisher =   "Prentice-Hall",
+  year =        "1981",
+  booktitle =   "Program Flow Analysis: Theory and Applications",
+  editor =      "Muchnick, S. S. and Jones, N. D."
+}
+
+@Book{clocksin-mellish:81,
+  author =      "Clocksin, W. F. and Mellish, C. S.",
+  title =       "Programming in {P}rolog",
+  publisher =   sv,
+  year =        "1981"
+}
+
+@TechReport{danvy1:90,
+  author =      "O. Danvy",
+  title =       "Semantics-Directed Compilation of Non-Linear Patterns",
+  number =      "303",
+  institution = "Indiana University",
+  year =        "1990",
+  address =     "Bloomington, Indiana, USA",
+  type =        "Technical Report"
+}
+
+
+@InProceedings{dijkstra:68,
+  author =      "Dijkstra,E. W.",
+  title =       "Co-operating Sequential Processes",
+  pages =        "43-112",
+  publisher =   "Academic Press",
+  year =        "1968",
+  booktitle =   "Programming Languages",
+  editor =      "F. Genuys"
+}
+
+@InProceedings{emanuelson-al:80,
+  author =      "P. Emanuelson and A. Haraldsson",
+  title =       "On Compiling Embedded Languages in Lisp",
+  booktitle =   "ACM Conf. on Lisp and Functional Programming,
+                 Stanford, California",
+  year =        "1980",
+  pages =       "208--215"
+}
+
+@InProceedings{ershov:78,
+  author =      "Ershov, A. P.",
+  title =       "On the Essence of Compilation",
+  booktitle =   "Formal Description of Programming Concepts",
+  year =        "1978",
+  editor =      "Neuhold, E. J.",
+  pages =       "391-420",
+  publisher =   nh
+}
+
+@TechReport{felleisen:85,
+  author =      "M. Felleisen",
+  title =       "Transliterating {P}rolog into {S}cheme",
+  institution =     "Indiana University",
+  year =        "1985",
+  type =        "Technical Report",
+  number =      "182",
+  address =     "Bloomington, Indiana"
+}
+
+@InProceedings{fujita-al:88,
+  author =      "H. Fujita and K. Furukawa",
+  title =       "A Self-Applicable Partial Evaluator and Its Use in
+                 Incremental Compiler",
+  booktitle =   "New Generation Computing",
+  year =        "1988",
+  editor =      "Y. Futamura",
+  publisher =   "OHMSHA. LTD. and Springer-Verlag",
+  volume =      "6",
+  series =      "2,3"
+}
+
+@Article{futamura:71,
+  author =      "Y. Futamura",
+  title =       "Partial Evaluation of Computation Process -- An
+                 Approach to a Compiler-Compiler",
+  journal =     "Systems, Computers, Controls 2, 5",
+  year =        "1971",
+  pages =       "45--50"
+}
+
+@InProceedings{futamura:83,
+  author =      "Y. Futamura",
+  title =       "Partial Evaluation of Programs",
+  booktitle =   "RIMS Symposia on Software Science and Engineering,
+                 Kyoto, Japan",
+  year =        "1983",
+  editor =      "E. Goto et al.",
+  pages =       "1--35",
+  publisher =   sv,
+  series =      lncs,
+  volume =      "147"
+}
+
+@InProceedings{fuller-abramsky:88,
+  author =      "Fuller, D. A. and S. Abramsky",
+  title =       "Mixed Computation of {P}rolog",
+  booktitle =   "Partial Evaluation and Mixed Computation",
+  year =        "1988",
+  editor =      "D. Bj{\o}rner and Ershov, A. P. and Jones, N. D.",
+  publisher =   nh
+}
+
+@Book{ganzinger-jones:85,
+  title =   "Programs as Data Objects",
+  year =        "1985",
+  editor =      "H. Ganzinger and Jones, N. D.",
+  volume =      "217",
+  series =      lncs,
+  publisher =   sv
+}
+
+@InProceedings{gomard:90,
+  author =      "Gomard, Carsten  K.",
+  title = "Partial Type Inference for Untyped Functional Programs",
+  booktitle =   "ACM Conf. on Lisp and Functional Programming",
+  year =        "1990"
+}
+
+@TechReport{gomard-jones:90,
+  author =      "Jones, Neil D and Gomard, Carsten  K.",
+  title =       "A Partial Evaluator for the Untyped Lambda Calculus",
+  institution =         "University of Copenhagen",
+  year =        "1990",
+  type =        "{DIKU} Report",
+  address =     "Copenhagen, Denmark",
+  note =        "Extended version of \cite{jones-al:90}"
+}
+
+@Book{gordon:79,
+  author =      "Gordon, M. J. C.",
+  title =       "The Denotational Decription of Programming Languages",
+  publisher =   sv,
+  year =        "1979"
+}
+
+@Book{graph,
+  author =      "Michel Sakarovitch",
+  title =       "Optimisation combinatoire (m\'{e}thodes math\'{e}matiques et
+                 algorithmiques)",
+  publisher =   "Hermann",
+  year =        "1984"
+}
+
+@Article{halstead:85,
+  author =      "Halstead, R. Jr.",
+  title =       "Multilisp: A Language for Concurrent Symbolic Computation",
+  journal =     "ACM Transaction on Programming Languages and Systems",
+  pages =       "501-538",
+  year =        "1985",
+  volume =      "7",
+  number =      "4"
+}
+
+@PhdThesis{haraldsson:77,
+  author =      "A. Haraldsson",
+  title =       "A Program Manipulation System Based on Partial Evaluation",
+  school =      "Link{o}ping University, Sweden",
+  year =        "1977",
+  note =        "Link{o}ping Studies in Science and Technology
+                 Dissertations N$^o$ 14"
+}
+
+@Article{heering:86,
+  author =      "J. Heering",
+  title =       "Partial Evaluation and $\omega$-Completeness of
+                 Algebraic Specifications",
+  journal =     "Theoretical Computer Science",
+  year =        "1986",
+  volume =      "43",
+  pages =       "149-167"
+}
+
+@Book{henson:87,
+  author =      "Henson, M. C.",
+  title =       "Elements of Functional Languages",
+  publisher =   "Blackwell",
+  year =        "1987"
+}
+
+@InProceedings{hudak-young:86,
+  author =      "P. Hudak and J. Young",
+  title =       "Higher-Order Strictness Analysis in Untyped Lambda Calculus",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  pages     =   "97-109",
+  year =        "1986"
+}
+
+@InProceedings{hudak-young:88,
+  author =      "P. Hudak and J. Young",
+  title =       "A Collecting Interpretation of Expressions (Without
+                 Powerdomains)",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  pages =       "107-118",
+  year =        "1988",
+  note={Superseded by \cite{hudak-young:88}.}
+
+}
+
+@Manual{interlisp,
+  title =       "Interlisp",
+  author =      "W. Teitelman",
+  organization =        "Xerox Palo Alto Research Center",
+  year =        "1978"
+}
+
+
+@InProceedings{johnsson:85,
+  author =      "T. Johnsson",
+  title =       "Lambda Lifting: Transforming Programs to Recursive
+                 Equations",
+  booktitle =   "Conf. on Functional Programming Languages and
+                 Computer Architecture",
+  year =        "1985",
+  editor =      "J.-P. Jouannaud",
+  volume =      "201",
+  series =      lncs,
+  publisher =   sv
+
+}
+
+@Book{jones:80,
+  editor =      "Jones, N. D.",
+  title =   "Semantics-Directed Compiler Generation",
+  publisher =   sv,
+  series =      lncs,
+  volume =      "94",
+  year =        "1980"
+}
+
+@InProceedings{jones-muchnick:76,
+  author =      "Jones, N. D. and Muchnick, S. S.",
+  title =       "Some Thoughts towards the Design of an Ideal Language",
+  booktitle =   "ACM Conf. on Principles of Programming Languages",
+  year =        "1976",
+  pages =       "77-94"
+}
+
+@InProceedings{jones-muchnick:81,
+  author =      "Jones, N. D. and Muchnick, S. S.",
+  title =       "Flow Analysis and Optimization of LISP-like Structures",
+  publisher =   "Prentice-Hall",
+  year =        "1981",
+  booktitle =   "Program Flow Analysis: Theory and Applications",
+  editor =      "Muchnick, S. S. and Jones, N. D."
+}
+
+@InProceedings{jones-muchnick:82,
+  author =      "Jones, N. D. and Muchnick, S. S.",
+  title =       "A flexible Approach to Interprocedural Data Flow
+                 Analysis and Programs with Recursive Data Structures",
+  booktitle =   "ACM Conf. on Principles of Programming Languages",
+  year =        "1982",
+  pages =       "66-74"
+}
+
+@InProceedings{jones-al:85,
+  author =      "Jones, N. D. and P. Sestoft and H. S{\o}ndergaard",
+  title =       "An Experiment in Partial Evaluation: the Generation 
+                 of a Compiler Generator",
+  booktitle =   "Rewriting Techniques and Applications, Dijon, France",
+  year =        "1985",
+  editor =      "J.-P. Jouannaud",
+  pages =       "124--140",
+  publisher =   sv,
+  volume =      "202",
+  series =      lncs
+}
+
+@InProceedings{jones-mycroft:86,
+  author =      "Jones, N. D. and A. Mycroft",
+  title =       "Data flow analysis of applicative programs using
+                 minimal function graphs",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  year =        "1986"
+}
+
+@Book{jones:87,
+  author =      "Jones, N. D.",
+  title =       "Flow analysis of lazy higher-order functional programs",
+  publisher =   "Ellis Horwood Limited",
+  year =        "1987"
+}
+
+@Article{jones-al:87,
+  author =      "Jones, N. D. and P. Sestoft and H. S{\o}ndergaard",
+  title =       "Mix: a Self-Applicable Partial Evaluator for
+                 Experiments in Compiler Generation",
+  journal =     "Lisp and Symbolic Computation",
+  year =        "1989",
+  volume =      "2",
+  number =      "1",
+  pages =       "9-50"
+}
+
+@Article{jones-al:88,
+  author =      "Jones, N. D. and P. Sestoft and H. S{\o}ndergaard",
+  title =       "Mix: a Self-Applicable Partial Evaluator for
+                 Experiments in Compiler Generation",
+  journal =     "LISP and Symbolic Computation",
+  year =        "1989",
+  volume =      "2",
+  number =      "1",
+  pages =       "9-50"
+}
+
+@InProceedings{jones:88,
+  author =      "Jones, N. D.",
+  title =       "Challenging Problems in Partial Evaluation and Mixed Computation",
+  booktitle =   "{\rm \cite{ngc:88}}",
+  pages     =   "1-14"
+}
+
+@TechReport{jones2:88,
+  author =      "Jones, N. D",
+  title =       "Binding Time Analysis and Static Semantics (extended abstract)",
+  institution =         "University of Copenhagen",
+  year =        "1988",
+  type =        "Diku Report",
+  address =     "Copenhagen, Denmark"
+}
+
+@InProceedings{jones-al:90,
+  author =      "Jones, Neil D. and Gomard, Carsten  K. and A. Bondorf and O. Danvy and 
+                 T. Mogensen",
+  title =       "A Self-applicable Partial Evaluator for the Lambda Calculus",
+  booktitle =   "IEEE International Conf. on Computer Languages",
+  pages =       "49-58",
+  year =        "1990"
+}
+
+@InProceedings{jorring-scherlis:86,
+  author =      "U. J{\o}rring and Scherlis, W. L.",
+  title =       "Compilers and Staging Transformations",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  pages =       "86-96",
+  year =        "1986"
+}
+
+@Article{kmp:77,
+  author =      "Knuth, D. E. and Morris, J. H. and Pratt, V. R.",
+  title =       "Fast Pattern Matching in Strings",
+  journal =     "SIAM",
+  year =        "1977",
+  volume =      "6",
+  number =      "2",
+  pages =       "323-350"
+}
+
+@InProceedings{kesley-hudak:89,
+  author =      "R. Kesley and P. Hudak",
+  title =       "Realistic compilation by program transformation",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  pages =       "281-292",
+  year =        "1989"
+}
+
+@InProceedings{kahn-carlsson:84,
+  author =      "Kahn, K. M. and Carlsson, M.",
+  title =       "The Compilation of {P}rolog Programs Without the Use of
+                 {P}rolog Compiler",
+  booktitle =   "International Conf. on Fifth Generation Computer
+                 Systems",
+  year =        "1984",
+  pages =       "348-355"
+}
+
+@Book{kleene:52,
+  author =      "Kleene, S. C.",
+  title =       "Introduction to Metamathematics",
+  publisher =   "Van Nostrand",
+  year =        "1952"
+}
+
+@TechReport{komorowski:81,
+  author =      "Komorowski, H. J.",
+  title =       "A Specification of an Abstract
+                 {P}rolog Machine and Its Application to Partial Evaluation",
+  institution =      "Link{o}ping University",
+  year =        "1981",
+  type =        "Link{o}ping Studies in Science and Technology
+                 Dissertations N$^o$ 69",
+  address =     "Link{o}ping, Sweden"
+}
+
+@InProceedings{komorowski:82,
+  author =      "H. J. Komorowski",
+  title =       "Partial Evaluation as a Means for Inferencing Data
+                 Structures in an Applicative Language: A Theory and
+                 Implementation in the Case of {P}rolog",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  year =        "1982"
+}
+
+@Article{kranz-al:86,
+  author =      "Kranz, D. A. and R. Kesley and Rees, J. A. and P. Hudak and J. Philbin
+                 and Adams, N. I.",
+  title =       "{O}rbit: an optimizing compiler for {S}cheme",
+  journal   =   "SIGPLAN Notices, ACM Symposium on Compiler Construction",
+  volume =      "21",
+  number =      "7",
+  pages =       "219-233",
+  year =        "1986"
+}
+
+@Book{lcf,
+  author =      "Gordon, M. J. and Wadsworth, C. P.",
+  title =       "LCF",
+  publisher =   sv,
+  year =        "1979",
+  volume =      "78",
+  series =      lncs
+}
+
+@Book{lee:87,
+  author =      "P. Lee",
+  title =       "Realistic Compiler Generation",
+  publisher =   "MIT Press",
+  year =        "1989"
+}
+
+@InProceedings{lee-pleban:86,
+  author =      "P. Lee and Pleban, U. F.",
+  title =       "On the Use of {L}isp in Implementing Denotational Semantics",
+  booktitle =   "ACM Conf. on Lisp and Functional Programming",
+  year =        "1986",
+  pages =       "233-248"
+}
+
+@InProceedings{lombardi-al:64,
+  author =      "Lombardi, L. A. and B. Raphael",
+  title =       "Lisp as the Language for an Incremental Computer",
+  booktitle =   "The Programming Language Lisp: Its Operation and
+                 Applications",
+  year =        "1964",
+  editor =      "Berkeley, E. C. and Bobrow, D. G.",
+  pages =       "204-219",
+  publisher =   "MIT Press, Cambridge, Massachusetts"
+}
+
+@InProceedings{lombardi:67,
+  author =      "Lombardi, L. A.",
+  title =       "Incremental Computation",
+  booktitle =   "Advances in Computers",
+  year =        "1967",
+  editor =      "alt, F. L. and M. Rubinoff",
+  pages =       "247--333",
+  volume =      "8",
+  publisher =   "Academic Press"
+}
+
+@InProceedings{loveman:76,
+  author =      "Loveman, D. B.",
+  title =       "Program Improvement by Source to Source Transformation",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  year =        "1976"
+}
+
+@Article{manna-waldinger:80,
+  author =      "Z. Manna and R. Waldinger",
+  title =       "A deductive approach to program synthesis",
+  journal =     "ACM Transaction on Programming Languages and Systems",
+  pages =       "90-121",
+  year =        "1980",
+  volume =      "2",
+  number =      "1"
+}
+
+@Manual{mosses:79,
+  author =      "P. Mosses",
+  title =       "{SIS} -- Semantics Implementation System, reference manual
+                 and user guide",
+  Organization = "University of Aarhus",
+  address =      "Aarhus, Denmark",
+  year =        "1979",
+  type =        "{DAIMI} report {MD}-30",
+  note =        "Version 1.0"
+}
+
+@InProceedings{mosses:84,
+  author =      "Mosses, P. A.",
+  title =       "A Basic Abstract Semantic Algebra",
+  booktitle =   "Semantics of Data Types",
+  year =        "1984",
+  pages =       "87-108",
+  volume =      "173",
+  series =      lncs,
+  publisher =   sv
+}
+
+@InProceedings{mogensen:88,
+  author =      "T. Mogensen",
+  title =       "Partially Static Structures in a Self-applicable
+                 Partial Evaluator",
+  booktitle =   "Partial Evaluation and Mixed Computation",
+  pages     =   "325-348",
+  year =        "1988",
+  editor =      "D. Bj{\o}rner and Ershov, A. P. and Jones, N. D.",
+  publisher =   nh
+}
+
+@InProceedings{mogensen:89,
+  author =      "T. Mogensen",
+  title =       "Binding Time Analysis for Polymorphically Typed
+                 Higher Order Languages",
+  booktitle =   "International Joint Conf. on Theory and Practice 
+                 of Software Development",
+  pages =       "298-312",
+  year =        "1989",
+  editor =      "J. Diaz and F. Orejas",
+  volume =      "352",
+  series =      lncs,
+  publisher =   sv
+}
+
+@InProceedings{mogensen2:89,
+  author =      "T. Mogensen",
+  title =       "Separating binding times in language specifications",
+  booktitle =   "FPCA'89, 4$^{th}$ International Conf. on Functional Programming 
+                 Languages and Computer Architecture",
+  year =        "1989"
+}
+
+@TechReport{morris:70,
+  author =      "Morris, F. L.",
+  title =       "The Next 700  Formal Language Descriptions",
+  year =        "1970",
+  type =        "Unpublished paper"
+}
+
+@InProceedings{montenyohl-wand:88,
+  author =      "M. Montenyohl and M. Wand",
+  title =       "Correct Flow Analysis in Continuation Semantics",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  pages   =     "204-218",
+  year =        "1988"
+}
+
+@Manual{mix:87,
+  author =      "The Mix Group",
+  title =       "The Mix System User's Guide 3.0",
+  organization =        "University of Copenhagen",
+  address =     "Copenhagen, Denmark",
+  year =        "1987"
+}
+
+@Article{nicholson-foo:89,
+  author =      "T. Nicholson and N. Foo",
+  title =       "A Denotational Semantics for {P}rolog",
+  journal =     "ACM Transaction on Programming Languages and Systems",
+  year =        "1989",
+  volume =      "11",
+  number =      "4"
+}
+
+@Book{ngc:88,
+  title =       "Selected Papers from the Workshop on Partial
+                 Evaluation and Mixed Computation",
+  journal =     "New Generation Computing",
+  volume =      "6",
+  series =      "2,3",
+  editor =      "Ershov, A. P.  and D. Bj{\o}rner and Y. Futamura and K. Furukawa 
+                 and A. Haraldsson and Scherlis, W. L.",
+  publisher =   "OHMSHA. LTD. and Springer-Verlag",
+  year =        "1988"
+}
+
+@Manual{psi:87,
+  author =      "Nielson, Hanne Riis",
+  title =       "The core of the {PSI}-system",
+  organization =        "Institut for Elektroniske Systemer",
+  address =     "Aalborg, Denmark",
+  note =        "{IR} 87-02",
+  year =        "1987"
+}
+
+@InProceedings{nielson:88,
+  author =      "Nielson, Hanne Riis and Flemming Nielson",
+  title =       "Automatic binding time analysis for a typed
+                 $\lambda$-calculus",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  pages  =      "98-106",
+  year =        "1988"
+}
+
+@TechReport{nielson2:88,
+  author =      "Nielson, Hanne Riis and Flemming Nielson",
+  title =       "The {TML}-Approach to Compiler-Compilers",
+  type =        "Technical Report",
+  number =      "88-47",
+  institution =      "Technical University of Denmark",
+  address =     "Lyngby, Denmark",
+  year =        "1988"
+}
+
+@InProceedings{nielson:89,
+  author =      "Nielson, Hanne Riis and Flemming Nielson",
+  title =       "Tranformations on Higher-Order Functions",
+  booktitle =   "FPCA'89, 4$^{th}$ International Conf. on Functional Programming
+                 Languages and Computer Architecture",
+  pages   =     "129-143",
+  year =        "1989"
+}
+
+@InProceedings{nielson:90,
+  author =      "Nielson, Hanne Riis and Flemming Nielson",
+  title =       "Eureka Definitions for Free! or
+                 Disagreement Points for fold/unfold transformations",
+  booktitle =   "ESOP'90, 3$^{rd}$ European Symposium on Programming",
+  year =        "1990",
+  editor =      "Jones, N. D.",
+  volume =      "432",
+  pages =       "291-305",
+  series =      lncs,
+  publisher =   sv
+}
+
+@Article{partsch-steinbruggen:83,
+  author =      "H. Partsch and R. Steinbr{\"{u}}ggen",
+  title =       "Program Transformation Systems",
+  journal =     "ACM Computing Surveys",
+  year =        "1983",
+  volume =      "15",
+  number =      "3",
+  pages =       "199-236"
+}
+
+@PhdThesis{paulson:81,
+  author =      "L. Paulson",
+  title =       "A Compiler Generator for Semantic Grammars",
+  school =      "Stanford University",
+  year =        "1981",
+  address =     "Stanford, California",
+  note =        "Report No. STAN-CS-81-893"
+}
+
+@InProceedings{paulson:82,
+  author =      "L. Paulson",
+  title =       "A Semantics-Directed Compiler Generator",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  pages =       "224-233",
+  year =        "1982",
+}
+
+@InProceedings{pepper:84,
+  author =      "P. Pepper",
+  title =       "Inferential techniques for program development",
+  booktitle =   "Program Transformation and Programming Environments",
+  year =        "1984",
+  editor =      "P. Pepper",
+  pages =       "275-290",
+  volume =      "F8",
+  publisher =   sv
+}
+
+@Book{pemc:88,
+  title =       "Partial Evaluation and Mixed Computation",
+  publisher =   nh,
+  year =        "1988",
+  editor =      "D. Bj{\o}rner and Ershov, A. P. and Jones, N. D."
+}
+
+@InProceedings{pebib,
+  author =      "P. Sestoft and Zamulin, A. V.",
+  title =       "Annotated Bibliography on Partial Evaluation and Mixed
+                 Computation",
+  booktitle =   "Partial Evaluation and Mixed Computation",
+  year =        "1988",
+  editor =      "D. Bj{\o}rner and Ershov, A. P. and Jones, N. D.",
+  publisher =   nh
+}
+
+@TechReport{pebib:90,
+  author =      "P. Sestoft",
+  title =       "Annotated Bibliography on Partial Evaluation and Mixed
+                 Computation",
+  institution = "University of Copenhagen",
+  year =        "1990",
+  type =        "Diku Report",
+  address =     "Copenhagen, Denmark"
+}
+
+@Book{peyton-jones:87,
+  author =      "Peyton Jones, Simon L.",
+  title =       "The Implementation of Functional Programming Languages",
+  publisher =   ph,
+  year =        "1987",
+  editor =      "Hoare, C. A. R.",
+  series =      "Computer Science"
+}
+
+@TechReport{peyton-jones2:87,
+  author =      "Peyton Jones, Simon L.",
+  title =       "{FLIC} -- a Functional Language Intermediate Code",
+  institution = "University College London",
+  year =        "1990",
+  type =        "Internal Note 2048",
+  address =     "London, UK"
+}
+
+@InProceedings{pleban:87,
+  author =      "U. Pleban",
+  title =       "Semantics-Directed Compiler Generation",
+  booktitle =   "ACM Symposium on Principles of Programming Languages",
+  year =        "1987",
+  note =        "Tutorial"
+}
+
+@InProceedings{reynolds:69,
+  author =      "J. Reynolds",
+  title =       "Automatic computation of data set definitions",
+  booktitle =   "Information Processing",
+  year =        "1969",
+  editor =      nh,
+  pages =       "456-61"
+}
+
+@InProceedings{reynolds:72,
+  author =      "J. Reynolds",
+  title =       "Definitional interpreters for higher order
+                 programming languages",
+  booktitle =   "ACM National Conf.",
+  pages =       "717-740",
+  year =        "1971"
+}
+
+@InProceedings{reynolds:81,
+  author =      "J. Reynolds",
+  title =       "The essence of {A}lgol",
+  booktitle =   "International Symposium on Algorithmic Languages",
+  pages =       "345-372",
+  year =        "1981",
+  editor =      "Van Vliet",
+  publisher =   nh
+}
+
+@InProceedings{romanenko:88,
+  author =      "Romanenko, S. A.",
+  title =       "A Compiler Generator Produced by a Self-applicable
+                 Specializer Can Have a Surprisingly Natural and
+                 Understandable Structure",
+  booktitle =   "Partial Evaluation and Mixed Computation",
+  year =        "1988",
+  editor =      "D. Bj{\o}rner and Ershov, A. P. and Jones, N. D.",
+  publisher =   nh
+}
+
+@Article{r3rs,
+  author =      "J. Rees and W. Clinger",
+  title =       "Revised$^3$ Report on the Algorithmic Language {S}cheme",
+  journal =     "SIGPLAN Notices",
+  year =        "1986",
+  volume =      "21",
+  number =      "12",
+  pages =       "37--79"
+}
+
+@MastersThesis{safra:90,
+  author =      "S. Safra",
+  title =       "Partial Evaluation of Concurrent Prolog and Its Implications",
+  school =      "Weizmann Institute of Science",
+  year =        "1990",
+  address =     "Israel"
+}
+
+@Article{schmidt:85,
+  author =      "Schmidt, D. A.",
+  title =       "Detecting Global Variables in Denotational Specification",
+  journal =     "ACM Transactions on Programming Languages and Systems",
+  year =        "1985",
+  pages =       "299-310",
+  volume =      "7",
+  number =      "2"
+}
+
+@Book{schmidt:86,
+  author =      "Schmidt, D. A.",
+  title =       "Denotational Semantics: a Methodology for Language
+                 Development",
+  publisher =   ab,
+  year =        "1986"
+}
+
+@TechReport{sestoft2:85,
+  author =      "P. Sestoft",
+  title =       "The Structure of a Self-Applicable Partial Evaluator",
+  institution =         "University of Copenhagen",
+  year =        "1985",
+  type =        "Diku Report (extended version of \cite{sestoft:85})",
+  number =      "85/11",
+  address =     "Copenhagen, Denmark"
+}
+
+@InProceedings{sestoft:85,
+  author =      "P. Sestoft",
+  title =       "The Structure of a Self-Applicable Partial Evaluator",
+  booktitle  =  "{\rm \cite{ganzinger-jones:85}}",
+  pages =       "236-256"
+}
+
+@InProceedings{sestoft:88,
+  author =      "P. Sestoft",
+  title =       "Automatic Call Unfolding in a Partial Evaluator",
+  booktitle =   "Partial Evaluation and Mixed Computation",
+  year =        "1988",
+  editor =      "D. Bj{\o}rner and Ershov, A. P. and Jones, N. D.",
+  publisher =   nh
+}
+
+@MastersThesis{sestoft-m:88,
+  author =      "P. Sestoft",
+  title =       "Replacing function parameters by global variables",
+  school =      "Diku, University of Copenhagen",
+  year =        "1989",
+  address =     "Copenhagen, Denmark"
+}
+
+@InProceedings{sestoft:89,
+  author =      "P. Sestoft",
+  title =       "Replacing function parameters by global variables",
+  booktitle =   "FPCA'89, 4$^{th}$ International Conf. on Functional Programming
+                 Languages and Computer Architecture",
+  pages =       "39-53",
+  year =        "1989"
+}
+
+@Book{stoy:77,
+  author =      "J. Stoy",
+  title =       "Denotational Semantics: the {S}cott-{S}trachey approach to
+                 programming languages theory",
+  publisher =   "{MIT} Press",
+  year =        "1977"
+}
+
+@Misc{stransky:88,
+  author =      "Jan Stransky",
+  title =       "Analyse s\'emantique de structures de donn\'ees
+                 dynamiques avec application au cas particulier de
+                 langages LISPiens.",
+  howpublished =        "Universit\'e de Paris-Sud Centre d'Orsay",
+  year =        "1988",
+  note =        "Th\`ese de doctorat de troisi\`eme cycle"
+}
+
+@MastersThesis{steele:78,
+  author =      "Steele, G. L.",
+  title =       "Rabbit: A Compiler for Scheme",
+  school =      "M.I.T (A.I. LAB.)",
+  year =        "1978",
+  address =     "Massachusetts, U.S.A"
+}
+
+@Manual{T,
+  author =      "Rees, J. A. and Adams, N. I. and Meehan, J. R.",
+  title =       "The {T} {M}anual",
+  Organization = "Yale University",
+  address =      "New Haven, Connecticut, USA",
+  year =        "1984",
+  note =        "Fourth edition"
+}
+
+@InProceedings{tennent:77,
+  author =      "Tennent, R. D.",
+  title =       "Language Design Methods  Based on Semantic Principles",
+  booktitle =   "Acta Informatica",
+  year =        "1977",
+  pages =       "97-112",
+  volume =      "8"
+}
+
+@Article{turchin:86,
+  author =      "Turchin, V. F.",
+  title =       "The Concept of a Supercompiler",
+  journal =     "ACM Transaction on Programming Languages and Systems",
+  year =        "1986",
+  volume =      "8",
+  number =      "3",
+  pages =       "292-325"
+}
+
+@InProceedings{venken:84,
+  author =      "R. Venken",
+  title =       "A {P}rolog Meta-Interpreter for Partial Evaluation
+                 and Its Application to Source to Source Transformation and
+                 Query-Optimisation",
+  booktitle =   "ECAI'84",
+  year =        "1988",
+  editor =      "T. O'Shea",
+  publisher =   nh
+}
+
+@Article{wand:82,
+  author =      "M. Wand",
+  title =       "Deriving target code as a representation of continuation
+                 semantics",
+  journal   =   "ACM Transactions on Programming Languages and Systems",
+  volume =      "4",
+  number =      "3",
+  pages =       "496-517",
+  year =        "1982"
+}
+
+@TechReport{wand:83,
+  author =      "M. Wand",
+  title =       "A Semantic Algebra for Logic Programming",
+  institution =     "Indiana University",
+  year =        "1983",
+  type =        "Technical Report",
+  number =      "148",
+  address =     "Bloomington, Indiana"
+}
+
+@Article{wand:84,
+  author =      "M. Wand",
+  title =       "A Semantic Prototyping System",
+  journal   =   "SIGPLAN Notices, ACM Symposium on Compiler Construction",
+  volume =      "19",
+  number =      "6",
+  pages =       "213-221",
+  year =        "1984"
+}
+
+@InProceedings{wand-wang:90,
+  author =      "M. Wand and Z. Wang",
+  title =       "Conditional Lambda-Theories and the Verification of Static
+                Properties of Programs",
+  booktitle =   "IEEE Symposium on Logic in Computer Science",
+  pages   =     "321-332",
+  year =        "1990"
+}
+
+@TechReport{warren:77,
+  author =      "D. Warren",
+  title =       "Implementing {P}rolog -- Compiling Predicate
+                 Logic Programs",
+  institution =     "University of Edinburgh",
+  year =        "1977",
+  type =        "D.A.I Research Report",
+  number =      "39 and 40",
+  address =     "Edinburgh, Scotland"
+}
+
+@InProceedings{wadler:88,
+  author =      "Philip Wadler",
+  title =       "Deforestation: Transforming programs to eliminate trees",
+  booktitle =   "ESOP'88, 2$^{nd}$ European Symposium on Programming",
+  year =        "1988",
+  editor =      "H. Ganzinger",
+  volume =      "300",
+  series =      lncs,
+  publisher =   sv
+}
+
+@PhdThesis{weis:87,
+  author =      "P. Weis",
+  title =       "Le Syst\`eme Sam: M\'etacompilation Tr\`es efficace
+                 \`a l'Aide d'Op\'erateurs S\'emantiques",
+  school =      "Universit\'e de Paris VII",
+  year =        "1987",
+  address =     "Paris, France"
+}
+
+@manual{schism,
+	author = "C. Consel",
+	title  = "The Schism Manual",
+	organization = "Yale University",
+	address = "New-Haven, USA",
+	year = 1989,
+	remarks = "a masterpiece, a colossal wark",
+	}
+
+@article {consel:insights,
+	author = "C. Consel",
+	title = "New Insights into Partial Evaluation: 
+		the {SCHISM} Experiment",
+	journal = "ESOP'88, 2nd European Symposium on Programming",
+        note = "in LNCS 300, pages 236-246",
+	year = "88"
+	}
+
+@article {cook,
+	author = "W. Cook and J. Palsberg",
+	title = "A Denotational Semantics of Inheritance and its Correctness",
+	journal = "OOPSLA 1989, SIGPLAN Notices 24:10",
+	year = "89"
+	}
+
+@incollection{friedman:expansion,
+	author = "R. Kent Dybvig and D. P. Friedman and C. T. Haynes",
+	title = "Expansion-Passing Style: A General Macro Mechanism",
+	booktitle = "Lisp and Symbolic Computation, 1",
+	pages  = "53--75",
+	publisher = "Kluwer Academic Publishers",
+	address = "Netherlands",
+	year = 1988,
+	remarks = 
+		"nice debugging and transformation ideas. 
+		hard-code the transformation using macros to the function
+		instead of dealing with a MCE.",
+	}
+
+
+@inproceedings{hudak:collecting,
+	author = "P. Hudak and J. Young",
+	title = "A Collecting Interpretation of Expressions 
+				(Without Powerdomains)",
+	booktitle = "Proc. 1988 ACM Symposium of
+			Principles of Programming Languages",
+	publisher = "ACM",
+	year = 1988,
+	remarks = "a good reference for collecting interpretation style.
+		   discusses abstracting out the standard evaluator from the
+		   instrumented semantics. a good reference for how to
+ 		   present a semantics based paper."
+	}
+
+@incollection{maio:execution,
+	author = "A. Di Maio and S. Ceri and S. Crespi Reghizzi",
+	title = " Execution Monitoring and Debugging Tool for ADA Using 
+			Relational Algebra",
+	editor = "J. G. P. Barnes and G. A. {Fisher Jr}",
+	booktitle = "Ada in use, Proceeding of the Ada International
+ 			Conf.. Paris 14-16 May 1985",
+	publisher = "Cambridge University Press",
+	year = 1985,
+	remarks = "This is an implementation report. Has a good classifications
+		of predicates (many not related to our model). Mentions that
+		predicates are often referred to as 'breakpoints'. Classify
+		actions as neutral and non-neutral. Has a nice idea to include
+		toolbox of debugging aids.  Has some nice bibliography"
+	}
+	
+
+@incollection{odonnell:debugging,
+	author = "J. T. O'Donnell and C. V. Hall",
+	title = "Debugging In Applicative Languages",
+	booktitle = "Lisp and Symbolic Computation, 1",
+	publisher = "Kluwer Academic Publishers",
+	address = "Netherlands",
+	year = 1988,
+	remarks = 
+		"contains some good examples of applicative debugging 
+		 implementations. Theme = using MCE buys you the same
+		 computational paradigm of the underlying language"
+	}
+
+@article{survey,
+	author = "B. Plattner and J. Nievergelt",
+	title = "Monitoring Program Execution: A Survey",
+	journal = "IEEE Computer",
+	year = 1981,
+	month = "November",
+	pages = "76--93",
+	remarks = "A very good reference for terminology. A good conceptual
+		discussion about Monitoring activities as a whole. No model is
+		presented although design issues are extensively discussed.
+		presents the notion of predicate-action which is different from
+		our label actions. Argues that labels do not suffice for
+		monitoring purposes (I do not think so -amir). Includes some
+		good references."
+	}
+
+@incollection{safra:meta,
+	author = "S. Safra and E. Shapiro",
+	title = "Meta Interpreters for Real",
+	booktitle = "Concurrent Prolog, collected papers",
+	publisher = "MIT Press",
+	year = 1989,
+        volume = "2",
+	remarks = "Same general idea. Lacking the obviousity of MCE because
+		uses prolog. PE the program with the interpreter while 
+		we partial the MCE with 
+   		debugging specification (our higher level)."
+	}
+
+@book{shapiro:algorithmic,
+        author = "E. Shapiro",
+        title = "Algorithmic Program Debugging",
+        publisher = "MIT Press",
+        year = "1982"
+}
+
+@book{pemc,
+        author = "D. Bj{\o}rner and Ershov, A. P. and Jones, N. D.",
+        title = "Partial Evaluation and Mixed Computation",
+        publisher = "North-Holland",
+        year = "1988"
+}
+
+@book{schmidt:denotational,
+	author = "David A. Schmidt", 
+	title = "Denotational Semantics",
+	publisher = "Wm. C. Brown Publishers",
+	address = "Dubuque, Iowa",
+	year = 1986
+	}
+
+@book{stoy:denotational,
+	author = "J. E. Stoy",
+	title = "Denotational Semantics: The Scott-Strachey Approach
+                 to Programming Language Theory",
+	publisher = "MIT Press",
+	address = "Cambridge, Massachusetts",
+	year = 1977
+	}
+
+@book{gordon:denotational,
+	author = "M. J. C. Gordon",
+	title = "The Denotational Description of Programming Languages",
+	publisher = "Springer",
+	address = "Berlin",
+	year = 1979
+	}
+
+@article{balzer:exdams,
+	author = "R. M. Balzer",
+	title = "EXDAMS - EXtendable Debugging and Monitoring System",
+	journal = "Proc. of AFIPS Spring Joint Computer Conf.",
+	year = 1969,
+	volume = 34,
+	pages = "567--580",
+	remarks = "an important paper about the implementation of running 
+		  backwarks a computation by keeping efficiently relevent
+		  computation history"
+	}
+
+
+@inproceedings{odonnell:dialogues,
+	author = "J. T. O'Donnell",
+	title = "Dialogues: A Basis for Constructing Programming Environments",
+	booktitle = "ACM Symposium on Languages Issues in Programming
+		Environment",
+	year = 1985,
+	month = "June",
+	remarks = "a nice programming exercise..."
+	}
+
+@misc{sterling:composing,
+	author = "???Sterling and Lakhotia",
+	title  = "Composing Prolog Meta-Interpreters",
+	remarks = "I read it now - amir"
+	}
+
+
+@techreport{jones:mix,
+	author = "Jones, N. D. and P. Sestoft and H. Sondergaard",
+	title = "Mix: a Self-Applicable Partial Evaluator for
+		Experiments in Compiler Generation",
+	institution = "University of Copenhagen",
+	year = "1987",
+	number = "DIKU Report 87/08",
+	address = "Denmark",
+	remarks = "a good intro paper for partial evaluation and self 
+ 			applicability"
+	}
+	
+	
+@inproceedings{delisle:viewing,
+	author = "N. M. Delisle and D. E. Menicosy and M. D.
+		Schwarts",
+	title = "Viewing a Programming Environment as a Single Tool",
+	booktitle = "Proc. of the ACM SIGSOFT/SIGPLAN Software
+			Engineering Symposium on Practical Software 
+			Development Environments",
+	year = "1984",
+	month = "April",
+	note = "ACM SIGPLAN Notices, Vol 19, No. 5, May 1984",
+	remarks = "in the right direction but not formulized and
+	limited since only attach demons to identifiers and does not include
+	post and pre actions, especially overlooking the generality of
+	the method."
+	}
+
+@inproceedings{snodgrass:monitoring,
+	author = "R. Snodgrass",
+	title = "Monitoring in a Software Development Environment: A
+			Relational Approach",
+	booktitle = "Proc. ACM SIGSOFT/SIGPLAN Software
+			Engineering Symoposium on Practical Software 
+			Development Environments",
+	year = "1984",
+	month = "April",
+	day = "23--25",
+	editor = "Peter Handerson",
+	address = "Pittsburgh, Pennsylvania",
+	publisher = "ACM",
+	note = "SIGPLAN Notices, Volume 19, Number 5",
+	remarks = "good terminalogy and definitions. The main
+			theme is the use of relational database to
+			accumulate the information. Does not discuss
+			the generality of the monitor mechanism for
+			expression any monitoring activities."
+	}
+			
+@inproceedings{hall:debugging,
+	author = "Hall, C. V. and O'Donnell, J. T.",
+	title = "Debugging in a side effect free programming
+			environment",
+	booktitle = "Proc. 1985 SIGPLAN Symposium on Programming
+			Languages and Programming environments",
+	year = "1985",
+	month = "June",
+	remarks = "Discusses more the transformatin of functions
+                  to a debugged form. Uses streams and shadow
+		  variables. Uses syntactic transformations."
+   
+}
+
+@inproceedings{tolman:debugging,
+	author = "Tolmach, A. P. and Appel, A. W.",
+	title = "Debugging {Standard} {ML} Without Reverse Engineering",
+	booktitle = "Proc. 1990 ACM Conf. on Lisp and functional programming",
+	year = "1990",
+	month = "June",
+	remarks = "..."
+}
+		
+		
+@article {winder:jdb,
+	author = "R. Winder and J. Nicolson",
+	title = " JDB: An Adaptable Interface for Debugging",
+	journal = "Software-Practice and Experience",
+	year = "1988",
+	month = "March",
+	pages = "221--238",
+	volume = "18(3)",
+	remarks = "Talk about design issues, like a nice user
+			interface. Provide some good terminology. Also
+			provide a high-level frontend to existing
+			debuggers. Important: provide a good list of
+			debugger activities"
+}
+    
+@inproceedings{evans:on-line,
+	author = "Evans G. T. and Darley D. L.",
+	title = "On-line Debugging Techniques: A Survey",
+	booktitle = "Fall Joint Computer Conf.",
+	year = "1966",
+	month = "Fall",
+	remarks = "very old. believe static chekcing will replace debugging"
+}
+     
+@InProceedings{cardelli:multiple,
+  author = 	"Luca Cardelli",
+  title = 	"A semantics of multiple inheritance",
+  booktitle = 	"Proceedings Semantics of Data Types, {France}",
+  year = 	"1984",
+  editor = 	"G. Kahn and D. MacQueen and G. Plotkin",
+  pages = 	"51--68",
+  publisher = 	"Springer-Verlag",
+  note = 	"LNCS 173. Also in Information and Computation 76, 138-164(1988)"
+}
+
+@Article{cardelli-wegner:fun,
+  author = 	"Luca Cardelli and Peter Wegner",
+  title = 	"On understanding types, data abstraction and polymorphism",
+  journal = 	"Computing Survey",
+  year = 	"1985",
+  OPTvolume = 	"17",
+  OPTnumber = 	"4",
+  OPTpages = 	"471-522",
+  OPTmonth = 	"December",
+  OPTnote = 	""
+}
+
+@InProceedings{cook-mitchell:f-bound,
+  author = "P. Canning and W. Cook and W. Hill and W. Olthof and J. Mitchell",
+  title = 	"F-Bounded polyphorism for object-oriented programming",
+  booktitle = 	"Proc. of Conf. on Functional Programming Languages and
+		 Computer Architecture",
+  year = 	"1989",
+  OPTeditor = 	"",
+  OPTpages = 	"273--280",
+  OPTorganization = 	"",
+  OPTpublisher = 	"",
+  OPTaddress = 	"",
+  OPTmonth = 	"",
+  OPTnote = 	""
+}
+
+@PhdThesis{cook:inheritance,
+  author = 	"William Cook",
+  title = 	"A Denotational Semantics of Inheritance",
+  school = 	"Brown University",
+  year = 	"1989",
+  OPTaddress = 	"",
+  OPTmonth = 	"",
+  OPTnote = 	""
+}
+
+@InProceedings{cook:subtype,
+author = 	"William R. Cook and Walter L. Hill and Peter S. Canning",
+  title = 	"Inheritance Is Not Subtyping",
+  booktitle = 	"Conf. Record of {ACM} Seventeenth Symposium on
+		 Principles of Programming Languages",
+  year = 	"1990",
+  OPTeditor = 	"",
+  OPTpages = 	"125--135",
+  OPTorganization = 	"",
+  OPTpublisher = 	"",
+  OPTaddress = 	"",
+  OPTmonth = 	"Jan",
+  OPTnote = 	""
+}
+
+@InProceedings{wand:simple,
+  author = 	"Mitchell Wand",
+  title = 	"Complete type inference for simple objects",
+  booktitle = 	"Second Annual IEEE Symp. on Logic in Computer Science",
+  year = 	"1987",
+  OPTeditor = 	"",
+  OPTpages = 	"37--44",
+  OPTorganization = 	"",
+  OPTpublisher = 	"",
+  OPTaddress = 	"",
+  OPTmonth = 	"June",
+  OPTnote = 	""
+}
+
+@TechReport{wand:single,
+  author = 	"Mitchell Wand",
+  title = 	"Type inference for objects with instance variables and inheritance",
+  institution = "Computer Science, Northeastern University",
+  year = 	"1988",
+  OPTtype = 	"",
+  OPTnumber = 	"",
+  OPTaddress = 	"",
+  OPTmonth = 	"November",
+  OPTnote = 	"NU-CCS-89-2"
+}
+
+@InProceedings{wand:multiple,
+  author = 	"Mitchell Wand",
+  title = 	"Type inference for record concatenation and multiple inheritance",
+  booktitle = 	"Fourth Annual IEEE Symp. on Logic in Computer Science",
+  year = 	"1989",
+  OPTeditor = 	"",
+  OPTpages = 	"92--97",
+  OPTorganization = 	"",
+  OPTpublisher = 	"",
+  OPTaddress = 	"",
+  OPTmonth = 	"June",
+  OPTnote = 	""
+}
+
+@InProceedings{jategaonkar:ml,
+  author = 	" Lalita A. Jategaonkar and John C. Mitchell",
+  title = 	"ML with extended pattern matching and subtypes",
+  booktitle = 	"Proc. of the ACM Conf. on Lisp and Functional Programming",
+  year = 	"1988",
+  OPTeditor = 	"",
+  OPTpages = 	"198--211",
+  OPTorganization = 	"",
+  OPTpublisher = 	"",
+  OPTaddress = 	"",
+  OPTmonth = 	"July",
+  OPTnote = 	""
+}
+
+@InProceedings{ohori-buneman:db,
+  author = 	"Atsushi Ohori and Peter Buneman",
+  title = 	"Type inference in a database programming language",
+  booktitle = 	"Proc. of the ACM Conf. on Lisp and Functional Programming",
+  year = 	"1988",
+  OPTeditor = 	"",
+  OPTpages = 	"174--183",
+  OPTorganization = 	"",
+  OPTpublisher = 	"",
+  OPTaddress = 	"",
+  OPTmonth = 	"July",
+  OPTnote = 	""
+}
+
+@InProceedings{remy:popl89,
+  author = 	"Didier R\'emy",
+  title = 	"Typechecking records and variants in a natural extension of ML",
+  booktitle = 	"Sixteenth Annual ACM Symp. on Principles of Programming Languages",
+  year = 	"1989",
+  OPTeditor = 	"",
+  OPTpages = 	"242--249",
+  OPTorganization = 	"",
+  OPTpublisher = 	"",
+  OPTaddress = 	"",
+  OPTmonth = 	"January",
+  OPTnote = 	""
+}
+
+@TechReport{remy:upenn,
+  author = 	"Didier R\'emy",
+  title = 	"Type inference for records in a natural extension of ML",
+  institution = "Dept. of Computer and Information Science, Univ. of Pennsylvania",
+  year = 	"1989",
+  OPTtype = 	"",
+  OPTnumber = 	"",
+  OPTaddress = 	"",
+  OPTmonth = 	"",
+  OPTnote = 	"Technical Report MS-CIS-90-73"
+}
+
+@misc{cs421
+    ,author={Hudak, P.}
+    ,title={{C}ourse {N}otes {CS}421: {C}ompilers and {I}nterpreters}
+    ,note={Unpublished}
+    ,month=Sep
+    ,year=1990
+    }
+
+@misc{blenkohudak90pre
+    ,author={Blenko, T. and Hudak, P.}
+    ,title={A Framework for Reasoning about Abstract Interpretations}
+    ,note={Submitted to Conf. on Mathematical Foundations
+           of Programming Language Semantics}
+    ,month=Oct
+    ,year=1990
+    }
+
+@techreport{sundarhudak90TR
+    ,author={Sundaresh, R.S. and Hudak, P.}
+    ,title={A Theory of Incremental Computation and its Application}
+    ,institution="Yale University, Department of Computer Science"
+    ,month=Mar
+    ,type="Research Report"
+    ,number="YALEU/DCS/RR770"
+    ,year=1990
+    }
+
+@inproceedings{sundarhudak91
+    ,author={Sundaresh, R.S. and Hudak, P.}
+    ,title={Incremental Computation via Partial Evaluation}
+    ,booktitle={Proceedings 18th Symposium on Principles of Programming
+           Languages}
+    ,organization={ACM}
+    ,month=Jan
+    ,year=1991
+    ,pages={1-13}
+    }
+ 
+@inproceedings{wadler90b
+    ,author={Wadler, Philip}
+    ,title={Comprehending Monads}
+    ,booktitle={Proceedings of Symposium on Lisp and Functional Programming}
+    ,organization={ACM}
+    ,month=Jun
+    ,year=1990
+    ,pages={61-78}
+    ,address={Nice, France}
+    }
+
+@inproceedings{jonessondergaard87
+    ,author="Jones, N. and Sondergaard, H."
+    ,title="A semantics-based framework for the abstract interpretation
+            of {Prolog}"
+    ,booktitle="Abstract Interpretation of Declarative Languages"
+    ,editors="Abramsky, S. and Hankin, C."
+    ,pages="123-142"
+    ,year=1987
+    ,publisher="Ellis Horwood"
+    }
+
+@inproceedings{mellish87
+    ,author="Mellish, C."
+    ,title="Abstract interpretation of {PROLOG} programs"
+    ,booktitle="Abstract Interpretation of Declarative Languages"
+    ,editors="Abramsky, S. and Hankin, C."
+    ,pages="181-198"
+    ,year=1987
+    ,publisher="Ellis Horwood"
+    }
+
+@inproceedings{bloss89
+    ,author={Bloss, A.}
+    ,title={Update Analysis and the Efficient Implementation of
+            Functional Aggregates}
+    ,booktitle={Proceedings of 4th International Conf. on Functional
+                Programming Languages and Computer Architecture}
+    ,organization={ACM, IFIP}
+    ,year=1989
+    ,pages={26-38}
+    }
+
+@phdthesis{mouphd
+    ,author={Mou, Z.G.}
+    ,title={A Formal Model for Divide-and-Conquer and Its Parallel
+            Realization}
+    ,school="Yale University, Department of Computer Science"
+    ,year=1990
+    ,month=May
+    }
+
+@inproceedings{andersonhudak90
+    ,author={Anderson, S. and Hudak, P.}
+    ,title={Compilation of {H}askell Array Comprehensions
+        for Scientific Computing}
+    ,booktitle={ACM SIGPLAN Conf. on Programming Language Design
+        and Implementation}
+    ,year=1990
+    ,month=Jun
+    ,pages={137-149}
+    }
+
+@techreport{varmahudak89,
+	author = "Varma, P. and Hudak, P.",
+	title = "Memo-Functions in {ALFL}",
+	institution = "Yale University Department of Computer Science",
+	year = 1989,
+	month = "December",
+	number = "YALEU/DCS/RR-759"
+}
+
+@InProceedings{consel4:90,
+  author =      "Consel, C.",
+  title = "Binding time analysis for higher order untyped functional
+          languages",
+  booktitle =   "Proc. 1990 {ACM} {S}ymposium on 
+                 {L}isp and {F}unctional {P}rogramming",
+  year =        "1990",
+  note = "To appear"
+}
+
+@inproceedings{guzmanhudak90
+    ,author={Guzm\'an, J. and Hudak, P.}
+    ,title={Single-Threaded Polymorphic Lambda Calculus}
+    ,booktitle={Proceedings of Symposium on Logic in Computer Science}
+    ,organization={IEEE}
+    ,month=Jun
+    ,year=1990
+    ,pages={333-343}
+    }
+
+@misc{hudakguzman90
+    ,author={Hudak, P. and Guzm\'an, J.}
+    ,title={Taming Side Effects with a Single-Threaded Type System}
+    ,note={in preparation}
+    ,address={Yale University, Department of Computer Science}
+    ,year=1990
+    }
+
+@inproceedings{mohretal90
+    ,author={Mohr, E. and Kranz, D. and Halstead, R.}
+    ,title={Lazy Task Creation: A Technique for
+            Increasing the Granularity of Parallel Programs}
+    ,booktitle={Proceedings of Symposium on Lisp and Functional Programming}
+    ,organization={ACM}
+    ,month=Jun
+    ,year=1990
+    ,pages={185-197}
+    ,address={Nice, France}
+    }
+
+@inproceedings{felleisen87
+    ,key={felleisen}
+    ,author={Felleisen, M.}
+    ,title={{$\lambda$-v-CS}: An Extended $\lambda$-Calculus for {S}cheme}
+    ,booktitle={Proc. 1988 ACM Conf. on
+                Lisp and Functional Programming}
+    ,organization={ACM}
+    ,year=1988
+    ,pages={72-85}
+    }
+ 
+@inproceedings{mitchell84
+    ,author={Mitchell, J.C.}
+    ,title={Coercion and Type Inference}
+    ,booktitle={Proceedings of 11th ACM Symposium 
+                on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,pages={175-185}
+    }
+
+@article{fuhmishra89a
+    ,key={fuh}
+    ,author={Fuh, Y-C. and Mishra, P.}
+    ,title={Type Inference with Subtypes}
+    ,journal={Theoretical Computer Science}
+    ,volume={}
+    ,year=1987
+    ,pages=""
+    }
+
+@techreport{kuomishra89
+    ,key={kuo}
+    ,author={Kuo, T-M. and Mishra, P.}
+    ,title={Strictness Analysis: A New Perspective Based on Type Inference}
+    ,institution="The State University of New York at Stony Brook"
+    ,number="89/13"
+    ,year=1989
+    }
+
+@inproceedings{fuhmishra89b
+    ,key={fuh}
+    ,author={Fuh, Y-C. and Mishra, P.}
+    ,title={Polymorphic Subtype Inference: Closing the Theory-Practice Gap}
+    ,booktitle={Proceedings of TAPSOFT 89}
+    ,year=1989
+    ,publisher={Springer-Verlag LNCS (to appear)}
+    }
+
+@misc{wadler89a
+    ,author={Wadler, Philip}
+    ,title={Linear Types Can Change the World!}
+    ,note={Draft, presented at WG2.8 Workshop on Functional Programming}
+    ,address={Mystic, CT}
+    ,year=1989
+    ,month=May
+    }
+
+@misc{wadler90a
+    ,author={Wadler, Philip}
+    ,title={Linear Types Can Change the World!}
+    ,note={Presented at IFIP TC 2 Working Conf. on
+           Programming Concepts and Methods}
+    ,address={Sea of Galilee, Israel}
+    ,year=1990
+    ,month=Apr
+    }
+
+@techreport{gifford87
+    ,key={gifford}
+    ,author={Gifford, D.K.}
+    ,title={FX-87 Reference Manual}
+    ,institution="MIT"
+    ,number="LCS TR-409"
+    ,year=1987
+    ,month=Sept
+    }
+
+@phdthesis{eekelen88
+    ,key={eekelen}
+    ,author={Eekelen, M.C.J.D. van}
+    ,title={Parallel Graph Rewriting --- Some Contribution to its Theory,
+            its Implementation and its Applications}
+    ,school="University of Nijmegen"
+    ,year=1988
+    ,month=Dec
+    }
+
+@techreport{haskell1
+    ,author="Hudak, P. and Wadler (editors), P."
+    ,title="Report on the {P}rogramming {L}anguage {H}askell, 
+           {A} {N}on-strict {P}urely {F}unctional {L}anguage ({V}ersion 1.0)"
+    ,institution="Yale University, Department of Computer Science"
+    ,month=Apr
+    ,year=1990
+    ,number="YALEU/DCS/RR777"
+    }
+
+@techreport{haskell2
+    ,author="Hudak, P. and Peyton Jones, Simon L. and Wadler (editors), P."
+    ,title="Report on the {P}rogramming {L}anguage {H}askell, 
+           {A} {N}on-strict {P}urely {F}unctional {L}anguage ({V}ersion 1.1)"
+    ,institution="Yale University, Department of Computer Science"
+    ,month=Aug
+    ,year=1991
+    ,number="YALEU/DCS/RR777"
+    }
+
+@article{haskell-sigplan
+    ,author="Hudak, Paul and Peyton Jones, Simon L. and Wadler (editors), Philip"
+    ,title="Report on the {P}rogramming {L}anguage {H}askell, 
+           {A} {N}on-strict {P}urely {F}unctional {L}anguage ({V}ersion 1.2)"
+    ,journal="ACM SIGPLAN Notices"
+    ,volume=27
+    ,number=5
+    ,month=May
+    ,year=1992
+    }
+
+@article{haskell
+    ,author="Hudak, Paul and Peyton Jones, Simon L. and Wadler (editors), Paul"
+    ,title="Report on the {P}rogramming {L}anguage {H}askell, 
+           {A} {N}on-strict {P}urely {F}unctional {L}anguage ({V}ersion 1.2)"
+    ,journal="ACM SIGPLAN Notices"
+    ,volume=27
+    ,number=5
+    ,month=May
+    ,year=1992
+    }
+
+@article{blos88b
+    ,author={Bloss, A. and Hudak, P. and Young, J.}
+    ,title={An Optimizing Compiler for a Modern Functional Language}
+    ,journal={The Computer Journal}
+    ,volume=31
+    ,number=6
+    ,year=1988
+    ,pages={152-161}
+    }
+ 
+@inproceedings{mul-t
+    ,author={Kranz, D.A. and Halstead, R.H. and Mohr, E.}
+    ,title={Mul-{T}: A High-Performance Parallel {L}isp}
+    ,booktitle={Proceedings of 1989 SIGPLAN Conf. on 
+                Programming Language Design and Implementation}
+    ,organization={ACM/SIGPLAN}
+    ,year=1989
+    ,month=Jun
+    ,pages={81-90}
+    }
+ 
+@inproceedings{hudakchapter91
+    ,author={Hudak, P.}
+    ,title={Para-functional Programming in {H}askell}
+    ,booktitle={Parallel Functional Languages and Compilers}
+    ,editors={Szymanski, B.K.}
+    ,year=1991
+    ,publisher={ACM Press (New York) and Addison-Wesley (Reading)}
+    ,chapter={5}
+    ,pages={159-196}
+    }
+
+@misc{huda89c
+    ,author={Hudak, P. and Guzm\'an, J.}
+    ,title={On Expressing the Mutation of State in a Functional
+            Programming Language}
+    ,note={presented at WG2.8 Workshop on Functional Programming}
+    ,address={Mystic, CT}
+    ,year=1989
+    ,month=May
+    }
+
+@inproceedings{wadl85b
+    ,key={wadler}
+    ,author={Wadler, P.}
+    ,title={Listlessness is Better Than Laziness II:
+        Composing listless functions}
+    ,booktitle={LNCS 217: Programs as Data Objects}
+    ,pages={282-305}
+    ,publisher={Springer-Verlag}
+    ,year=1985
+    } 
+
+@InProceedings{darlingtonwhile87
+    ,author={Darlington, J. and While, L.}
+    ,title={Controlling the Behavior of Functional Language Systems}
+    ,booktitle={Proceedings of 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer-Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={278-300}
+    }
+
+@techreport{hughes85
+    ,author={Hughes, R.J.M.}
+    ,title={An Efficient Implementation of Purely Functional Arrays}
+    ,institution={Programming Methodology Group, 
+                  Chalmers University of Technology}
+    ,year=1985
+    }
+ 
+@inproceedings{holmstrom83
+    ,author={Holmstrom, S.}
+    ,title={How to Handle Large Data Structures in Functional Languages}
+    ,booktitle={Proc.~of SERC/Chalmers Workshop on 
+                Declarative Programming Languages}
+    ,year=1983
+    }
+ 
+@techreport{aasaetal87
+    ,author={Aasa, A. and Holmstrom, S. and Nilsson, C.}
+    ,title={An Efficiency Comparison of Some Representations of
+            Purely Functional Arrays}
+    ,institution={Programming Methodology Group, 
+                  Chalmers University of Technology}
+    ,number=33
+    ,month=May
+    ,year=1987
+    }
+ 
+@phdthesis{mullin88
+    ,author={Mullin, L.R.}
+    ,title={A Mathematics of Arrays}
+    ,school={Computer and Information Science and CASE Center, 
+             Syracuse University}
+    ,year=1988
+    ,month=Dec
+    }
+ 
+@techreport{ande89
+    ,author="Anderson, S. and Hudak, P."
+    ,title="Efficient Compilation of {H}askell Array Comprehensions"
+    ,institution="Yale University, Department of Computer Science"
+    ,month=Mar
+    ,type="Research Report"
+    ,number="YALEU/DCS/RR693"
+    ,year=1989
+    }
+
+@InProceedings{lucassengifford88
+    ,key={lucassen}
+    ,author={Lucassen, J.M. and Gifford, D.K.}
+    ,title={Polymorphic Effect Systems}
+    ,booktitle={Proceedings of 15th ACM Symposium 
+                on Principles of Programming Languages}
+    ,month=Jan
+    ,year=1988
+    ,pages={47-57}
+    }
+
+@InProceedings{giffordlucassen86
+    ,Key={gifford}
+    ,Author={Gifford, D.K. and Lucassen, J.M.}
+    ,Title={Integrating Functional and Imperative Programming}
+    ,Booktitle={Proceedings~1986 ACM Conf. on
+                Lisp and Functional Programming}
+    ,Organization={ACM SIGPLAN/SIGACT/SIGART}
+    ,Year=1986
+    ,Month=Aug
+    ,Pages={28-38}
+    }
+
+@misc{hancock87inpeyt87
+    ,author={Hancock, P.}
+    ,title={Polymorphic Type-Checking}
+    ,note={Chapters 8 and 9 in \cite{peyt87}}
+    }
+
+@misc{wadler87inpeyt87
+    ,author={Wadler, P.}
+    ,title={Efficient Compilation of Pattern-Matching}
+    ,note={Chapter 5 in \cite{peyt87}}
+    }
+
+@article{burton88
+    ,author={Burton, F.W.}
+    ,title={Nondeterminism with Referential Transparency in Functional 
+            Programming Languages}
+    ,journal={The Computer Journal}
+    ,year=1988
+    ,volume=31
+    ,number=3
+    ,pages={243-247}
+    }
+
+@phdthesis{tofte88
+    ,key={tofte}
+    ,author={Tofte, M}
+    ,title={Operational Semantics and Polymorphic Type Inference}
+    ,school={University of Edinburgh, 
+             Department of Computer Science (CST-52-88)}
+    ,year=1988
+    ,month=May
+    }
+ 
+@InProceedings{berry78
+    ,key={berry}
+    ,author={Berry, Gerard}
+    ,title={S\'{e}quentialit\'{e} de l'\'{e}valuation formelle des 
+            $\lambda$-expressions}
+    ,booktitle={Proceedings 3-e Colloque International sur la Programmation}
+    ,year=1978
+    ,month=Mar
+    }
+
+@phdthesis{girard72
+    ,key={girard}
+    ,author={Girard, J.-Y.}
+    ,title={Interpr\'{e}tation Fonctionelle et Elimination des Coupures
+            dans l'Arithm\'{e}tique d'Ordre Sup\'{e}rieur}
+    ,school={Univ. of Paris}
+    ,year=1972
+    }
+ 
+@book{wegner68
+    ,key={wegner}
+    ,author={Wegner, P.}
+    ,title={Programming Languages, Information Structures, and Machine Organization}
+    ,publisher={McGraw-Hill}
+    ,year=1968
+    }
+
+@InProceedings{reynolds85
+    ,key={reynolds}
+    ,author={Reynolds, J.C.}
+    ,title={Three Approaches to Type Structure}
+    ,booktitle={Mathematical Foundations of Software Development}
+    ,publisher={Springer-Verlag LNCS 185}
+    ,year=1985
+    ,month=Mar
+    ,pages={97-138}
+    }
+
+@book{wikstrom88
+    ,key={wikstrom}
+    ,author={Wikstr$\ddot{o}$m, A.}
+    ,title={Functional Programming Using Standard ML}
+    ,publisher={Prentice-Hall}
+    ,year=1987
+    }
+
+@techreport{tui
+        ,key="boutel"
+        ,author="Boutel, B.E."
+        ,title="Tui Language Manual"
+        ,institution="Victoria University of Wellington, 
+                      Department of Computer Science"
+        ,number="CSD-8-021"
+        ,year=1988
+        }
+
+@techreport{orwell
+        ,key="Wadler"
+        ,author="Wadler, P. and Miller, Q."
+        ,title="An Introduction to Orwell"
+        ,institution="Programming Research Group, Oxford University"
+        ,year=1988
+        ,note="(First version, 1985.)"
+        }
+
+@InProceedings{grip87
+    ,key={peytonjones}
+    ,author={Peyton Jones, Simon L. and Clack, C. and Salkild, J. and Hardie, M.}
+    ,title={{GRIP}---A High-performance Architecture for Parallel Graph Reduction} 
+    ,booktitle={Proceedings of 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer-Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={98-112}
+    }
+
+@InProceedings{watsonwatson87
+    ,key={watson}
+    ,author={Watson, P. and Watson, I.}
+    ,title={Evaluating Functional Programs on the {FLAGSHIP} machine}
+    ,booktitle={Proceedings of 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer-Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={80-97}
+    }
+
+@InProceedings{burnetal88
+    ,Key={burn}
+    ,Author={Burn, G.L. and Peyton Jones, Simon L. and Robson, J.D.}
+    ,Title={The Spineless {G}-Machine}
+    ,Booktitle={Proceedings~1988 ACM Conf. on Lisp and Functional Programming}
+    ,Organization={ACM SIGPLAN/SIGACT/SIGART}
+    ,Year=1988
+    ,Month=Aug
+    ,Address={Salt Lake City, Utah}
+    ,Pages={244-258}
+    }
+
+@techreport{huda89b
+        ,key="Hudak"
+        ,author="Hudak, P. and Sundaresh, R."
+        ,title="On the Expressiveness of Purely Functional {I/O} Systems"
+        ,institution="Yale University, Department of Computer Science"
+        ,month=Feb
+        ,number="YALEU/DCS/RR-665"
+        ,year=1989
+        }
+
+@InProceedings{kaes88
+    ,key={kaes}
+    ,author={Kaes, S.}
+    ,title={Parametric Polymorphsim}
+    ,booktitle={Proc. 2nd Eupropean Symposium on Programming}
+    ,month=Mar
+    ,year=1988
+    ,publisher={Springer-Verlag LNCS 300}
+    }
+
+@InProceedings{wadlerblott89
+    ,key={wadler}
+    ,author={Wadler, P. and Blott, S.}
+    ,title={How to Make {\em ad hoc} Polymorphism Less {\em ad hoc}}
+    ,booktitle={Proceedings of 16th ACM Symposium 
+                on Principles of Programming Languages}
+    ,month=Jan
+    ,year=1989
+    ,pages={60-76}
+    }
+
+@article{tuperlis86
+    ,key={tuperlis}
+    ,author={Tu, H-C. and Perlis, A.J.}
+    ,title={{FAC}: A Functional {APL} Language}
+    ,journal={IEEE Software}
+    ,volume=3
+    ,number=1
+    ,year=1986
+    ,month=Jan
+    ,pages={36-45}
+    }
+
+@article{fortuneetal85
+    ,key={fortune}
+    ,author={Fortune, S. and Leivant, D. and O'Donnell, M.}
+    ,title={The Expressiveness of Simple and Second-Order Type Structures}
+    ,journal={JACM}
+    ,volume=30
+    ,number=1
+    ,year=1985
+    ,month=Jan
+    ,pages={151-185}
+    }
+
+@techreport{daisy
+    ,key={johnson}
+    ,author={Johnson, S.D.}
+    ,title={Daisy Programming Manual}
+    ,institution={Indiana University Computer Science Department}
+    ,year=1988
+    ,note={(in progress, draft available on request)}
+    }
+ 
+@book{fieldharrison88
+    ,key={field}
+    ,author={Field, A.J. and Harrison, P.G.}
+    ,title={Functional Programming}
+    ,publisher={Adison-Wesley}
+    ,address={Workingham, England}
+    ,year=1988
+    }
+
+@inproceedings{henderson82a
+    ,author={Henderson, P.}
+    ,title={Purely Functional Operating Systems}
+    ,booktitle={Functional Programming and Its Applications:
+                An Advanced Course}
+    ,editors={Darlington, J. and Henderson, P. and Turner, D.A.}
+    ,pages={177-192}
+    ,year=1982
+    ,publisher={Cambridge University Press}
+    }
+
+@InProceedings{appelmacqueen87
+    ,author={Appel, A.W. and MacQueen, D.B.}
+    ,title={A Standard {ML} Compiler}
+    ,booktitle={Proceedings of 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer-Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={301-324}
+    }
+
+@book{degrootlindstrom85
+    ,title={Functional and Logic Programming}
+    ,author={Degroot, D. and Lindstrom, G.}
+    ,year=1985
+    ,publisher={Prentice-Hall}
+    }
+ 
+@book{milnestrachey76
+    ,key={milne}
+    ,author={Milne, R.E. and Strachey, C.}
+    ,title={A Theory of Programming Language Semantics}
+    ,publisher={Chapman and Hall, London, and John Wiley, New York}
+    ,year=1976
+    }
+ 
+@article{hindley69
+    ,key={hindley}
+    ,author={Hindley, J. Roger}
+    ,title={The Principal Type Scheme of an Object in Combinatory Logic}
+    ,journal={Transactions of the American Mathematical Society}
+    ,volume=146
+    ,year=1969
+    ,month=Dec
+    ,pages={29-60}
+    }
+ 
+@article{blos88
+    ,key={blosshudak}
+    ,author={Bloss, A. and Hudak, P. and Young, J.}    
+    ,title={Code Optimizations for Lazy Evaluation}
+    ,journal={Lisp and Symbolic Computation: An International Journal}
+    ,year=1988
+    ,volume=1
+    ,number=2
+    ,month=Sep
+    ,pages={147-164}
+    }
+
+@phdthesis{wadsworth71
+    ,key={wadsworth}
+    ,author={Wadsworth, C.P.}
+    ,title={Semantics and Pragmatics of the Lambda Calculus}
+    ,school={Oxford University}
+    ,year=1971
+    }
+ 
+@techreport{hughes84
+    ,key={hughes}
+    ,author={Hughes, R.J.M.}
+    ,title={Why Functional Programming Matters}
+    ,institution={Programming Methodology Group, 
+                  Chalmers University of Technology}
+    ,number={16}
+    ,month=Nov
+    ,year=1984
+    }
+ 
+@techreport{wadler87
+    ,key={wadler}
+    ,author={Wadler, P.}
+    ,title={Views: A Way for Pattern-Matching to Cohabit with Data Abstraction}
+    ,institution={Programming Methodology Group, 
+                  Chalmers University of Technology}
+    ,number={34}
+    ,month=Mar
+    ,year=1987
+    ,note={Preliminary version appeared in the Proc. 14th ACM
+          Symposium on Principles of Programming Languages, January 1987}
+    }
+ 
+@article{cardelliwegner85
+    ,key={cardelli}
+    ,author={Cardelli, L. and Wegner, P.}
+    ,title={On Understanding Types, Data Abstraction, and Polymorphism}
+    ,journal={Computing Surveys}
+    ,volume=17
+    ,number=4
+    ,year=1985
+    ,month=Dec
+    ,pages={471-522}
+    }
+ 
+@book{wadgeashcroft85
+    ,key={wadge}
+    ,author={Wadge, W.W. and Ashcroft, E.A.}
+    ,title={Lucid, the Dataflow Programming Language}
+    ,publisher={Academic Press}
+    ,address={London}
+    ,year=1985
+    }
+ 
+@article{ashcroftwadge77
+    ,key={ashcroft}
+    ,author={Ashcroft, E.A. and Wadge, W.W.}
+    ,title={Lucid, a Nonprocedural Language with Iteration}
+    ,journal=CACM
+    ,volume=20
+    ,year=1976
+    ,pages={519-526}
+    }
+
+@techreport{backusetal86
+    ,key={backus}
+    ,author={Backus, J. and Williams, J.H. and Wimmers, E.L.}
+    ,title={{FL} Language Manual (Preliminary Version)}
+    ,institution={IBM Almaden Research Center}
+    ,number={RJ 5339 (54809) Computer Science}
+    ,month=Nov
+    ,year=1986
+    }
+ 
+@phdthesis{tu86
+    ,key={tu}
+    ,author={Tu, H-C.}
+    ,title={{FAC}: Functional Array Calculator and its Application to {APL}
+            and Functional Programming}
+    ,school={Yale University, Department of Computer Science}
+    ,month=Apr
+    ,year=1986
+    ,note={Available as Research Report YALEU/DCS/RR-468}
+    }
+ 
+@techreport{twentel
+    ,key={kroeze}
+    ,author={Kroeze, H.J.}
+    ,title={The {TWENTEL} System (Version 1)}
+    ,institution={Department of Computer Science, University of Twente,
+                  The Netherlands}
+    ,year="1986/87"
+    }
+ 
+@book{thakkar87
+    ,key={thakkar}
+    ,editor={Thakkar, S.S.}
+    ,title={Selected Reprints on Dataflow and Reduction Architectures}
+    ,publisher={The Computer Society Press}
+    ,address={Washington, DC}
+    ,year=1987
+    }
+ 
+@article{vegdahl84
+    ,key={vegdahl}
+    ,author={Vegdahl, S.R.}
+    ,title={A Survey of Proposed Architectures for the Execution
+            of Functional Languages}
+    ,journal={IEEE Transactions on Computers}
+    ,volume="C-23"
+    ,number=12
+    ,month=Dec
+    ,year=1984
+    ,pages={1050-1071}
+    }
+ 
+@inproceedings{gordonetal78
+    ,key={gordon}
+    ,author={Gordon, M. and Milner, R. and Morris, L. and Newey, M. and
+             Wadswirth, C.}
+    ,title={A Metalanguage for Interactive Proof in {LCF}}
+    ,booktitle={Conf. Record of the Fifth Annual ACM Symposium
+                on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1978
+    ,pages={119-130}
+    }
+ 
+@phdthesis{fairbairn85
+    ,key={fairbairn}
+    ,author={Fairbairn, J.}
+    ,title={Design and Implementation of a Simple Typed Language
+            Based on the Lambda Calculus}
+    ,school={University of Cambridge}
+    ,month=May
+    ,year=1985
+    ,note={Available as Computer Laboratory TR No.\ 75}
+    }
+ 
+@techreport{mcgrawetal83
+    ,key={mcgraw}
+    ,author={McGraw, J. and Allan, S. and Glauart, J. and Dobes, I.}
+    ,title={{SISAL}: Streams and Iteration in a Single-Assignment Language,
+            Language Reference Manual}
+    ,institution={Lawrence Livermore National Laboratory, M-146}
+    ,month=Jul
+    ,year=1983
+    }
+ 
+@inproceedings{guttagetal81
+    ,key={guttaghorning}
+    ,author={Guttag, J. and Horning, J. and Williams, J.}
+    ,title={{FP} with Data Abstraction and Strong Typing}
+    ,booktitle={Proc. 1981 Conf. on Functional Programming 
+                Languages and Computer Architecture}
+    ,organization={ACM}
+    ,year=1981
+    ,pages={11-24}
+    }
+ 
+@inproceedings{turner82
+    ,key={turner}
+    ,author={Turner, D.A.}
+    ,title={Recursion Equations as a Programming Language}
+    ,booktitle={Functional Programming and Its Applications:
+                An Advanced Course}
+    ,editors={Darlington, J. and Henderson, P. and Turner, D.A.}
+    ,pages={1-28}
+    ,year=1982
+    ,publisher={Cambridge University Press}
+    }
+ 
+@inproceedings{turner81
+    ,key={turner}
+    ,author={Turner, D.A.}
+    ,title={The Semantic Elegance of Applicative Languages}
+    ,booktitle={Proc. 1981 Conf. on Functional Programming 
+                Languages and Computer Architecture}
+    ,organization={ACM}
+    ,year=1981
+    ,pages={85-92}
+    }
+
+@book{iverson62
+    ,key={iverson}
+    ,author={Iverson, K.}
+    ,title={A Programming Language}
+    ,publisher={Wiley}
+    ,address={New York}
+    ,year=1962
+    }
+ 
+@article{milner78
+    ,key={milner}
+    ,author={Milner, R.A.}
+    ,title={A Theory of Type Polymorphism in Programming}
+    ,journal={Journal of Computer and System Sciences}
+    ,volume=17
+    ,number=3
+    ,year=1978
+    ,month=Dec
+    ,pages={348-375}
+    }
+ 
+@book{birdwadler88
+    ,key={bird}
+    ,author={Bird, R. and Wadler, P.}
+    ,title={Introduction to Functional Programming}
+    ,publisher={Prentice Hall}
+    ,address={New York}
+    ,year=1988
+    }
+ 
+@article{post43
+    ,key={post}
+    ,author={Post, E.L.}
+    ,title={Formal Reductions of the General Combinatorial Decision Problem}
+    ,journal={American Journal of Mathematics}
+    ,volume=65
+    ,year=1943
+    ,pages={197-215}
+    }
+ 
+@article{markov51
+    ,key={markov}
+    ,author={Markov, A.A.}
+    ,title={Teoriya Algorifmov ({T}heory of Algorithms)}
+    ,journal={Trudy Mat. Inst. Steklov}
+    ,volume=38
+    ,year=1951
+    ,pages={176-189}
+    }
+ 
+@techreport{cartwright76
+    ,key={cartwright}
+    ,author={Cartwright, R.}
+    ,title={A Practical Formal Semantic Definition and Verification System
+            for Typed Lisp}
+    ,institution={Stanford Artifical Intelligence Laboratory AIM-296}
+    ,year=1976
+    }
+ 
+@article{gelernteretal60
+    ,key={gelernter}
+    ,author={Gelernter, H. and Hansen, J.R. and Gerberich, C.L.}
+    ,title={A {FORTRAN}-Compiled List Processing Language}
+    ,journal={JACM}
+    ,volume=7
+    ,number=2
+    ,year=1960
+    ,pages={87-101}
+    }
+ 
+@InProceedings{McCarthy62d,
+  author =       "John McCarthy",
+  title =        "Computer Programs for Checking Mathematical Proofs",
+  booktitle =    "Proceedings of Symposia in Pure Mathematics",
+  organization = "Symposia in Pure Mathematics",
+  address =      "Providencce",
+  volume =       "5",
+  note =         "AMS",
+  year =         "1962",
+}
+@inproceedings{mccarthy78
+    ,key={mccarthy}
+    ,author={McCarthy, J.}
+    ,title={History of {L}isp}
+    ,booktitle={Preprints of Proceedings of {ACM} {SIGPLAN} History of 
+                Programming Languages Conf.}
+    ,year=1978
+    ,pages={217-223}
+    ,note={Published as SIGPLAN Notices 13(8), August 1978}
+    }
+ 
+@phdthesis{petznick70
+    ,key={petznick}
+    ,author={Petznick, G.W.}
+    ,title={Combinatory Programming}
+    ,school={University of Wisconsin, Madison}
+    ,year=1970
+    ,note={Available as publication 70-24812 from University
+           Microfilms Int.}
+    }
+ 
+@article{turing36
+    ,key={turing}
+    ,author={Turing, A.M.}
+    ,title={On Computable Numbers with an Application to the 
+            Entscheidungsproblem}
+    ,journal={Proc. London Mathematical Society}
+    ,volume=42
+    ,year=1936
+    ,pages={230-265}
+    }
+ 
+@article{turing37
+    ,key={turing}
+    ,author={Turing, A.M.}
+    ,title={Computability and $\lam$-definability}
+    ,journal={Journal of Symbolic Logic}
+    ,volume=2
+    ,year=1937
+    ,pages={153-163}
+    }
+ 
+@book{curryfeys58
+    ,key={curryfeys}
+    ,author={Curry, H.B. and Feys, R.}
+    ,title={Combinatory Logic, Vol. 1}
+    ,publisher={North-Holland}
+    ,address={Amsterdam}
+    ,year=1958
+    }
+ 
+@article{curry30
+    ,key={curry}
+    ,author={Curry, H.B.}
+    ,title={Grundlagen der Kombinatorischen Logik}
+    ,journal={American Journal of Mathematics}
+    ,volume=52
+    ,year=1930
+    ,pages={509-536,789-834}
+    }
+ 
+@book{church56
+    ,key={church}
+    ,author={Church, A.}
+    ,title={Introduction to Mathematical Logic}
+    ,publisher={Princeton University Press}
+    ,address={Princeton, NJ}
+    ,year=1956
+    }
+ 
+@article{church32
+    ,key={church}
+    ,author={Church, A.}
+    ,title={A Set of Postulates for the Foundation of Logic}
+    ,journal={Annals of Mathematics}
+    ,volume=2
+    ,number={33-34}
+    ,year={1932-1933}
+    ,pages={346-366,839-864}
+    }
+ 
+@article{churchrosser36
+    ,key={church}
+    ,author={Church, A. and Rosser, J.B.}
+    ,title={Some Properties of Conversion}
+    ,journal={Transactions of the American Mathematical Society}
+    ,volume=39
+    ,year=1936
+    ,pages={472-482}
+    }
+ 
+@article{kleenerosser35
+    ,key={kleene}
+    ,author={Kleene, S.C. and Rosser, J.B.}
+    ,title={The Inconsistency of Certain Forms of Logic}
+    ,journal={Annals of Mathematics}
+    ,volume=2
+    ,number=36
+    ,year=1935
+    ,pages={630-636}
+    }
+
+@article{kleene36
+    ,key={kleene}
+    ,author={Kleene, S.C.}
+    ,title={$\lam$-definability and Recursiveness}
+    ,journal={Duke Mathematical Journal}
+    ,volume=2
+    ,year=1936
+    ,pages={340-353}
+    }
+ 
+@article{landin64
+    ,key={landin}
+    ,author={Landin, P.J.}
+    ,title={The Mechanical Evaluation of Expressions}
+    ,journal={Computer Journal}
+    ,volume=6
+    ,number=4
+    ,year=1964
+    ,month=Jan
+    ,pages={308-320}
+    }
+  
+@article{landin65
+    ,key={landin}
+    ,author={Landin, P.J.}
+    ,title={A Correspondance between {ALGOL} 60 and {C}hurch's Lambda Notation}
+    ,journal=CACM
+    ,volume=8
+    ,year=1965
+    ,pages={89-101,158-165}
+    }
+  
+@article{landin66
+    ,key={landin}
+    ,author={Landin, P.J.}
+    ,title={The Next 700 Programming Languages}
+    ,journal=CACM
+    ,volume=9
+    ,number=3
+    ,year=1966
+    ,pages={157-166}
+    }
+  
+@book{vanheijenoort67
+    ,key={vanheijenoort}
+    ,author={van Heijenoort, J.}
+    ,title={From {F}rege to {G}\"{o}del}
+    ,publisher={Harvard University Press}
+    ,address={Cambridge, MA}
+    ,year=1967
+    }
+ 
+@article{reynolds70
+    ,key={reynolds}
+    ,author={Reynolds, J.C.}
+    ,title={{GEDANKEN} -- a simple typless language based on
+            the principle of completeness and reference concept}
+    ,journal=CACM
+    ,volume=13
+    ,number=5
+    ,year=1970
+    ,pages={308-319}
+    }
+ 
+@article{tennent76
+    ,key={tennent}
+    ,author={Tennent, R.D.}
+    ,title={The Denotational Semantics of Programming Languages}
+    ,journal=CACM
+    ,volume=19
+    ,number=8
+    ,year=1976
+    ,pages={}
+    }
+ 
+@book{gordonetal79
+    ,key={gordon}
+    ,author={Gordon, M.J. and Milner, R. and Wadsworth, C.P.}
+    ,title={Edinburgh {LCF}}
+    ,publisher={Springer-Verlag LNCS 78}
+    ,address={Berlin}
+    ,year=1979
+    }
+ 
+@techreport{stoye85
+    ,key={stoye}
+    ,author={Stoye, W.}
+    ,title={A New Scheme for Writing Functional Operating Systems}
+    ,institution={University of Cambridge, Computer Laboratory}
+    ,number=56
+    ,year=1985
+    }
+
+@inproceedings{boehm85
+    ,key={boehm}
+    ,author={Boehm, H-J.}
+    ,title={Partial Polymorphic Type Inference is Undecidable}
+    ,booktitle={Proceedings of 26th Symposium on Foundations of
+                Computer Science}
+    ,pages={339-345}
+    ,month=Oct
+    ,year=1985
+    }
+
+@inproceedings{pfenning88
+    ,key={pfenning}
+    ,author={Pfenning, F.}
+    ,title={Partial Polymorphic Type Inference and Higher-Order Unification}
+    ,Booktitle={Proceedings~1988 ACM Conf. on Lisp and Functional Programming}
+    ,Organization={ACM SIGPLAN/SIGACT/SIGART}
+    ,Year=1988
+    ,Month=Aug
+    ,Address={Salt Lake City, Utah}
+    ,Pages={153-163}
+    }
+
+@article{huda89a
+    ,author={Hudak, P.}
+    ,title={Conception, Evolution, and Application of Functional
+            Programming Languages}
+    ,journal={ACM Computing Surveys}
+    ,volume=21
+    ,number=3
+    ,year=1989
+    ,pages={359-411}
+    }
+ 
+@article{mou88
+    ,author={Mou, Z.G. and Hudak, P.}
+    ,title={An Algebraic Model for Divide-and-Conquer and its Parallelism}
+    ,journal={Journal of Supercomputing}
+    ,volume=2
+    ,number=3
+    ,year=1988
+    }
+ 
+@article{girard87
+    ,author={Girard, J.-Y.}
+    ,title={Linear Logic}
+    ,journal={Theoretical Computer Science}
+    ,volume=50
+    ,year=1987
+    ,pages={1-102}
+    }
+
+@InProceedings{abadietal89
+    ,author={Abadi, Mart{\'\i}n and 
+             Cardeli, Luca and Pierce, Benjamin and Plotkin, Gordon D.}
+    ,title={Dynamic Typing in a Statically Typed Language}
+    ,booktitle={ACM Symposium on Principles of Programming Languages}
+    ,month=Jan
+    ,year=1989
+    ,pages={213-227}
+    }
+
+@InProceedings{appel89
+    ,author={Appel, A.W. and Jim, T.}
+    ,title={Continuation-passing, Closure-passing Style}
+    ,booktitle={ACM Symposium on Principles of Programming Languages}
+    ,month=Jan
+    ,year=1989
+    ,pages={193-302}
+    }
+
+@article{odon88
+    ,key={odonnell}
+    ,author={O'Donnell, J.T. and Hall, C.V.}
+    ,title={Debugging in Applicative Languages}
+    ,journal={Lisp and Symbolic Computation: In International Journal}
+    ,volume=1
+    ,number=2
+    ,year=1988
+    ,month=Sep
+    ,pages={113-146}
+    }
+
+@techreport{mou89
+    ,key={mou}
+    ,author={Mou, Z.G. and Anderson, S. and Hudak, P.}
+    ,title={Parallelism in Sequential Divide-and Conquer (Extended Abstract)}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-683}
+    ,month=Feb
+    ,year=1989
+    }
+
+@article{flic
+    ,key={peytonjones}
+    ,author={Peyton Jones, Simon L.}
+    ,title={{FLIC} --- a functional language intermediate code}
+    ,journal={SIGPLAN Notices}
+    ,volume=23
+    ,number=8
+    ,year=1988
+    ,pages={30-48}
+    }
+
+@techreport{darl85
+    ,key={darlington}
+    ,author={Darlington, J. and Field, A.J. and Pull, H.}
+    ,title={The unification of functional and logic languages}
+    ,institution={Department of Computing,
+                  Imperial College of Science and Technology}
+    ,month=Feb
+    ,year=1985
+    }
+
+@article{slag74
+    ,key={slagle}
+    ,author={Slagle, J.R.}
+    ,title={Automated theorem-proving for theories with simplifiers}
+    ,journal={JACM}
+    ,volume=21
+    ,number=4
+    ,year=1974
+    ,pages={622-642}
+    }
+
+@techreport{lank75
+    ,key={lankford}
+    ,author={Lankford, D.S.}
+    ,title={Canonical inference}
+    ,institution={University of Texas at Austin}
+    ,number={ATP-32}
+    ,year=1975
+    }
+
+@inproceedings{hull80
+    ,key={hullot}
+    ,author={Hullot, J-M.}
+    ,title={Canonical forms and unification}
+    ,booktitle={Conf. on Automated Deduction}
+    ,year=1980
+    ,pages={318-334}
+    }
+
+@article{warr77
+    ,key={warren}
+    ,author={Warren, D. and Pereira, L.M. and Pereira, F.}
+    ,title={Prolog --- the language and its implementation compared with Lisp}
+    ,journal={SIGPLAN Notices}
+    ,volume=12
+    ,number=8
+    ,year=1977
+    ,pages={}
+    }
+
+@inproceedings{subr84b
+    ,key={subrahmanyam}
+    ,author={Subrahmanyam, P.A. and You, J-H.}
+    ,title={FUNLOG = functions + logic: a computational model
+            integrating functional and logic programming}
+    ,booktitle={International Symposium Logic Programming}
+    ,organization={IEEE}
+    ,year=1984
+    ,pages={144-153}
+    }
+
+@inproceedings{sato83
+    ,key={sato}
+    ,author={Sato, M. and Sakurai, T.}
+    ,title={Qute: a Prolog/Lisp type language for logic programming}
+    ,booktitle={Eigth International Joint Conf. Artificial Intelligence}
+    ,year=1983
+    }
+
+@inproceedings{robi82a
+    ,key={robinson}
+    ,author={Robinson, J.A. and Sibert, E.E.}
+    ,title={LOGLISP: motivation, design and implementation}
+    ,booktitle={Logic Programming}
+    ,editors={Clark, K.L. and Tarnlund, S-A.}
+    ,pages={299-314}
+    ,year=1982
+    ,publisher={Academic Press}
+    }
+
+@inproceedings{mell84
+    ,key={mellish}
+    ,author={Mellish, C. and Hardy, S.}
+    ,title={Integrating PROLOG in the POPLOG environment}
+    ,booktitle={Implementations of PROLOG}
+    ,editors={Campbell, J.A.}
+    ,pages={147-162}
+    ,year=1984
+    ,publisher={Ellis Horwood}
+    }
+
+@inproceedings{mala84
+    ,key={malachi}
+    ,author={Malachi, Y. and Manna, Z. and Waldinger, R.}
+    ,title={TABLOG: The deductive-tableau programming language}
+    ,booktitle={Proceedings 1984 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Aug
+    ,pages={323-330}
+    }
+
+@inproceedings{lind85
+    ,key={lindstrom}
+    ,author={Lindstrom, G.}
+    ,title={Functional programming and the logical variable}
+    ,booktitle={Proceedings 11th Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1985
+    ,month=Jan
+    ,pages={266-280}
+    }
+
+@inproceedings{komo82
+    ,key={komorowski}
+    ,author={Komorowski, H.J.}
+    ,title={QLOG --- The programming environment PROLOG in LISP}
+    ,booktitle={Logic Programming}
+    ,editors={Clark, K.L. and Tarnlund, S-A.}
+    ,pages={315-323}
+    ,year=1982
+    ,publisher={Academic Press}
+    }
+
+@inproceedings{hans82
+    ,key={hansson}
+    ,author={Hansson, A. and Haridi, S. and Tarnlund, S-A.}
+    ,title={Properties of a logic programming language}
+    ,booktitle={Logic Programming}
+    ,editors={Clark, K.L. and Tarnlund, S-A.}
+    ,pages={267-280}
+    ,year=1982
+    ,publisher={Academic Press}
+    }
+
+@inproceedings{gogu84
+    ,key={goguen}
+    ,author={Goguen, J.A. and Meseguer, J.}
+    ,title={Equality, types, modules and generics for logic programming}
+    ,booktitle={Proceedings 2nd International Logic Programming Conf.}
+    ,year=1984
+    ,pages={115-125}
+    }
+
+@inproceedings{fay79
+    ,key={fay}
+    ,author={Fay, M.}
+    ,title={First-order unification in an equational theory}
+    ,booktitle={Fourth Workshop on Automated Deduction}
+    ,year=1979
+    ,pages={161-167}
+    }
+
+@inproceedings{barb85
+    ,key={barbutti}
+    ,author={Barbutti, R. and Bellia, M. and Levi, G. and Martelli, M.}
+    ,title={LEAF: A language which integrates logic, equations, and functions}
+    ,booktitle={Functional and Logic Programming}
+    ,editors={Degroot, D. and Lindstrom, G.}
+    ,pages={}
+    ,year=1985
+    ,publisher={Prentice-Hall}
+    }
+
+@inproceedings{bell82
+    ,key={bellia}
+    ,author={Bellia, M. and Degano, P. and Levi, G.}
+    ,title={Call by name semantics of a clause language with functions}
+    ,booktitle={Logic Programming}
+    ,editors={Clark, K.L. and Tarlund, S-A.}
+    ,pages={189-198}
+    ,year=1982
+    ,publisher={Academic Press}
+    }
+
+@inproceedings{redd85a
+    ,key={reddya}
+    ,author={Reddy, U.S.}
+    ,title={Narrowing as the operational semantics of functional languages}
+    ,booktitle={Submitted to International Symposium on Logic Programming}
+    ,organization={IEEE}
+    ,year=1985
+    }
+
+@inproceedings{redd85b
+    ,key={reddyb}
+    ,author={Reddy, U.S.}
+    ,title={On the relationship between logic and functional languages}
+    ,booktitle={Functional and Logic Programming}
+    ,editors={Degroot, D. and Lindstrom, G.}
+    ,pages={}
+    ,year=1985
+    ,publisher={Prentice-Hall}
+    }
+
+@inproceedings{carl84
+    ,key={carlsson}
+    ,author={Carlsson, M.}
+    ,title={On implementing Prolog in functional programming}
+    ,booktitle={International Symposium on Logic Programming}
+    ,organization={IEEE}
+    ,year=1984
+    ,month=Feb
+    ,pages={154-159}
+    }
+
+@article{huet80
+    ,key={huet}
+    ,author={Huet, G.}
+    ,title={Confluent reductions: abstract properties and applications
+            to term rewriting systems}
+    ,journal={JACM}
+    ,volume=27
+    ,number=4
+    ,year=1980
+    ,pages={797-821}
+    }
+
+@techreport{ders85
+    ,key={dershowitz}
+    ,author={Dershowitz, N.}
+    ,title={Termination of rewriting}
+    ,institution={University of Illinois, Department of Computer Science}
+    ,number={UIUCDCS-R-85-1220, UILU-ENG-85-1728}
+    ,month=Aug
+    ,year=1985
+    }
+
+@inproceedings{huet80a
+    ,key={huet}
+    ,author={Huet, G. and Oppen, D.C.}
+    ,title={Equations and rewrite rules: a survey}
+    ,booktitle={Formal Languages: Perspectives and Open Problems}
+    ,editors={Book, R.}
+    ,pages={349-405}
+    ,year=1980
+    ,publisher={Academic Press}
+    }
+
+@unpublished{aitk85
+    ,key={Ait-Kali}
+    ,author={Ait-Kali, H.}
+    ,title={R-unification}
+    ,note={(Unpublished summary)}
+    ,year=1985
+    }
+
+@techreport{rety85
+    ,key={rety}
+    ,author={Rety, P. and Kirchner, C. and Kirchner, H. and Lescanne, P.}
+    ,title={NARROWER: a new algorithm for unification and its application
+            to logic programming}
+    ,institution={Center de Recherche en Informatique de Nancy}
+    ,year=1985
+    }
+
+@techreport{pull85
+    ,key={pull}
+    ,author={Pull, H.}
+    ,title={Unification in Hope -- some theory and practice}
+    ,institution={Department of Computing,
+                  Imperial College of Science and Technology}
+    ,month=Jul
+    ,year=1985
+    }
+
+@techreport{smol85
+    ,key={smolka}
+    ,author={Smolka, G. and Panangaden, P.}
+    ,title={Fresh: a higher-order language with unification and
+            multiple results}
+    ,institution={Department of Computer Science, Cornell University}
+    ,number={85-685}
+    ,month=May
+    ,year=1985
+    }
+
+@inproceedings{sriv85
+    ,key={srivastava}
+    ,author={Srivastava, A. and Oxley, D. and Srivastava, A.}
+    ,title={An(other) integration of logic and functional programming}
+    ,booktitle={International Symposium on Logic Programming (CHECK THIS)}
+    ,organization={IEEE}
+    ,year=1985
+    ,month=Feb
+    ,pages={254-260}
+    }
+
+@techreport{huda85h
+    ,key={hudak}
+    ,author={Hudak, P. and Guzm\'an, J.}
+    ,title={A proof-stream semantics for lazy narrowing}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-446}
+    ,month=Dec
+    ,year=1985
+    }
+
+@inproceedings{jone86
+    ,key={jones}
+    ,author={Jones, Neil D. and Mycroft, A.}
+    ,title={Data flow analysis of applicative programs using
+            minimal function graphs}
+    ,booktitle={Proceedings 13th Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1986
+    ,month=Jan
+    ,pages={296-306}
+    }
+
+@book{gabr85a
+    ,key={gabriel}
+    ,author={Gabriel, R.P.}
+    ,title={Performance and Evaluation of Lisp Systems}
+    ,publisher={MIT Press}
+    ,address={Cambridge, Mass.}
+    ,year=1985
+    }
+
+@article{huda86c
+    ,key={li}
+    ,author={Li, K. and Hudak, P.}
+    ,title={A new list compaction method}
+    ,journal={Software -- Practice and Experience}
+    ,volume=16
+    ,number=2
+    ,month=Feb
+    ,year=1986
+    ,pages={145-163}
+    }
+
+@inproceedings{augu84
+    ,key={augustsson}
+    ,author={Augustsson, L.}
+    ,title={A compiler for {L}azy {ML}}
+    ,booktitle={Proceedings 1984 ACM Conf. on LISP and Functional Programming}
+    ,month=Aug
+    ,year=1984
+    ,pages={218-227}
+    }
+
+@techreport{huda86h
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Exploring para-functional programming}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-467}
+    ,month=Apr
+    ,year=1986
+    ,note={(Obsolete)}
+    }
+
+@techreport{srid85
+    ,key={sridharan}
+    ,author={Sridharan, N.S.}
+    ,title={Semi-Applicative Programming: An Example}
+    ,institution={BBN Laboratories}
+    ,month=Nov
+    ,year=1985
+    }
+
+@techreport{huda86i
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Collecting Interpretations of Expressions}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-497}
+    ,year=1986
+    }
+
+@article{hoar62
+    ,key={hoare}
+    ,author={Hoare, C.A.R.}
+    ,title={Quicksort}
+    ,journal={Computing J.}
+    ,volume=5
+    ,number=4
+    ,month=Apr
+    ,year=1962
+    ,pages={10-15}
+    }
+
+@inproceedings{kran86
+    ,key={kranz}
+    ,author={Kranz, D. and Kelsey, R. and Rees, J. and Hudak, P. 
+             and Philbin, J. and Adams, N.}
+    ,title={ORBIT: an optimizing compiler for {Scheme}}
+    ,booktitle={SIGPLAN '86 Symposium on Compiler Construction}
+    ,organization={ACM}
+    ,month=Jun
+    ,year=1986
+    ,pages={219-233}
+    ,note={Published as SIGPLAN Notices Vol. 21, No. 7, July 1986}
+    }
+
+@inproceedings{huda86d
+    ,key={kranz}
+    ,author={Kranz, D. and Kelsey, R. and Rees, J. and Hudak, P. 
+             and Philbin, J. and Adams, N.}
+    ,title={ORBIT: an optimizing compiler for {Scheme}}
+    ,booktitle={SIGPLAN '86 Symposium on Compiler Construction}
+    ,organization={ACM}
+    ,month=Jun
+    ,year=1986
+    ,pages={219-233}
+    ,note={Published as SIGPLAN Notices Vol. 21, No. 7, July 1986}
+    }
+
+@article{huda86j
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Para-functional programming}
+    ,journal={Computer}
+    ,volume=19
+    ,number=8
+    ,month=Aug
+    ,year=1986
+    ,pages={60-71}
+    }
+
+@article{niel82
+    ,key={nielson}
+    ,author={Nielson, Flemming}
+    ,title={A denotational framework for data flow analysis}
+    ,journal={Acta Informatica}
+    ,volume=18
+    ,year=1982
+    ,pages={265-287}
+    }
+
+@article{niel85
+    ,key={nielson}
+    ,author={Nielson, Flemming}
+    ,title={Program transformations in a denotational setting}
+    ,journal={ACM Transactions on Programming Languages and Systems}
+    ,volume=7
+    ,number=3
+    ,month=Jul
+    ,year=1985
+    ,pages={359-379}
+    }
+
+@phdthesis{niel84
+    ,key={nielson}
+    ,author={Nielson, Flemming}
+    ,title={Abstract Interpretation Using Domain Theory}
+    ,school={University of Edinburgh}
+    ,month=Oct
+    ,year=1984
+    }
+
+@inproceedings{cous81
+    ,key={cousot}
+    ,author={Cousot, P.}
+    ,title={Semantic foundations of program analysis}
+    ,booktitle={Program Flow Analysis: Theory and Applications}
+    ,editors={Muchnick, S.S. and Jones, Neil D.}
+    ,pages={303-342}
+    ,year=1981
+    ,publisher={Prentice-Hall}
+    }
+
+@inproceedings{donz81
+    ,key={Donzeau-Gouge}
+    ,author={Donzeau-Gouge, V.}
+    ,title={Denotational definition of properties of program computations}
+    ,booktitle={Program Flow Analysis: Theory and Applications}
+    ,editors={Muchnick, S.S. and Jones, Neil D.}
+    ,pages={343-379}
+    ,year=1981
+    ,publisher={Prentice-Hall}
+    }
+
+@inproceedings{burn86
+    ,key={Burn}
+    ,author={Burn, G.L. and Hankin, C.L. and Abramsky, S.}
+    ,title={The theory of strictness analysis for higher order functions}
+    ,booktitle={LNCS 217: Programs as Data Objects}
+    ,editors={Ganzinger, H. and Jones, Neil D.}
+    ,pages={42-62}
+    ,year=1985
+    ,publisher={Springer-Verlag}
+    }
+
+@inproceedings{mycr86
+    ,key={mycroft}
+    ,author={Mycroft, A and Jones, Neil D.}
+    ,title={A Relational Framework for Abstract Interpretation}
+    ,booktitle={LNCS 217: Programs as Data Objects}
+    ,editors={Ganzinger, H. and Jones, Neil D.}
+    ,pages={156-171}
+    ,year=1985
+    ,publisher={Springer-Verlag}
+    }
+
+@inproceedings{hugh86
+    ,key={hughes}
+    ,author={Hughes, R.J.M.}
+    ,title={Strictness detection in non-flat domains}
+    ,booktitle={LNCS 217: Programs as Data Objects}
+    ,editors={Ganzinger, H. and Jones, Neil D.}
+    ,pages={42-62}
+    ,year=1986
+    ,publisher={Springer-Verlag}
+    }
+
+@inproceedings{huda86e
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={A semantic model of reference counting and its abstraction
+            (detailed summary)}
+    ,booktitle={Proceedings 1986 ACM Conf. on
+                LISP and Functional Programming}
+    ,organization={ACM}
+    ,month=Aug
+    ,year=1986
+    ,pages={351-363}
+    }
+
+@inproceedings{blos86a
+    ,key={bloss}
+    ,author={Bloss, A. and Hudak, P.}
+    ,title={Variations on Strictness Analysis}
+    ,booktitle={Proc. 1986 ACM Conf. 
+                on LISP and Functional Programming}
+    ,organization={ACM}
+    ,month=Aug
+    ,year=1986
+    ,pages={132-142}
+    }
+                   
+@book{abra87
+    ,key={abramsky}
+    ,author={Abramsky, S. and Hankin, C.}
+    ,title={Abstract Interpretation of Declarative Languages}
+    ,publisher={Ellis Horwood}
+    ,year=1987
+    }
+
+@inproceedings{jone81
+    ,key={jones}
+    ,author={Jones, Neil D. and Muchnick, S.S.}
+    ,title={Complexity of flow analysis, inductive assertion synthesis,
+            and a language due to {D}ijkstra}
+    ,booktitle={Program Flow Analysis: Theory and Applications}
+    ,editors={Muchnick, S.S. and Jones, Neil D.}
+    ,pages={380-393}
+    ,year=1981
+    ,publisher={Prentice-Hall}
+    }
+
+@techreport{huda86l
+    ,key={goldberg}
+    ,author={Goldberg, B. and Hudak, P.}
+    ,title={Detecting Sharing of Partial Applications in Functional Languages}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-526}
+    ,month=Mar
+    ,year=1987
+    }
+
+@InProceedings{farrow86
+    ,key={Farrow}
+    ,author={Farrow, R.}
+    ,title={Automatic Generation of Fixed-Point-Finding Evaluators
+            for Circular, but Well-Defined, Attribute Grammars}
+    ,booktitle={Proceedings SIGPLAN '86 Symposium on Compiler Construction}
+    ,organization={ACM}
+    ,year=1986
+    ,pages={85-98}
+    }
+
+@inproceedings{PJ86
+    ,key="Peyton Jones"
+    ,author="Peyton Jones, Simon L. and Clack, C."
+    ,title="Finding fixpoints in abstract interpretation"
+    ,booktitle="Abstract Interpretation of Declarative Languages"
+    ,editors="Abramsky, S. and Hankin, C."
+    ,pages="to appear"
+    ,year=1987
+    ,publisher="Ellis Horwood"}
+
+@InProceedings{thom86
+    ,Key = "Thompson"
+    ,Author = "Simon Thompson"
+    ,Title = "Laws in {M}iranda"
+    ,Pages = "1-12"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts"}
+
+@InProceedings(clem86
+    ,Key = "Clement"
+    ,Author = "Dominique Cl\'ement and {Jo\"elle} Despeyroux
+               and Thierry Despeyroux and Gilles Kahn"
+    ,Title = "A Simple Applicative Language: {M}ini-{ML}"
+    ,Pages = "13-27"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(giff86
+    ,Key = "Gifford"
+    ,Author = "David K. Gifford and John M. Lucassen"
+    ,Title = "Integrating Functional and Imperative Programming"
+    ,Pages = "28-38"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(albe86
+    ,Key = "Alberga"
+    ,Author = "Cyril N. Alberga and Chris Bosman-Clark and Martin Mikelsons
+               and Mary S. Van Deusen and Julian Padget"
+    ,Title = "Experience with an Uncommon {L}isp"
+    ,Pages = "39-53"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(padg86
+    ,Key = "Padget"
+    ,Author = "Julian Padget and others"
+    ,Title = "Desiderata for the Standardisation of {L}isp"
+    ,Pages = "54-66"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(broo86
+    ,Key = "Brooks"
+    ,Author = "Rodney A. Brooks and David B. Posner and James L. McDonald
+               and Jon L. White and Eric Benson and Richard P. Gabriel"
+    ,Title = "Design of an Optimizing, Dynamically Retargetable Compiler
+              for {C}ommon {L}isp"
+    ,Pages = "67-85"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(bart86
+    ,Key = "Bartley"
+    ,Author = "David H. Bartley and John C. Jensen"
+    ,Title = "The Implementation of {PC} {S}cheme"
+    ,Pages = "86-93"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(fair86
+    ,Key = "Fairbairn"
+    ,Author = "Jon Fairbairn and Stuart C. Wray"
+    ,Title = "Code Generation Techniques for Functional Languages"
+    ,Pages = "94-104"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(knig86
+    ,Key = "Knight"
+    ,Author = "Tom Knight"
+    ,Title = "An Architecture for Mostly Functional Languages"
+    ,Pages = "105-112"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(lema86
+    ,Key = "Lemaitre"
+    ,Author = "M. Lema\^\itre and M. Castan and M.-H. Durand
+               and G. Durrieu and B. Lecussan"
+    ,Title = "Mechanisms for Efficient Multiprocessor Combinator Reduction"
+    ,Pages = "113-121"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(rams86
+    ,Key = "Ramsdell"
+    ,Author = "John D. Ramsdell"
+    ,Title = "The {CURRY} Chip"
+    ,Pages = "122-131"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(blos86
+    ,Key = "Bloss"
+    ,Author = "Adrienne Bloss and Paul Hudak"
+    ,Title = "Variations on Strictness Analysis"
+    ,Pages = "132-142"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(dybv86
+    ,Key = "Dybvig"
+    ,Author = "R. Kent Dybvig and Daniel P. Friedman and Christopher T. Haynes"
+    ,Title = "Expansion-Passing Style:  Beyond Conventional Macros"
+    ,Pages = "143-150"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(kohl86
+    ,Key = "Kohlbecker"
+    ,Author = "Eugene Kohlbecker and Daniel P. Friedman
+               and Matthias Felleisen and Bruce Duba"
+    ,Title = "Hygienic Macro Expansion"
+    ,Pages = "151-161"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(boeh86
+    ,Key = "Boehm"
+    ,Author = "Hans-J. Boehm and Robert Cartwright and Mark Riggle
+               and Michael J. O'Donnell"
+    ,Title = "Exact Real Arithmetic:  A Case Study in Higher Order Programming"
+    ,Pages = "162-173"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(whit86
+    ,Key = "White"
+    ,Author = "Jon L. White"
+    ,Title = "Reconfigurable, Retargetable Bignums:
+              A Case Study in Efficient, Portable {L}isp System Building"
+    ,Pages = "174-191"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(steen86
+    ,Key = "Steenkiste"
+    ,Author = "Peter Steenkiste and John Hennessy"
+    ,Title = "{L}isp on a Reduced-Instruction-Set-Processor"
+    ,Pages = "192-201"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(sark86
+    ,Key = "Sarkar"
+    ,Author = "Vivek Sarkar and John Hennessy"
+    ,Title = "Partitioning Parallel Programs for Macro-Dataflow"
+    ,Pages = "202-211"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(sche86
+    ,Key = "Scheevel"
+    ,Author = "Mark Scheevel"
+    ,Title = "{NORMA}:  A Graph Reduction Processor"
+    ,Pages = "212-219"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(clac86
+    ,Key = "Clack"
+    ,Author = "Chris Clack and Simon L. {Peyton Jones}"
+    ,Title = "The Four-Stroke Reduction Engine"
+    ,Pages = "220-232"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(lee86
+    ,Key = "Lee"
+    ,Author = "Peter Lee and Uwe Pleban"
+    ,Title = "On the Use of {L}isp in Implementing Denotational Semantics"
+    ,Pages = "233-248"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(niel86
+    ,Key = "Nielson"
+    ,Author = "Hanne Riis Nielson and Flemming Nielson"
+    ,Title = "Semantics Directed Compiling for Functional Languages"
+    ,Pages = "249-257"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(bawd86
+    ,Key = "Bawden"
+    ,Author = "Alan Bawden"
+    ,Title = "Connection Graphs"
+    ,Pages = "258-265"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(maun86
+    ,Key = "Mauny"
+    ,Author = "Michel Mauny and Asc\'ander Su\'arez"
+    ,Title = "Implementing Functional Languages
+              in the Categorical Abstract Machine"
+    ,Pages = "266-278"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(stee86
+    ,Key = "Steele"
+    ,Author = "Steele, Guy L., Jr. and W. Daniel Hillis"
+    ,Title = "Connection Machine LISP:
+              Fine-Grained Parallel Symbolic Processing"
+    ,Pages = "279-297"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(wand86
+    ,Key = "Wand"
+    ,Author = "Mitchell Wand and Daniel P. Friedman"
+    ,Title = "The Mystery of the Tower Revealed:
+              A Non-Reflective Description of the Reflective Tower"
+    ,Pages = "298-307"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(mitc86
+    ,Key = "Mitchell"
+    ,Author = "John C. Mitchell"
+    ,Title = "A Type-Inference Approach to Reduction Properties
+              and Semantics of Polymorphic Expressions (summary)"
+    ,Pages = "308-319"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(jaya86
+    ,Key = "Jayaraman"
+    ,Author = "Bharat Jayaraman and Frank S. K. Silbermann"
+    ,Title = "Equations, Sets, and Reduction Semantics for
+              Functional and Logic Programming"
+    ,Pages = "320-331"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(that86
+    ,Key = "Thatte"
+    ,Author = "Satish R. Thatte"
+    ,Title = "Towards a Semantic Theory for Equational Programming Languages"
+    ,Pages = "332-342"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(lerm86
+    ,Key = "Lermen"
+    ,Author = "Claus-Werner Lermen and Dieter Maurer"
+    ,Title = "A Protocol for Distributed Reference Counting"
+    ,Pages = "343-350"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(huda86eFP
+    ,Key = "Hudak"
+    ,Author = "Paul Hudak"
+    ,Title = "A Semantic Model of Reference Counting and its Abstraction
+              (detailed summary)"
+    ,Pages = "351-363"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@InProceedings(ruda86
+    ,Key = "Rudalics"
+    ,Author = "Martin Rudalics"
+    ,Title = "Distributed Copying Garbage Collection"
+    ,Pages = "364-372"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+
+@techreport{youn86
+    ,key={Young}
+    ,author={Young, J. and Hudak, P.}
+    ,title={Finding fixpoints on function spaces}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-505}
+    ,month=Nov
+    ,year=1986
+    }
+
+@article{schm85
+    ,key={schmidt}
+    ,author={Schmidt, D.A.}
+    ,title={Detecting global variables in denotational specifications}
+    ,journal={ACM Transactions on Programming Languages and Systems}
+    ,volume=7
+    ,number=2
+    ,year=1985
+    ,pages={299-310}
+    }
+
+@article{bart77
+    ,key={barth}
+    ,author={Barth, J.M.}
+    ,title={Shifting garbage collection overhead to compile time}
+    ,journal={CACM}
+    ,volume=20
+    ,number=7
+    ,year=1977
+    ,pages={513-518}
+    }
+
+@article{schw82
+    ,key={Schwarz}
+    ,author={Schwarz, J.}
+    ,title={Using annotations to make recursion equations behave}
+    ,journal={IEEE Transactions on Software Engineering}
+    ,volume={SE-8}
+    ,number=1
+    ,year=1982
+    ,month=Jan
+    ,pages={21-33}
+    }
+
+@article{burs77
+    ,key={burstall}
+    ,author={Burstall, R.M. and Darlington, J.}
+    ,title={A transformation system for developing recursive programs}
+    ,journal={JACM}
+    ,volume=24
+    ,number=1
+    ,year=1977
+    ,pages={44-67}
+    }
+
+@phdthesis{gold88
+    ,key={goldberg}
+    ,author={Goldberg, B.}
+    ,title={Multiprocessor Execution of Functional Programs}
+    ,school={Yale University, Department of Computer Science}
+    ,year=1988
+    ,note={Available as technical report {YALEU/DCS/RR-618}}
+    }
+
+@InProceedings{hugh85
+    ,key={hughes}
+    ,author={Hughes, R.J.M.}
+    ,title={Lazy memo-functions}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,month=Sep
+    ,year=1985
+    ,publisher={Springer-Verlag LNCS 201}
+    ,pages={129-146}
+    }
+
+@InProceedings{burt85
+    ,key={burton}
+    ,author={Burton, F.W.}
+    ,title={Controlling speculative computation in a 
+            parallel functional language}
+    ,booktitle={International Conf. on Distributed Computing Systems}
+    ,pages={453-458}
+    ,month=May
+    ,year=1985
+    }
+
+@techreport{habe75
+    ,key={haberman}
+    ,author={Haberman, A.N.}
+    ,title={Path Expressions}
+    ,institution={Carnegie-Mellon University}
+    ,month=Jun
+    ,year=1975
+    }
+
+@article{shap86
+    ,key={shapiro}
+    ,author={Shapiro, E.}
+    ,title={Concurrent Prolog: a progress report}
+    ,journal={Computer}
+    ,volume=19
+    ,number=8
+    ,month=Aug
+    ,year=1986
+    ,pages={44-59}
+    }
+
+@InProceedings{delo85
+    ,key={delosme}
+    ,author={Delosme, J.-M. and Ipsen, I.C.F.}
+    ,title={An illustration of a methodology for the construction of
+            efficient systolic architectures in {VLSI}}
+    ,booktitle={Proceedings 2nd International Symposium on VLSI Technology, Systems,
+                and Applications}
+    ,pages={268-273}
+    ,year=1985
+    }
+
+@article{huda86k
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Denotational Semantics of a Para-functional Programming Language}
+    ,journal={International Journal of Parallel Programming}
+    ,volume=15
+    ,number=2
+    ,year=1986
+    ,month=Apr
+    ,pages={103-125}
+    }
+
+@InProceedings{myni83
+    ,key={mycroft}
+    ,author={Mycroft, Alan and Nielson, Flemming}
+    ,title={Strong abstract interpretation using powerdomains}
+    ,booktitle={Proceedings ICALP, Springer Verlag LNCS No. 154}
+    ,pages={536-547}
+    ,year=1983
+    }
+
+@techreport{pana84
+    ,key={panangaden}
+    ,author={Panangaden, P. and Mishra, P.}
+    ,title={A Category Theoretic Formalism for Abstract Interpretation}
+    ,institution={University of Utah}
+    ,number={UUCS-84-005}
+    ,year=1984
+    }
+
+@inproceedings{blos87a
+    ,key={bloss}
+    ,author={Bloss, A. and Hudak, P.}
+    ,title={Path Semantics}
+    ,booktitle={Proceedings of Third Workshop on the
+                Mathematical Foundations of Programming Language Semantics}
+    ,year=1987
+    ,organization={Tulane University}
+    ,publisher={Springer-Verlag LNCS Volume 298}
+    ,pages={476-489}
+    }
+
+@inproceedings{lind86
+    ,key={lindstrom}
+    ,author={Lindstrom, G.}
+    ,title={Static evaluation of functional programs}
+    ,booktitle={SIGPLAN '86 Symposium on Compiler Construction}
+    ,organization={ACM}
+    ,month=Jun
+    ,year=1986
+    ,pages={196-206}
+    ,note={Published as SIGPLAN Notices Vol. 21, No. 7, July 1986}
+    }
+
+@inproceedings{wadl84
+    ,key={wadler}
+    ,author={Wadler, P.}
+    ,title={Listlessness is better than laziness: lazy evaluation and 
+            garbage collection at compile time}
+    ,booktitle={Proceedings 1984 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Aug
+    ,pages={45-52}
+    }
+
+@InProceedings{odon85
+    ,key={O'Donnell}
+    ,author={O'Donnell, J.T.}
+    ,title={An architecture that efficiently updates associative aggregates
+            in applicative programming language}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,month=Sep
+    ,year=1985
+    ,publisher={Springer-Verlag LNCS 201}
+    ,pages={164-189}
+    }
+
+@techreport{huda85j
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Functional programming on multiprocessor architectures}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-447}
+    ,month=Dec
+    ,year=1985
+    }
+
+@article{huda88b
+    ,key={LiKai}
+    ,author={Li, K. and Hudak, P.}
+    ,title={Memory Coherence in Shared Virtual Memory Systems}
+    ,journal={ACM Transactions on Computer Systems}
+    ,volume=7
+    ,number=4
+    ,month=Nov
+    ,year=1989
+    ,pages={321-359}
+    }
+
+@InProceedings{huda86g
+    ,key={LiKai}
+    ,author={Li, K. and Hudak, P.}
+    ,title={Memory Coherence in a Shared Virtual Memory System}
+    ,booktitle={5th ACM Symposium on Principles of Distributed Computing}
+    ,month=Aug
+    ,year=1986
+    ,organization={ACM SIGACT-SIGOPS}
+    ,pages={229-239}
+    }
+
+@InProceedings{wise85
+    ,key={Wise}      
+    ,author={Wise, D.S.}     
+    ,title={Design for a multiprocessing heap with on-board
+            reference counting}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,month=Sep
+    ,year=1985
+    ,publisher={Springer-Verlag LNCS 201}
+    ,pages={289-304}
+    }
+
+@InProceedings{wadl87
+    ,key={wadler}
+    ,author={Wadler, P.}
+    ,title={A New Array Operation}
+    ,booktitle={Workshop on Graph Reduction Techniques}
+    ,month=Oct
+    ,year=1986
+    ,publisher={Springer-Verlag LNCS 279}
+    }
+
+@techreport{nikh86
+    ,key={nikhil}
+    ,author={Nikhil, R.S. and Pingali, K. and Arvind}
+    ,title={Id Nouveau}
+    ,institution={Massachusetts Institute of Technology,
+                  Laboratory for Computer Science}
+    ,type={Computation Structures Group Memo}
+    ,number={265}
+    ,month=Jul
+    ,year=1986
+    }
+
+@misc{arvi86
+    ,key={Arvind}
+    ,author={Arvind}
+    ,title={Data structures for parallel computing}
+    ,note={Talk given at Graph Reduction Workshop, co-sponsored
+                by Los Alamos National Lab and MCC, held in Santa Fe, NM}
+    ,month=Oct
+    ,year=1986
+    }
+
+@article{prat86
+    ,key={Pratt}
+    ,author={Pratt, V.}
+    ,title={Modeling Concurrency with Partial Orders}
+    ,journal={International Journal of Parallel Programming}
+    ,volume=15
+    ,number=1
+    ,month=Feb
+    ,year=1986
+    ,pages={33-72}
+    }
+
+@article{hend86
+    ,key={Henderson}    
+    ,author={Henderson, P.}
+    ,title={Functional Programming, Formal Specification, 
+            and Rapid Prototyping}
+    ,journal={IEEE Transactions on SW Engineering}
+    ,volume="SE-12"
+    ,number=2
+    ,year=1986
+    ,pages={241-250}
+    }
+
+@InProceedings{gold84
+    ,key={goldberg}
+    ,author={Goldberg, A. and Paige, R.}
+    ,title={Stream Processing}
+    ,booktitle={Proceedings 1984 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Aug
+    ,pages={53-62}
+    }
+
+@InProceedings{huda87b
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Arrays, Non-Determinism, Side-Effects, and Parallelism:
+            A Functional Perspective}
+    ,booktitle={Proc. Santa Fe Graph Reduction Workshop}
+    ,organization={Los Alamos/MCC}
+    ,year=1986
+    ,month=Oct
+    ,publisher={Springer-Verlag LNCS 279}
+    ,pages={312-327}
+    }
+
+@InProceedings{gold86
+    ,key={Goldberg}
+    ,author={Goldberg, B. and Hudak, P.}
+    ,title={Alfalfa: Distributed Graph Reduction on a Hypercube Multiprocessor}
+    ,booktitle={Proc. Santa Fe Graph Reduction Workshop}
+    ,organization={Los Alamos/MCC}
+    ,year=1986
+    ,month=Oct
+    ,publisher={Springer-Verlag LNCS 279}
+    ,pages={94-113}
+    }
+
+@misc{mich86
+    ,key={michelsen}
+    ,author={Michelsen, R. and Yantis, B. and Williams, E. and Smith, L. }
+    ,title={Reducing on the Cray X/MP}
+    ,booktitle={talk given at Graph Reduction Workshop, co-sponsored
+                by Los Alamos National Lab and MCC, held in Santa Fe, NM}
+    ,month=Oct
+    ,year=1986
+    }
+
+@InProceedings{huda87a
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Para-functional languages for parallel and distributed computing}
+    ,booktitle={Proceedings of Spring COMPCON '87}
+    ,organization={IEEE}
+    ,year=1987
+    ,month=Feb
+    ,pages={334-337}
+    }
+
+@article{huda72
+    ,key={Hudak}
+    ,author={Bourne, J.R. and Hudak, P. and Duke, J.L.}
+    ,title={Computer Automated Electro-oculography}
+    ,journal={Computers and Biomedical Research}
+    ,volume=5
+    ,year=1972                                  
+    ,month=Jun
+    ,pages={654-658}
+    }
+
+@phdthesis{gisc84
+    ,key={gischer}
+    ,author={Gischer, J.}
+    ,title={Partial Orders and the Axiomatic Theory of Shuffle}
+    ,school={Stanford University, Department of Computer Science}
+    ,year=1984
+    }
+
+@article{kell86
+    ,key={Keller}
+    ,author={Keller, R.M. and Sleep, R.}
+    ,title={Applicative Caching}
+    ,journal={ACM Transactions on Programming Languages and Systems}
+    ,volume=8
+    ,number=1
+    ,month=Jan
+    ,year=1986
+    ,pages={88-108}
+    }
+
+@techreport{guzm87a
+    ,key={guzman}
+    ,author={Guzm\'an, J. and Hudak, P.}
+    ,title={Provably Complete Operational Semantics
+            for First-Order Lazy Narrowing}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-525}
+    ,month=Mar
+    ,year=1987
+    }
+
+@techreport{huda87c
+    ,key={hudak}
+    ,author={Hudak, P. and Delosme, J-M. and Ipsen, I.}
+    ,title={ParLance: A Para-Functional Programming Environment
+            for Parallel and Distributed Computing}
+    ,institution={Yale University, Department of Computer Science}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-524}
+    ,month=Apr
+    ,year=1987
+    }
+
+@InProceedings{gold87b
+    ,key={goldberg}
+    ,author={Goldberg, B.}
+    ,title={Detecting Sharing of Partial Applications in Functional Programs}
+    ,booktitle={Proc. 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={408-425}
+    }
+
+@InProceedings{huda87d
+    ,key={hudak}
+    ,author={Hudak, P. and Anderson, S.}
+    ,title={Pomset Interpretations of Parallel Functional Programs}
+    ,booktitle={Proceedings of 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={234-256}
+    }
+
+@book{abel85
+    ,key={abelson}
+    ,author={Abelson, H. and Sussman, G.J. and Sussman, J.}
+    ,title={Structure and Interpretation of Computer Programs}
+    ,publisher={The MIT Press (Cambridge, MA) and McGraw-Hill Book Company
+                (New York, NY)}
+    ,year=1985
+    }
+
+@article{mich68
+    ,key={michie}
+    ,author={Michie, D.}
+    ,title={``{M}emo'' Functions and Machine Learning}
+    ,journal={Nature}
+    ,volume=218      
+    ,month=Apr
+    ,year=1968
+    ,pages={19-22}
+    }
+
+@book{schm86
+    ,key={schmidt}
+    ,author={Schmidt, D.A.}
+    ,title={Denotational Semantics -- A Methodology for Language
+            Development}
+    ,publisher={Allyn and Bacon}
+    ,address={Boston, Mass.}
+    ,year=1986
+    }
+
+@misc{jone87
+    ,key={jones}
+    ,author={Jones, Neil D.}
+    ,title={Private communication}
+    ,month=Jun
+    ,year=1987
+    }
+
+@inproceedings{mcca63
+    ,key={mccarthy}
+    ,author={McCarthy, J.}
+    ,title={A Basis for a Mathematical Theory of Computation}
+    ,booktitle={Computer Programming and Formal Systems}
+    ,editors={Braffort, P. and Hirschberg, D.}
+    ,pages={33-70}
+    ,year=1963
+    ,publisher={North Holland}
+    ,address={Amsterdam}
+    }
+
+@article{RRRRS
+    ,key={rees}
+    ,author={Rees, J. and Clinger (eds.), W.}
+    ,title={The Revised$^3$ Report on the Algorithmic Language {S}cheme}
+    ,journal={SIGPLAN Notices}
+    ,volume=21
+    ,number=12
+    ,year=1986
+    ,month=Dec
+    ,pages={37-79}
+    }
+
+@InProceedings{wise87
+    ,key={wise}
+    ,author={Wise, D.}
+    ,title={Matrix Algebra and Applicative Programming}
+    ,booktitle={Proceedings of 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={134-153}
+    }
+
+@book{peyt87
+    ,key={peyton jones}
+    ,author={Peyton Jones, Simon L.}
+    ,title={The Implementation of Functional Programming Languages}
+    ,publisher={Prentice-Hall International}
+    ,address={Englewood Cliffs, NJ}
+    ,year=1987
+    }
+
+@InProceedings{augu85
+    ,key={augustsson}
+    ,author={Augustsson, L.}
+    ,title={Compiling Pattern-Matching}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,month=Sep
+    ,year=1985
+    ,publisher={Springer-Verlag LNCS 201}
+    ,pages={368-381}
+    }
+
+@InProceedings{huda88a
+    ,key={hudak}
+    ,author={Hudak, P. and Young, J.}
+    ,title={A Collecting Interpretation of Expressions (Without Powerdomains)}
+    ,booktitle={Proceedings of ACM Symposium on Principles of Programming Languages}
+    ,month=Jan
+    ,year=1988
+    ,pages={107-118}
+    }
+
+@InProceedings{wadl87b
+    ,key={wadlerhughes}
+    ,author={Wadler, P. and Hughes, R.J.M.}
+    ,title={Projections for Strictness Analysis}
+    ,booktitle={Proceedings of 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={385-407}
+    }
+
+@InProceedings{mart87
+    ,key={martin}
+    ,author={Martin, C. and Hankin, C.}
+    ,title={Finding Fixed Points in Finite Lattices}
+    ,booktitle={Proceedings of 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={426-445}
+    }
+
+@InProceedings{john85b
+    ,key={johnsson}
+    ,author={Johnsson, T.}
+    ,title={Lambda Lifting: Transforming Programs to Recursive Equations}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,month=Sep
+    ,year=1985
+    ,publisher={Springer-Verlag LNCS 201}
+    ,pages={190-203}
+    }
+
+@InProceedings{chen86
+    ,key={chenmarina}
+    ,author={Chen, M.C.}
+    ,title={Transformations of Parallel Programs in Crystal}
+    ,booktitle={Information Processing '86}
+    ,editors={Kugler, H.-J.}
+    ,year=1986
+    ,publisher={Elsevier Science Publishers B.V. (North-Holland)}
+    ,organization={IFIP}
+    ,pages={455-462}
+    }
+
+@InProceedings{fair87
+    ,key={fairbairn}
+    ,author={Fairbairn, J. and Wray, S.}
+    ,title={TIM: A Simple, Lazy Abstract Machine to Execute Supercombinators}
+    ,booktitle={Proceedings of 1987 Functional Programming Languages and
+                Computer Architecture Conf.}
+    ,publisher={Springer Verlag LNCS 274}
+    ,year=1987
+    ,month=Sep
+    ,pages={34-45}
+    }
+
+@article{hals85
+    ,key={halstead}
+    ,title={Multilisp: A Language for Concurrent Symbolic Computation}
+    ,author={Halstead Jr., R.H.}
+    ,journal={ACM Transactions on Programming Languages and Systems}
+    ,volume=7
+    ,number=4
+    ,month=Oct
+    ,year=1985
+    ,pages={501-538}
+    }
+
+@misc{lisk87
+    ,key={liskov}
+    ,author={Liskov, B.}
+    ,title={Private communication}
+    ,month=Oct
+    ,year=1987
+    }
+
+@article{huda87g
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Arrays, Non-Determinism, Side-Effects, and Parallelism:
+            A (Pseudo-) Functional Perspective}
+    ,journal={Submitted to CACM}
+    ,year=1987
+    }
+
+@article{huda88c
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Exploring Para-Functional Programming:
+            {S}eparating the {\em What} from the {\em How}}
+    ,journal={IEEE Software}
+    ,month=Jan
+    ,year=1988
+    ,volume=5
+    ,number=1
+    ,pages={54-61}
+    }
+
+@inproceedings{huda86f
+    ,key="hudak"
+    ,author="Hudak, P."
+    ,title="A semantic model of reference counting and its abstraction"
+    ,booktitle="Abstract Interpretation of Declarative Languages"
+    ,editors="Abramsky, S. and Hankin, C."
+    ,pages="45-62"
+    ,year=1987
+    ,publisher="Ellis Horwood"
+    ,note="(Preliminary version appeared in Proceedings 1986 ACM Conf. on
+           LISP and Functional Programming, August 1986, pp. 351-363)"
+    }
+
+@book{miln80
+    ,key={milner}
+    ,author={Milner, R.}
+    ,title={A Calculus of Communicating Systems}
+    ,publisher={Springer-Verlag, LNCS 92}
+    ,address={Englewood Cliffs, NJ}
+    ,year=1980
+    }
+
+@book{hoar85
+    ,key={hoare}
+    ,author={Hoare, C.A.R.}
+    ,title={Communicating Sequential Processes}
+    ,publisher={Prentice-Hall International, Series in Computer Science}
+    ,address={Englewood Cliffs, NJ}
+    ,year=1985
+    }
+
+@article{huda88aj
+    ,key={hudak}
+    ,author={Hudak, P. and Young, J.}
+    ,title={Collecting Interpretations of Expressions}
+    ,journal={ACM Transactions on Programming Languages and Systems}
+    ,year=1991
+    ,volume=13
+    ,number=2
+    ,pages={269-290}
+    ,note={Preliminary version appeared in the Proc.
+           1988 ACM Symposium on Principles of Programming Languages.}
+    }
+
+@article{cook85
+   ,key={cook}
+   ,author={Cook, S.A.}
+   ,title={A Taxonomy of Problems with Fast Parallel Algorithms}
+   ,journal={Information and Control}
+   ,volume=64
+   ,number={2-22}
+   ,year=1985
+   } 
+      
+@article{ston71
+   ,key={stone}
+   ,author={Stone, H.S.}    
+   ,title={Parallel Processing with the Perfect Shuffle}
+   ,journal={IEEE Transactions on Computers}
+   ,volume={C-20}
+   ,number=2
+   ,year=1971
+   }
+
+@article{prep81
+   ,key={preparata}
+   ,author={Preparata, F.P. and Vuillemin, Jean}
+   ,title={The Cube-connected Cycles: A Versatile Network for Parallel Computation}
+   ,journal={Communications of ACM}
+   ,volume={?}
+   ,number=5
+   ,year=1981
+   }   
+
+@article{hill86
+   ,key={hill}
+   ,author={Hillis, W.D. and Steel, Jr. G.L.}
+   ,title={Data Parallel Algorithms}
+   ,journal={Communications of ACM}
+   ,number=12
+   ,volume=29
+   ,year=1986
+   }
+
+@article{berg87
+   ,key={berger}
+   ,author={Berger, M.J. and Bokhari, S.H.}
+   ,title={A Partitioning Strategy for Nonuniform Problems on
+           Multiprocessors}
+   ,journal={IEEE Transactions on Computers}
+   ,volume={C-36}
+   ,number=5
+   ,year=1987
+   }
+
+@article{smit87
+   ,key={smith}
+   ,author={Smith, D.R.}
+   ,title={Applications of a Strategy for Designing Divide-and-conquer
+           Algorithms}
+   ,journal={Science of Computer Programming}
+   ,number=8
+   ,year=1987
+   }
+
+@article{hartxx
+   ,key={Hartel}
+   ,author={Hartel, P.H.}
+   ,title={Parallel Graph Reduction for Divide-and-conquer}
+   ,journal={}
+   ,year=1987
+   }
+
+@book{ahu74
+   ,key={ahu}
+   ,author={Aho and Hopcroft and Ullman}
+   ,title={The Design and Analysis of Computer Algorithms}
+   ,publisher={Addison-wesley Publishing Company}
+   ,year=1974
+   }         
+
+@book{ullm84
+   ,key={ullman}
+   ,author={Ullman, J.D.}
+   ,title={Computational Aspect of VLSI}
+   ,publisher={Computer Science Press}
+   ,year=1984
+   }
+
+@book{mead80
+   ,key={mead}
+   ,author={Mead, C. and Conway, L.}
+   ,title={Introduction to VLSI systems}
+   ,pblisher={Addison-wesley Publishing Company}
+   ,year=1980
+   }
+
+@article{ladn80
+   ,key={ladner}
+   ,author={Ladner, R.E. and Fischer, M.J.}
+   ,title= {Parallel Prefix Computation}
+   ,journal={Journal of the ACM}
+   ,volume=27
+   ,number=4
+   ,year=1980
+   }
+   
+@article{vali82
+  ,key={valiant}
+  ,author={Valiant, L.G.}
+  ,title={A Scheme for Fast Parallel Communications}
+  ,journal={SIAM J. Computing}
+  ,volume={?}
+  ,number=2
+  ,year=1982
+  }
+
+@phdthesis{blossphd
+  ,key={bloss}
+  ,author={Bloss, A.}
+  ,title={Path Analysis: Using Order-of-Evaluation Information to
+          Optimize Lazy Functional Languages}
+  ,school={Yale University, Department of Computer Science}
+  ,year=1988
+  }
+
+@phdthesis{youngphd
+  ,key={young}
+  ,author={Young, J.}
+  ,title={The Semantic Analysis of Functional Programs: Theory and Practice}
+  ,school={Yale University, Department of Computer Science}
+  ,year=1988
+  }
+
+@article{huda88d
+    ,author={Mou, Z.G. and Hudak, P.}
+    ,title={An Algebraic Model for Divide-and-Conquer and its Parallelism}
+    ,journal={Journal of Supercomputing}
+    ,volume=2
+    ,number=3
+    ,year=1988
+    }
+ 
+@InProceedings{gold88a
+    ,key={Goldberg}
+    ,author={Goldberg, B. and Hudak, P.}
+    ,title={Implementing Functional Programs on a Hypercube 
+            Multiprocessor}
+    ,booktitle={Proceedings of Third Conf. on Hypercube Concurrent
+                Computers and Applications}
+    ,organization={ACM}
+    ,year=1988
+    ,month=Jan
+    }
+
+@book{hill85
+        ,key="Hillis"
+        ,author="Hillis, W. D."
+        ,title="The Connection Machine"
+        ,publisher="MIT Press"
+        ,address="Cambridge, Massachusetts"
+        ,year=1985
+        }
+
+@mastersthesis{kusz86
+        ,key="kuszmaul"
+        ,author="Kuszmaul, B. C."
+        ,title="Simulating Applicative Architectures on the Connection Machine"
+        ,school="M.I.T."
+        ,month=May
+        ,year=1986
+        }
+
+@InProceedings{gron87
+    ,key={grondalski}
+    ,author={Grondalski, R.}
+    ,title={A VLSI Chip Set for a Massively Parallel Architecture}
+    ,booktitle={IEEE International Solid-State Circuits Conf.}
+    ,organization={IEEE}
+    ,year=1987
+    ,pages={198-199,399-400}
+    }
+
+@InProceedings{hank86
+    ,key={hankin}
+    ,author={Hankin, C. L. and Burn, G. L. and Peyton Jones, Simon L.}
+    ,title={A Safe Approach to Parallel Combinator Reduction}
+    ,booktitle={European Symposium on Programming (LNCS 213)}
+    ,pages={99-110}
+    ,year=1986
+    ,publisher={Springer-Verlag}
+    }
+
+@Inproceedings{maur85
+    ,key={maurer}
+    ,author={Maurer, D.}
+    ,title={Strictness Computation Using Generalised $\lambda$-expressions}
+    ,booktitle={Workshop on Programs as Data Objects (LNCS)}
+    ,year=1985
+    ,publisher={Springer-Verlag}
+    }
+
+@techreport{rana88
+        ,key="Ranade"
+        ,author="Ranade, A. G. and Bhatt, S. N. and Johnsson, S. L."
+        ,title="The Fluent Abstract Machine"
+        ,institution="Yale University, Department of Computer Science"
+        ,month=Jan
+        ,number="YALEU/DCS/RR-573"
+        ,year=1988
+        }
+
+@InProceedings(lem86
+    ,Key = "Lemaitre"
+    ,Author = "M. Lema\^\i tre and M. Castan and M.-H. Durand
+               and G. Durrieu and B. Lecussan"
+    ,Title = "Mechanisms for Efficient Multiprocessor Combinator Reduction"
+    ,Pages = "113-121"
+    ,Booktitle = "Proceedings~1986 ACM Conf. on Lisp and Functional Programming"
+    ,Organization = "ACM SIGPLAN/SIGACT/SIGART"
+    ,Year = "1986"
+    ,Month = Aug
+    ,Address = "Cambridge, Massachusetts")
+    }
+
+@InProceedings(lein87
+    ,Key = "Leinwand"
+    ,Author = "S. Leinwand and J. Goguen"
+    ,Title = "Architectural Options for the Rewrite Rule Machine"
+    ,Booktitle = "Proceedings~Second International Conf. on Supercomputing"
+    ,Year = "1987"
+    ,Month = May
+    ,Address = "Santa Clara, California")
+    }
+
+@article{chee87
+    ,key={Cheese}
+    ,author={Cheese, A.}
+    ,title={Combinatory Code and a Parallel Packet Based Computational Model}
+    ,journal={SIGPLAN Notices}
+    ,volume=22
+    ,number=4
+    ,month=Apr
+    ,year=1987
+    }
+
+@unpublished{lass88
+    ,key={lasser}
+    ,author={Lasser, C.}
+    ,month=Jan
+    ,year=1988
+    ,title={Personal communication}
+    }
+
+@techreport{huda88f
+        ,key="Hudak"
+        ,author="Hudak, P. and Anderson, S."
+        ,title="{H}askell Solutions to the Language Session Problems
+                at the 1988 {S}alishan {H}igh-{S}peed {C}omputing {C}onference"
+        ,institution="Yale University, Department of Computer Science"
+        ,month=Jan
+        ,number="YALEU/DCS/RR-627"
+        ,year=1988
+        }
+
+@phdthesis{kelseyphd
+  ,key={kelsey}
+  ,author={Kelsey, R.}
+  ,title={Compilation by Program Transformation}
+  ,school={Yale University, Department of Computer Science}
+  ,year=1988
+  }
+
+@phdthesis{kranzphd
+  ,key={kranz}
+  ,author={Kranz, D.}
+  ,title={ORBIT: An Optimizing Compiler For Scheme}
+  ,school={Yale University, Department of Computer Science}
+  ,year=1988
+  ,note={Available as technical report {YALEU/DCS/RR-632}}
+  }
+
+@phdthesis{liphd
+  ,key={li}
+  ,author={Li, K.}
+  ,title={Shared Virtual Memory on Loosely Coupled Multiprocessors}
+  ,school={Yale University, Department of Computer Science}
+  ,year=1986
+  }
+
+@InProceedings{kels89
+    ,key={kelsey}
+    ,author={Kelsey, R. and Hudak, P.}
+    ,title={Realistic Compilation by Program Transformation}
+    ,booktitle={ACM Symposium on Principles of Programming Languages}
+    ,month=Jan
+    ,year=1989
+    ,pages={181-192}
+    }
+
+@techreport{haskell0
+    ,key="Hudak"
+    ,author="Hudak, P. and Wadler (editors), P."
+    ,title="Report on the Functional Programming Language {H}askell"
+    ,institution="Yale University, Department of Computer Science"
+    ,month=Nov
+    ,number="YALEU/DCS/RR666"
+    ,year=1988
+    }
+
+@InProceedings{huda88g
+    ,Key={hudak}
+    ,Author={Hudak, P. and Mohr, E.}
+    ,Title={Graphinators and the Duality of {SIMD} and {MIMD}}
+    ,Booktitle={Proceedings~1988 ACM Conf. on Lisp and Functional Programming}
+    ,Organization={ACM SIGPLAN/SIGACT/SIGART}
+    ,Year=1988
+    ,Month=Aug
+    ,Address={Salt Lake City, Utah}
+    ,Pages={224-234}
+    }
+
+@InProceedings{gold88b
+    ,Key={goldberg}
+    ,Author={Goldberg, B.}
+    ,Title={Buckwheat: Graph Reduction on a Shared Memory Multiprocessor}
+    ,Booktitle={Proceedings~1988 ACM Conf. on
+                Lisp and Functional Programming}
+    ,Organization={ACM SIGPLAN/SIGACT/SIGART}
+    ,Year=1988
+    ,Month=Aug
+    ,Address={Salt Lake City, Utah}
+    ,Pages={40-51}
+    }
+
+@inproceedings{youn87
+    ,key={young}
+    ,author={Young, J. and O'Keefe, P.}
+    ,title={Experience with a Type Evaluator}
+    ,booktitle={Proceedings 2nd Workshop on Partial Evaluation}
+    ,month={October}
+    ,year=1987
+    }
+
+@techreport{trak88
+    ,key="Trakhtenbrot"
+    ,author="Trakhtenbrot, B.A."
+    ,title="Comparing the Church and Turing Approaches: Two Prophetic Messages"
+    ,institution="Eskenasy Institute of Computer Science, Tel-Aviv University"
+    ,month=Apr
+    ,number="98/88"
+    ,year=1988
+    }
+
+@article{vuil74
+    ,key={vuillemin}
+    ,author={Vuillemin, Jean}
+    ,title= {Correct and Optimal Implementations of Recursion in a Simple
+             Programming Language}
+    ,journal={Journal of Computer and Systems Science}
+    ,volume=9
+    ,number=3
+    ,year=1974
+    }
+   
+@techreport{wadl85
+    ,key="Wadler"
+    ,author="Wadler, P. and Miller, Q."
+    ,title="An Introduction to Orwell"
+    ,institution="Programming Research Group, Oxford University"
+    ,year=1985
+    }
+
+@InProceedings{abra86
+    ,Key={abramsky}
+    ,Author={Abramsky, A.}
+    ,Title={Strictness Analysis and Polymorphic Invariance}
+    ,Booktitle={Proceedings {DIKU} Workshop on Programs as Data Objects}
+    ,Organization={Springer-Verlag {LNCS} 217}
+    ,Year=1986
+    ,Pages={1-24}
+    }
+
+@article{stee75
+        ,key="Steele"
+        ,author="Steele, G.L. Jr."
+        ,title="Multiprocessing compactifying garbage collection"
+        ,journal="CACM"
+        ,volume=18
+        ,number=9
+        ,pages="491-500"
+        ,month=Sep
+        ,year=1975
+        }
+@article{wadl76
+        ,key="Wadler"
+        ,author="Wadler, P.L."
+        ,title="Analysis of an algorithm for real time garbage collection"
+        ,journal="CACM"
+        ,volume=19
+        ,number=9
+        ,pages="495-508"
+        ,month=Sep
+        ,year=1976
+        }
+@techreport{kell80a
+        ,key="Keller"
+        ,author="Keller, R.M."
+        ,title="Semantics and applications of function graphs"
+        ,institution="Department of Computer Science, University of Utah"
+        ,month=Oct
+        ,number="UUCS-80-112"
+        ,year=1980
+        }
+@book{knut73
+        ,key="Knuth"
+        ,author="Knuth, D.E."
+        ,title="The Art of Computer Programming"
+        ,volume=1
+        ,publisher="Addison-Wesley Publishing Company"
+        ,address="Reading, Mass."
+        ,year=1973
+        ,pages="406-451"
+        }
+@article{hibi80
+        ,key="Hibino"
+        ,author="Hibino, Y."
+        ,title="A practical parallel garbage collection algorithm
+                and its implementation"
+        ,journal="Sigarch Newsletter"
+        ,volume=8
+        ,number=3
+        ,pages="113-120"
+        ,month=May
+        ,year=1980
+        }
+@article{bake78
+        ,key="Baker"
+        ,author="Baker, H.G. Jr."
+        ,title="List processing in real time on a serial computer"
+        ,journal="CACM"
+        ,volume=21
+        ,number=4
+        ,pages="280-294"
+        ,month=Apr
+        ,year=1978
+        }
+@techreport{mins63
+        ,key="Minsky"
+        ,author="Minsky, M.L."
+        ,title="A LISP garbage collection algorithm using secondary storage"
+        ,institution="Mass. Institute of Technology, Cambridge, Mass."
+        ,type="AI Memo"
+        ,number=58
+        ,month=Oct
+        ,year=1963
+        }
+@techreport{lieb80
+        ,key="Lieberman"
+        ,author="Lieberman, H. and Hewitt, C."
+        ,title="A real time garbage collector that can recover
+                temporary storage quickly"
+        ,institution="Mass. Institute of Technology, Cambridge, Mass."
+        ,type="AI Memo"
+        ,number=569
+        ,month=Apr
+        ,year=1980
+        }
+@techreport{denn74
+        ,key="Dennis"
+        ,author="Dennis, J.B."
+        ,title="On storage management for advanced programming languages"
+        ,institution="Mass. Institute of Technology"
+        ,type="Computation Structures Group Memo"
+        ,number=109
+        ,month=Oct
+        ,year=1974
+        }
+@mastersthesis{nori79
+        ,key="Nori"
+        ,author="Nori, A.K."
+        ,title="A storage reclamation scheme for applicative multiprocessor system"
+        ,school="Department of Computer Science, University of Utah"
+        ,month=Dec
+        ,year=1979
+        }
+@phdthesis{bish77
+        ,key="Bishop"
+        ,author="Bishop, P."
+        ,title="Computer Systems with a Very Large Address Space
+                and Garbage Collection"
+        ,school="Laboratory for Computer Science, Mass. Institute of Technology"
+        ,month=May
+        ,year=1977
+        }
+@article{bobr80
+        ,key="Bobrow"
+        ,author="Bobrow, D.G."
+        ,title="Managing reentrant structures using reference counts"
+        ,journal="ACM Transactions on Programming Languages and Systems"
+        ,volume=2
+        ,number=3
+        ,pages="269-273"
+        ,month=Jul
+        ,year=1980
+        }
+@article{deut76
+        ,key="Deutsch"
+        ,author="Deutsch, L.P. and Bobrow, D.G."
+        ,title="An efficient incremental automatic garbage collector"
+        ,journal="CACM"
+        ,volume=19
+        ,number=9
+        ,pages="522-526"
+        ,month=Sep
+        ,year=1976
+        }
+@article{morr78
+        ,key="Morris"
+        ,author="Morris, F.L."
+        ,title="A time- and space-efficient garbage compaction algorithm"
+        ,journal="CACM"
+        ,volume=21
+        ,number=8
+        ,pages="662-665"
+        ,month=Aug
+        ,year=1978
+        }
+@article{wise79
+        ,key="Wise"
+        ,author="Wise, D.S."
+        ,title="Morris's garbage compaction algorithm restores reference counts"
+        ,journal="ACM Transactions on Programming Languages and Systems"
+        ,volume=1
+        ,number=1
+        ,pages="115-120"
+        ,month=jul
+        ,year=1979
+        }
+@article{back78
+        ,key="Backus"
+        ,author="Backus, J."
+        ,title="Can programming be liberated from the von {N}eumann style?
+                {A} functional style and its algebra of programs"
+        ,journal="CACM"
+        ,volume=21
+        ,number=8
+        ,pages="613-641"
+        ,month=Aug
+        ,year=1978
+        }
+@book{baas78
+        ,key="Baase"
+        ,author="Baase, S."
+        ,title="Computer Algorithms: Introduction to Design and Analysis"
+        ,publisher="Addison-Wesley Publishing Company"
+        ,address="Reading, Mass."
+        ,year=1978
+        }
+@article{jaya80
+        ,key="Jayaraman"
+        ,author="Jayaraman, B. and Keller, R.M."
+        ,title="Resource control in a demand-driven data-flow model"
+        ,journal="1980 International Conf. on Parallel Processing"
+        ,pages="118-127"
+        ,month=Aug
+        ,year=1980
+        }
+@article{grie77b
+        ,key="Gries"
+        ,author="David Gries"
+        ,title="An exercise in proving parallel programs correct"
+        ,journal="CACM"
+        ,volume=20
+        ,number=12
+        ,pages="921-930"
+        ,month=Dec
+        ,year=1977
+        }
+@techreport{kung77
+        ,key="Kung"
+        ,author="Kung, H.T. and Song, W."
+        ,title="An efficient parallel garbage collection system
+                and its correctness proof"
+        ,institution=" Department of Computer Science, Carnegie-Mellon University"
+        ,month=Sep
+        ,year=1977
+        }
+@techreport{bake77
+        ,key="Baker"
+        ,author="Baker, H.G. and Hewitt, C."
+        ,title="The incremental garbage collection of processes"
+        ,institution="Mass. Institute of Technology"
+        ,type="AI Working Paper"
+        ,number=149
+        ,month=Jul
+        ,year=1977
+        }
+@article{cohe81
+        ,key="Cohen"
+        ,author="Cohen, J."
+        ,title="Garbage collection of linked data structures"
+        ,journal="Computing Surveys"
+        ,volume=13
+        ,number=3
+        ,pages="341-367"
+        ,month=Sep
+        ,year=1981
+        }
+@phdthesis{alme80
+        ,key="Almes"
+        ,author="Almes, G.T."
+        ,title="Garbage Collection in an Object-Oriented System"
+        ,school="Carnegie-Mellon University"
+        ,month=Jun
+        ,year=1980
+        }
+@article{whit80
+        ,key="White"
+        ,author="White, J.L."
+        ,title="Address/memory management for a gigantic LISP environment or,
+                GC considered harmful"
+        ,journal="Proc. 1980 LISP Conf."
+        ,pages="119-127"
+        ,month=Jul
+        ,year=1980
+        }
+@article{lind74
+        ,key="Lindstrom"
+        ,author="Lindstrom, G."
+        ,title="Copying list structures using bounded work space"
+        ,journal="CACM"
+        ,volume=17
+        ,number=4
+        ,pages="198-202"
+        ,month=April
+        ,year=1974
+        }
+@article{grit81
+        ,key="Grit"
+        ,author="Grit, D.H. and Page, R.L."
+        ,title="Deleting irrelevant tasks in an expression oriented
+                multiprocessor system"
+        ,journal="ACM Transactions on Programming Languages and Systems"
+        ,volume=3
+        ,number=1
+        ,pages="49-59"
+        ,month=jan
+        ,year=1981
+        }
+@article{clar77
+        ,key="Clark"
+        ,author="Clark, D.W."
+        ,title="An empirical study of list structure in LISP"
+        ,journal="CACM"
+        ,volume=20
+        ,number=2
+        ,pages="78-87"
+        ,month=Feb
+        ,year=1977
+        }
+@phdthesis{owic75
+        ,key="Owicki"
+        ,author="Owicki, S."
+        ,title="Axiomatic Proof Techniques For Parallel Programs"
+        ,school="Cornell University, Department of Computer Science TR 75-251"
+        ,month=Jul
+        ,year=1975
+        }
+@techreport{owic80
+        ,key="Owicki"
+        ,author="Owicki, S. and Lamport, Leslie"
+        ,title="Proving liveness properties of concurrent programs"
+        ,institution="Stanford University/SRI International"
+        ,number="57 (S\&L 1)"
+        ,month=Oct
+        ,year=1980
+        }
+@techreport{lamp75
+        ,key="Lamport"
+        ,author="Lamport, Leslie"
+        ,title="On-the-fly garbage collection: once more with rigor"
+        ,institution=" CA-7508-1611, Massachusetts Computer Associates"
+        ,month=Aug
+        ,year=1975
+        }
+@techreport{lamp76
+        ,key="Lamport"
+        ,author="Lamport, Leslie"
+        ,title="Garbage collection with multiple processors:
+                an exercise in parallelism"
+        ,institution=" CA-7602-2511, Massachusetts Computer Associates"
+        ,month=Feb
+        ,year=1976
+        }
+@TechReport{
+        Halstead78,
+        key="Halstead",
+        author={Halstead, R.H. Jr},
+        title={Multiple-processor implementations of message-passing systems},
+        institution={MIT Laboratory for Computer Science},
+        number={MIT/LCS/TR-198},
+        month=Jan,
+        year=1978}
+
+@TechReport{
+        Halstead79,
+        Key={Halstead},
+        Author={Halstead, R.H. Jr.},
+        Institution={ MIT Laboratory for Computer Science},
+        Title={Reference tree networks: virtual machine and implementation},
+        Year={1979},
+        Number={MIT/LCS/TR-22}}
+
+@TechReport{
+        FriedmanWise78c,
+        key="Friedman",
+        author={Friedman, D.P. and Wise, D.S.},
+        title={Applicative multiprogramming},
+        number= 72,
+        institution={Computer Science Department, Indiana University},
+        month=Dec,
+        year=1978}
+
+@inproceedings{mcca67
+        ,key="McCarthy"
+        ,author="McCarthy,J."
+        ,title="A basis of the mathematical theory of computation"
+        ,booktitle="Programming Systems and Languages"
+        ,editors="Braffort, P. and Hirschberg, D."
+        ,pages="455-480"
+        ,year=1967
+        ,publisher="McGraw-Hill, New York"}
+
+@article{grie77a
+        ,key="Gries"
+        ,author="Gries, D."
+        ,title="On believing programs to be correct"
+        ,journal="CACM"
+        ,volume=20
+        ,number=1
+        ,pages="49-50"
+        ,month=Jan
+        ,year=1977
+        }
+@phdthesis{mull76
+        ,key="Muller"
+        ,author="Muller, K.G."
+        ,title="On The Feasibility Of Concurrent Garbage Collection"
+        ,school="Technical Hogeschool Delft"
+        ,month=Mar
+        ,year=1976
+        }
+@article{fran78
+        ,key="Francez"
+        ,author="Francez, N."
+        ,title="An application of a method for the analysis of cyclic programs"
+        ,journal="IEEE Transactions on Software Engineering"
+        ,volume=4
+        ,number=5
+        ,pages="371-377"
+        ,month=Sep
+        ,year=1978
+        }
+@techreport{huda80
+        ,key="Hudak"
+        ,author="Hudak, P."
+        ,title="Memory management in applicative language architectures"
+        ,institution="University of Utah"
+        ,type="Department of Computer Science PhD Research Proposal"
+        ,month=Oct
+        ,year=1980
+        }
+@techreport{jhon82
+        ,key="jhon"
+        ,author="Jhon, C.S. and Keller, R."
+        ,title="Analysis of unbounded token-flow graphs and realization of
+                unbounded token-flow graph by bounded token-flow graphs"
+        ,institution="University of Utah"
+        ,type="AMPS Technical Memorandum"
+        ,number=8
+        ,month=April
+        ,year=1982
+        }
+@inproceedings{wadg79
+        ,key="wadge"
+        ,author="Wadge, W.W."
+        ,title="An extensional treatment of dataflow deadlock"
+        ,editor="Kahn, G."
+        ,booktitle="Semantics of Concurrent Computation"
+        ,pages="285-299"
+        ,year=1979
+        ,publisher="Springer-Verlag"
+        }
+@phdthesis{hunt82
+        ,key="hunt"
+        ,author="Hunt, F."
+        ,title="Applicative updating and provisional computation in
+                functional programmming"
+        ,school="University of Utah"
+        ,month=Aug
+        ,year=1982
+        }
+@article{coll60
+        ,key="Collins"
+        ,author="Collins, G.E."
+        ,title="A method for overlapping and erasure of lists"
+        ,journal="CACM"
+        ,volume=3
+        ,number=12
+        ,pages="655-657"
+        ,month=Dec
+        ,year="1960"
+        }
+@article{coll66
+        ,key="Collins"
+        ,author="Collins, G.E."
+        ,title="PM, a system for polynomial manipulation"
+        ,journal="CACM"
+        ,volume=9
+        ,number=8
+        ,pages="578-589"
+        ,month=Aug
+        ,year=1966
+        }
+@article{mcca60
+        ,key="McCarthy"
+        ,author="McCarthy, J."
+        ,title="Recursive functions of symbolic expressions and their
+                computation by machine, {P}art {I}"
+        ,journal="CACM"
+        ,volume=3
+        ,number=4
+        ,pages="184-195"
+        ,month=Apr
+        ,year=1960
+        }
+@article{weiz63
+        ,key="Weizenbaum"
+        ,author="Weizenbaum, J."
+        ,title="Symmetric list processor"
+        ,journal="CACM"
+        ,volume=6
+        ,number=9
+        ,pages="524-544"
+        ,month=Sep
+        ,year=1963
+        }
+@techreport{huda81a
+        ,key="Hudak"
+        ,author="Hudak, P."
+        ,title="Call-graph reclamation: an alternative storage
+                reclamation scheme"
+        ,institution="Department of Computer Science, University of Utah"
+        ,type="AMPS Technical Memorandum"
+        ,number=4
+        ,month=Aug
+        ,year=1981
+        }
+@InProceedings{davis78a,
+        key={Davis},
+        author={Davis, A.L.},
+        title={The architecture and system method of {DDM}-1: a
+                recursively-structured data driven machine},
+        booktitle={Proceedings Fifth Annual Symposium on Computer Architecture},
+        year=1978}
+@InProceedings{Denn74a,
+        key={Dennis},
+        Author={Dennis, J.B. and Misunas, D.P.},
+        Title={A preliminary architecture for a basic data-flow processor},
+        BookTitle={Proc. 2nd Annual Symposium on Computer Architecture},
+        year={1974},
+        Organization={ACM, IEEE},
+        pages={126-132},
+        date={December 1974}}
+@Article{Mago79,
+        key={Mago},
+        author={Mago, G.A.},
+        volume={8},
+        number={5},
+        title={A network of microprocessors to execute reduction languages, Part I},
+        journal={International Journal of Computer and Information Sciences},
+        publisher={Plenum Publishing Corp},
+        Month=Mar,
+        year={1979 revised},
+        pages={349-385}}
+@article{rem81
+        ,key="Rem"
+        ,author="Rem, M."
+        ,title="Associons: a program notation with tuples instead of variables"
+        ,journal="ACM Transactions on Programming Languages and Systems"
+        ,volume=3
+        ,number=3
+        ,pages="251-262"
+        ,month=Jul
+        ,year=1981
+        }
+@phdthesis{huda82a
+        ,key="Hudak"
+        ,author="Hudak, P."
+        ,title="Object and Task Reclamation in Distributed Applicative
+                Processing Systems"
+        ,school="University of Utah"
+        ,month=Jul
+        ,year=1982
+        }
+@techreport{ward74
+        ,key="Ward"
+        ,author="Ward, S.A."
+        ,title="Functional domains of applicative languages"
+        ,institution="Mass. Institute of Technology"
+        ,type="Project MAC"
+        ,number="TR-136"
+        ,month=Sep
+        ,year=1974
+        }
+@TechReport{Hearn74,
+        key={Hearn},
+        author={Hearn, A.C.},
+        title={Reduce 2 symbolic mode primer},
+        type={Utah Symbolic Computation Group, Operating Note},
+        number={5.1},
+        institution={University of Utah},
+        month=October,
+        year={1974}}
+@article{frie78
+        ,key="Friedman"
+        ,author="Friedman, D.P. and Wise, D.S."
+        ,title="Aspects of applicative programming for parallel processing"
+        ,journal="IEEE Transactions Computers"
+        ,volume=27
+        ,number=4
+        ,pages="289-296"
+        ,month=April
+        ,year=1978
+        }
+@article{scho67
+        ,key="Schorr"
+        ,author="Schorr, H. and Waite, W."
+        ,title="An efficient machine-independent procedure for garbage
+                collection in various list structures"
+        ,journal="CACM"
+        ,volume=10
+        ,number=8
+        ,pages="501-506"
+        ,month=Aug
+        ,year=1967
+        }
+@article{john80
+        ,key="Johnson"
+        ,author="Johnson, D. et al."
+        ,title="Automatic partitioning of programs in multiprocessor systems"
+        ,journal="Proceedings Compcon Spring 80"
+        ,pages="175-178"
+        ,month=Feb
+        ,year=1980
+        }
+@article{wats82
+        ,key="Watson"
+        ,author="Watson, I. and Gurd, J.R."
+        ,title="A practical data flow computer"
+        ,journal="Computer"
+        ,volume=15
+        ,number=2
+        ,pages="51-57"
+        ,month=Feb
+        ,year=1982
+        }
+@InProceedings{
+        Berk81,
+        Key={Berkling},
+        Author={K. Berkling},
+        BookTitle={the Symposium on functional languages and computer
+                architecture},
+        Organization={Chalmers University of Technology and
+                Goteborg University},
+        Title={Transformations in a reduction system.},
+        Year={1981},
+        Editors={Homstrom, et al.},
+        Month=Jun,
+        Pages={64-71}}
+@InProceedings{
+        Berk75,
+        key={Berkling},
+        author={K. J. Berkling},
+        title={Reduction languages for reduction machines},
+        booktitle={Proceedings 2nd Annual Symposium on Computer Architecture},
+        organization={IEEE},
+        pages={133-140},
+        year={1975}}
+@article{rumb77
+        ,key="Rumbaugh"
+        ,author="Rumbaugh J."
+        ,title="A data flow multiprocessor."
+        ,journal="IEEE Transactions on Computers"
+        ,volume="C-26"
+        ,number=2
+        ,pages="138-146"
+        ,month=Feb
+        ,year=1977
+        }
+@techreport{gris82
+        ,key="Griss"
+        ,author="Griss, M.L. and Morrison, B."
+        ,title="The portable standard LISP users manual"
+        ,institution="University of Utah"
+        ,type="Utah Symbolic Computation Group"
+        ,number="V3"
+        ,month=May
+        ,year=1982
+        }
+@article{turn79
+    ,key="Turner"
+    ,author="Turner, D.A."
+    ,title="A new implementation technique for applicative languages"
+    ,journal="Software --- Practice and Experience"
+    ,volume=9
+    ,pages="31-49"
+    ,year=1979
+    }
+@article{turn79b
+    ,key={Turner}
+    ,author={Turner, D.A.}
+    ,title={Another algorithm for bracket abstraction}
+    ,journal={The Journal of Symbolic Logic}
+    ,volume=44
+    ,number=2
+    ,month=Jun
+    ,year=1979
+    ,pages={267-270}
+    }
+@article{abda76
+    ,key={abdali}
+    ,author={Abdali, S.K.}
+    ,title={An abstraction algorithm for combinatory logic}
+    ,journal={The Journal of Symbolic Logic}
+    ,volume=41
+    ,number=1
+    ,month=Mar
+    ,year=1976
+    ,pages={222-224}
+    }
+@phdthesis{abda74
+    ,key={abdali}
+    ,author={Abdali, S.K.}
+    ,title={A Combinatory Logic Model of Programming Languages}
+    ,school={University of Wisconsin}
+    ,year=1974
+    }
+@InProceedings{klug80
+    ,key={kluge}
+    ,author={Kluge, W. and Schlutter, H.}
+    ,booktitle={Proc. International Workshop on High-Level Language
+                Computer Architecture}
+    ,title={An architecture for direct execution of reduction languages}
+    ,year=1980
+    ,editors={Chu, et al.}
+    ,month=May
+    ,pages={174-180}
+    }
+@InProceedings{huda82b
+    ,key={Hudak}
+    ,author={Hudak, P. and Keller, R.M.}
+    ,title={Garbage collection and task deletion in distributed applicative
+            processing systems}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,editors={Park, et al.}
+    ,month=Aug
+    ,pages={168-178}
+    }
+@article{huda83b
+    ,key={Hudak}
+    ,author={Hudak, P.}
+    ,title={Decentralized marking of an evolving graph}
+    ,year=1983
+    ,journal={submitted to TOPLAS}
+    }
+@techreport{huda83a
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Distributed Graph Marking}
+    ,institution={Yale University}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-268}
+    ,month=Jan
+    ,year=1983
+    }
+@InProceedings{huda83c
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Distributed Task and Memory Management}
+    ,booktitle={Proceedings of Symposium on Principles of Distributed Computing}
+    ,organization={ACM}
+    ,year=1983
+    ,editors={Lynch, N.A., et al.}
+    ,month=Aug
+    ,pages={277-289}
+    }
+@InProceedings{hugh82
+    ,key={hughes}
+    ,author={Hughes, R.J.M.}
+    ,title={Super-combinators: a new implementation method for
+            applicative languages}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,editors={Park, et al.}
+    ,month=Aug
+    ,pages={1-10}
+    }
+@InProceedings{much82
+    ,key={muchnick}
+    ,author={Muchnick, S.S. and Jones, Neil D.}
+    ,title={A fixed-program machine for combinator expression evaluation}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,editors={Park, et al.}
+    ,month=Aug
+    ,pages={11-20}
+    }
+@InProceedings{peyt82
+    ,key={peyton}
+    ,author={Peyton Jones, Simon L.}
+    ,title={An investigation of the relative efficiencies of combinators
+            and lambda expressions}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,editors={Park, et al.}
+    ,month=Aug
+    ,pages={150-158}
+    }
+@InProceedings{ross82
+    ,key={rosser}
+    ,author={Rosser, J.B.}
+    ,title={Highlights of the history of the lambda-calculus}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,editors={Park, et al.}
+    ,month=Aug
+    ,pages={216-225}
+    }
+@InProceedings{hewi80
+    ,key={hewitt}
+    ,author={Hewitt, C.}
+    ,title={Design of the APIARY for actor systems}
+    ,booktitle={The 1980 LISP Conf.}
+    ,organization={Stanford University}
+    ,year=1980
+    ,editors={Davis, R.E. and Allen, J.R.}
+    ,month=Aug
+    ,pages={107-118}
+    }
+@InProceedings{trel80b
+    ,key={treleaven}
+    ,author={Treleaven, P.C. and Mole, L.F.}
+    ,title={A multi-processor reduction machine for user-defined
+            reduction languages}
+    ,booktitle={Proc. 7'th International Symposium on Computer Architecture}
+    ,organization={IEEE}
+    ,year=1980
+    ,month=May
+    ,pages={121-130}
+    }
+@book{curr58
+    ,key={curry}
+    ,author={Curry, H.K. and Feys, R.}
+    ,title={Combinatory Logic}
+    ,publisher={Noth-Holland Pub. Co.}
+    ,address={Amsterdam}
+    ,year=1958
+    }
+@article{scho24
+    ,key={schonfinkel}
+    ,author={Sch\"{o}nfinkel, M.}
+    ,title={Uber die bausteine der mathematischen logik}
+    ,journal={Mathematische Annalen}
+    ,volume=92
+    ,year=1924
+    ,pages={305}
+    }
+@article{lmi82
+    ,key={lmi}
+    ,author={LISP Machine, Inc.}
+    ,title={LMI introduces lambda: the next generation LISP machine}
+    ,journal={LMI Newsletter}
+    ,volume=2
+    ,number=1
+    ,month=Jul
+    ,year=1982
+    }
+@inproceedings{rees82
+    ,key={rees}
+    ,author={Rees, J.A. and Adams, N.I.}
+    ,title={T: a dialect of LISP or, Lambda: the ultimate software tool}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,editors={Park, et al.}
+    ,month=Aug
+    ,pages={114-122}
+    }
+@techreport{xero82
+    ,key={xerox}
+    ,author={Xerox}
+    ,title={The Xerox 1100 Smalltalk-80 system}
+    ,institution={Xerox Corp.}
+    ,type={Advertising Literature}
+    ,number={2M 8/82R 3221}
+    ,month=Aug
+    ,year=1982
+    }
+@techreport{kell82
+    ,key={keller}
+    ,author={Keller, R.M.}
+    ,title={FEL programmer's guide}
+    ,institution={University of Utah}
+    ,type={AMPS TR}
+    ,number=7
+    ,month=Mar
+    ,year=1982
+    }
+@techreport{turn76
+    ,key={turner}
+    ,author={Turner, D.A.}
+    ,title={SASL language manual}
+    ,institution={University of St. Andrews}
+    ,year=1976
+    }
+@article{demi82
+    ,key={deminet}
+    ,author={Deminet, J.}
+    ,title={Experience with multiprocessor algorithms}
+    ,journal={IEEE Transactions on Computers}
+    ,volume={C-41}
+    ,number=4
+    ,month=Apr
+    ,year=1982
+    ,pages={278-287}
+    }
+@article{misr82a
+    ,key={misra}
+    ,author={Misra, J. and Chandy, K.M.}
+    ,title={A distributed graph algorithm: knot detection}
+    ,journal={ACM Transactions Programming Languages Syst.}
+    ,volume=4
+    ,number=4
+    ,month=Oct
+    ,year=1982
+    ,pages={678-686}
+    }
+@article{chand82a
+    ,key={chandy}
+    ,author={Chandy, K.M. and Misra, J.}
+    ,title={Distributed computation on graphs: shortest path algorithms}
+    ,journal={CACM}
+    ,volume=25
+    ,number=11
+    ,month=Nov
+    ,year=1982
+    ,pages={833-837}
+    }
+@article{dijk80
+    ,key={dijkstra}
+    ,author={Dijkstra, E.W. and Scholten, C.S.}
+    ,title={Termination detection for diffusing computations}
+    ,journal={Information Processing Letters}
+    ,volume=11
+    ,number=1
+    ,month=Aug
+    ,year=1980
+    ,pages={1-4}
+    }
+@phdthesis{chanxx
+    ,key={chang}
+    ,author={Chang, E.}
+    ,title={}
+    ,school={University of Waterloo}
+    ,month={}
+    ,year={}
+    }
+@techreport{chanyy
+    ,key={chang}
+    ,author={Chang, E.}
+    ,title={Decentralized deadlock detection in distributed systems}
+    ,institution={University of Victoria, Victoria, B.C., Canada}
+    ,year=1978
+    }
+
+@InProceedings{kenna82
+    ,key={kennaway}
+    ,author={Kennaway, J.R. and Sleep, M.R.}
+    ,title={Expressions as Processes}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Aug
+    ,pages={21-28}
+    }
+
+@InProceedings{lisk82
+    ,key={liskov}
+    ,author={Liskov, B. and Scheifler, R.}
+    ,title={Guardians and Actions: Linguistic Support for Robust,
+            Distributed Programs}
+    ,booktitle={9th ACM Symposium on Principles of Programming Lan.}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Jan
+    ,pages={7-19}
+    }
+
+@InProceedings{broy81
+    ,key={broy}
+
+    ,author={Broy, Manfred}
+    ,title={A fixed point approach to applicative multi-programming}
+    ,booktitle={Lecture Notes}
+    ,organization={International Summer School on Theoretical Foundations
+                   of Programming Methodology}
+    ,year=1981
+    ,annote={Considers both fixed point and operational semantics for a form
+    of parallelism in a simple nondeterministic applicative programming
+    language.  The operational semantics are given by a system of term
+    rewriting rules based on a dataflow semantics.  The fixed point
+    semantics is based on multi-domains.}
+    }
+
+@article{cons79
+    ,key={constable}
+    ,author={Constable, R.L. and Donohue, J.E.}
+    ,title={A hierarchical approach to formal semantics with application
+            to the definition of PL/CS}
+    ,journal={TOPLAS}
+    ,volume=1
+    ,number=1
+    ,month=Jul
+    ,year=1979
+    ,pages={98-114}
+    }
+
+@inproceedings{kell78
+    ,key={keller}
+    ,author={Keller, R.M.}
+    ,title={Denotational models for parallel programs with indeterminate operators}
+    ,booktitle={Formal Descriptions of Programming Concepts}
+    ,editors={Neuhold, E.J.}
+    ,pages={337-336}
+    ,year=1978
+    ,publisher={North-Holland}
+    ,annote={Discusses various models for indeterminate operators in FGL.}
+    }
+
+@InProceedings{kosi78
+    ,key={kosinski}
+    ,author={Kosinski, P.R.}
+    ,title={A straightfprward denotational semantics for non-determinate
+            data flow programs}
+    ,booktitle={Fifth Annual Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1978
+    ,month=Jan
+    ,pages={214-221}
+    }
+
+@techreport{moss79
+    ,key={mosses}
+    ,author={Mosses, P.D.}
+    ,title={SIS -- Semantics implementation system: 
+            Reference manual and user guide}
+    ,institution={University of Aarhus}
+    ,type={Department of Computer Science}
+    ,number={DAIMI MD-30}
+    ,year=1979
+    ,annote={Guide to best known implementation system driven by den. sem.}
+    }
+
+@techreport{mycr81
+    ,key={mycroft}
+    ,author={Mycroft, A.}
+    ,title={Call-by-need = call-by-value + conditional}
+    ,institution={University of Edinburugh}
+    ,type={Draft, Department of Computer Science}
+    ,year=1981
+    }
+
+@InProceedings{pola81
+    ,key={polak}
+    ,author={Polak, W.}
+    ,title={Program verification based on denotational semantics}
+    ,booktitle={8th Annual Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1981
+    ,month=Jan
+    ,pages={149-158}
+    }
+
+@techreport{sche78
+    ,key={scheifler}
+    ,author={Scheifler, R.W.}
+    ,title={A denotational semantics for CLU}
+    ,institution={MIT}
+    ,type={LCS}
+    ,number={TR-201}
+    ,month=May
+    ,year=1978
+    }
+
+@inproceedings{schw79
+    ,key={schwarz}
+    ,author={Schwarz, J.S.}
+    ,title={Denotational semantics of parallelism}
+    ,booktitle={Semantics of Concurrent Computation -- LNCS 70}
+    ,editors={Kahn, G.}
+    ,pages={191-202}
+    ,year=1979
+    ,publisher={Springer-Verlag}
+    }
+
+@article{scot76
+    ,key={Scott}
+    ,author={Scott, D.S.}
+    ,title={Data Types as Lattices}
+    ,journal={SIAM Journal of Computing}
+    ,volume=5
+    ,number=3
+    ,month=Sep
+    ,year=1976
+    ,pages={522-587}
+    ,annote={Gospel from the prophet.}
+    }
+
+@techreport{scot81
+    ,key={scott}
+    ,author={Scott, D.S.}
+    ,title={Lecture Notes on a Mathematical Theory of Computation}
+    ,institution={Oxford University}
+    ,type={Programming Research Group}
+    ,number={PRG-19}
+    ,month=May
+    ,year=1981
+    ,annote={From 1980 lectures.  A treatment of the foundations for
+    denotational semantics, based on neighborhood systems.}
+    }
+
+@techreport{scot70
+    ,key={scott}
+    ,author={Scott, D.S.}
+    ,title={Outline of a Mathematical Theory of Computation}
+    ,institution={Oxford University}
+    ,type={Programming Research Group}
+    ,number={PRG-2}
+    ,month=Nov
+    ,year=1970
+    ,annote={Early domain theory.  I have one other article by Scott written
+    when he was at Princeton, called "Lattice Theory, Data Types and
+    Semantics".  I don't know where I got it from.}
+    }
+
+@techreport{seth81
+    ,key={sethi}
+    ,author={Sethi, R.}
+    ,title={Control flow aspects of semantics directed compiling}
+    ,institution={Bell Labs}
+    ,type={CS Technical Report}
+    ,number=98
+    ,month=Sep
+    ,year=1981
+    }
+
+@article{wads76
+    ,key={wadsworth}
+    ,author={Wadsworth, C.P.}
+    ,title={The relation between computational and denotational
+    properties for Scott's models of the lambda-calculus}
+    ,journal={SIAM Journal of Computing}
+    ,volume=5
+    ,number=3
+    ,month=Sep
+    ,year=1976
+    ,pages={488-521}
+    }
+
+@article{ashc76
+    ,key={ashcroft}
+    ,author={Ashcroft, E.A. and Wadge, W.W.}
+    ,title={Lucid -- A formal system for writing and proving programs}
+    ,journal={SIAM Journal of Computing}
+    ,volume=5
+    ,number=3
+    ,month=Sep
+    ,year=1976
+    ,pages={336-354}
+    }
+
+@article{plot76
+    ,key={plotkin}
+    ,author={Gordon D. Plotkin}
+    ,title={A powerdomain construction}
+    ,journal={SIAM Journal of Computing}
+    ,volume=5
+    ,number=3
+    ,month=Sep
+    ,year=1976
+    ,pages={452-487}
+    ,annote={Hard to read.}
+    }
+
+@article{mann76
+    ,key={manna}
+    ,author={Manna, Z. and Shamir, A.}
+    ,title={The theoretical aspects of the optimal fixpoint}
+    ,journal={SIAM Journal of Computing}
+    ,volume=5
+    ,number=3
+    ,month=Sep
+    ,year=1976
+    ,pages={414-426}
+    }
+
+@article{down78
+    ,key={downey}
+    ,author={Downey, P.J. and Sethi, R.}
+    ,title={Correct computation rules for recursive languages}
+    ,journal={SIAM Journal of Computing}
+    ,volume=5
+    ,number=3
+    ,month=Sep
+    ,year=1976
+    ,pages={378-401}
+    }
+
+@article{milner79
+    ,key={milner}
+    ,author={Milner, R.}
+    ,title={Flowgraphs and flow algebras}
+    ,journal={JACM}
+    ,volume=26
+    ,number=4
+    ,month=oct
+    ,year=1979
+    ,pages={794-818}
+    ,annote={Companion paper to "Concurrent processes and their syntax".
+    Uses category theory and free algebras to give semantics to process nets.}
+    }
+
+@article{milne79
+    ,key={milne}
+    ,author={Milne, G. and Milner, R.}
+    ,title={Concurrent processes and their syntax}
+    ,journal={JACM}
+    ,volume=26
+    ,number=2
+    ,month=Apr
+    ,year=1979
+    ,pages={302-321}
+    }
+
+@techreport{mane79
+    ,key={manes}
+    ,author={Manes, E.G.}
+    ,title={Partially-additive semantics: a progress report}
+    ,institution={University of Mass.}
+    ,type={COINS Technical Report}
+    ,number={79-8}
+    ,month=May
+    ,year=1979
+    }
+
+@techreport{stee81
+    ,key={steenstrup}
+    ,author={Steenstrup, M. and Arbib, M.A.}
+    ,title={Port automata and the algebra of concurrent processes}
+    ,institution={University of Mass.}
+    ,type={COINS Technical Report}
+    ,number={81-25}
+    ,month=oct
+    ,year=1981
+    }
+@inproceedings{smyt76
+    ,key={smyth}
+    ,author={Smyth, Michael B.}
+    ,title={Powerdomains}
+    ,booktitle={the Mathematical Foundations of
+                Computer Science Symposium}
+    ,pages={537-543},
+  series =       LNCS,
+  volume =       45
+    ,year=1976
+    ,publisher={Springer-Verlag}
+    ,annote={Good discussion of powerdomains -- more readable than Plotkin.}
+    }
+
+
+@Article{SmythMB:pow,
+  author =       "Michael B. Smyth",
+  title =        "Powerdomains",
+  journal =      "Journal of Computer and Systems Sciences",
+  year =         "1978",
+  pages =        "23--36",
+  month =        feb,
+  volume =       "16",
+  number =       "1",
+}
+
+@inproceedings{pnue79
+    ,key={pnueli}
+    ,author={Pnueli, A.}
+    ,title={The temporal semantics of concurrent programs}
+    ,booktitle={Semantics of Concurrent Computation -- LNCS 70}
+    ,editors={Kahn, G.}
+    ,pages={1-20}
+    ,year=1979
+    ,publisher={Springer-Verlag}
+    }
+@inproceedings{frie79
+    ,key={friedman}
+    ,author={Friedman, D.P. and Wise, D.S.}
+    ,title={An approach to fair applicative multiprogramming}
+    ,booktitle={Semantics of Concurrent Computation -- LNCS 70}
+    ,editors={Kahn, G.}
+    ,pages={203-225}
+    ,year=1979
+    ,publisher={Springer-Verlag}
+    }
+@InProceedings{back82
+    ,key={back}
+    ,author={Back, R.J.R. and Mannila, H.}
+    ,title={A refinement of Kahn's semantics to handle non-determinism
+    and communication}
+    ,booktitle={Proceedings of Symposium on Principles of Distributed Computing}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Aug
+    ,pages={111-120}
+    }
+
+@InProceedings{milner82
+    ,key={milner}
+    ,author={Milner, R.}
+    ,title={Four Combinators for Concurrency}
+    ,booktitle={Proceedings of Symposium on Principles of Distributed Computing}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Aug
+    ,pages={104-110}
+    }
+
+@InProceedings{clin82
+    ,key={clinger}
+    ,author={Clinger, W.}
+    ,title={Nondeterministic call by need is neither lazy nor by name}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Aug
+    ,pages={226-234}
+    }
+
+@InProceedings{macq82
+    ,key={macqueen}
+    ,author={MacQueen, D.B. and Sethi, R.}
+    ,title={A semantic model of types for applicative languages}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Aug
+    ,pages={243-252}
+    }
+
+@InProceedings{cart82
+    ,key={cartwright}
+    ,author={Cartwright, R. and Donahue, J.}
+    ,title={The semantics of lazy (and industrious) evaluation}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Aug
+    ,pages={253-264}
+    }
+
+@techreport{backus72
+    ,key={backus}
+    ,author={Backus, J.}
+    ,title={Reduction languages and variable-free programming}
+    ,institution={IBM Research}
+    ,number={RJ 1010}
+    ,month=Apr
+    ,year=1972
+    }
+
+@InProceedings{backus82
+    ,key={backus}
+    ,author={Backus, J.}
+    ,title={Function level programs as mathematical objects}
+    ,booktitle={Proceedings 1982 ACM Conf. on LISP and 
+                Functional Programming}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Aug
+    ,pages={1-10}
+    }
+
+@InProceedings{wand82
+    ,key={wand}
+    ,author={Wand, M.}
+    ,title={Semantics-directed machine architecture}
+    ,booktitle={9th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Jan
+    ,pages={234-241}
+    }
+@InProceedings{wand83
+    ,key={wand}
+    ,author={Wand, M.}
+    ,title={Loops in combinator-based compilers}
+    ,booktitle={10th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1983
+    ,month=Jan
+    ,pages={190-196}
+    }
+
+@InProceedings{hens82
+    ,key={henson}
+    ,author={Henson, M.C. and Turner, R.}
+    ,title={Completion semantics and interpreter generation}
+    ,booktitle={9th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Jan
+    ,pages={242-254}
+    }
+
+@phdthesis{clin81
+    ,key={clinger}
+    ,author={Clinger, W.D.}
+    ,title={Foundations of Actor Semantics}
+    ,school={MIT}
+    ,month=May
+    ,year=1981
+    }
+
+@phdthesis{smit82
+    ,key={smith}
+    ,author={Smith, B.C.}
+    ,title={Reflection and Semantics in a Procedural Language}
+    ,school={MIT}
+    ,month=Jan
+    ,year=1982
+    }
+
+@inproceedings{mann81
+    ,key={manna}
+    ,author={Manna, Z. and Wolper, P.}
+    ,title={Synthesis of communicating processes from temporal logic
+    specifications}
+    ,booktitle={Workshop on Logics of Programs -- LNCS}
+    ,pages={1-28?}
+    ,year=1981
+    ,publisher={Springer-Verlag}
+    }
+
+@techreport{puru82
+    ,key={purushothaman}
+    ,author={Purushothaman, S. and Subrahmanyam, P.A.}
+    ,title={Modelling of call-by-need and stream primitives using CCS}
+    ,institution={University of Utah}
+    ,type={unpublished manuscript}
+    ,month=Jun
+    ,year=1982
+    }
+
+@article{raou80
+    ,key={raoult}
+    ,author={Raoult, Jean-Claude and Vuillemin, Jean}
+    ,title={Operational and semantic equivalence between recursive programs}
+    ,journal={JACM}
+    ,volume=27
+    ,number=4
+    ,month=Oct
+    ,year=1980
+    ,pages={772-796}
+    }
+
+@article{arbi82
+    ,key={arbib}
+    ,author={Arbib, M.A. and Manes, E.G.}
+    ,title={The pattern-of-calls expansion is the canonical fixpoint
+    for recursive definitions}
+    ,journal={JACM}
+    ,volume=29
+    ,number=2
+    ,month=Apr
+    ,year=1982
+    ,pages={577-602}
+    }
+
+@article{meye82
+    ,key={meyer}
+    ,author={Meyer, A.R. and Halpern, J.Y.}
+    ,title={Axiomatic definitions of programming languages: a theoretical
+            assessment}
+    ,journal={JACM}
+    ,volume=29
+    ,number=2
+    ,month=Apr
+    ,year=1982
+    ,pages={555-576}
+    }
+
+@article{ashc82
+    ,key={ashcroft}
+    ,author={Ashcroft, E.A. and Wadge, W.W.}
+    ,title={Rx for semantics}
+    ,journal={TOPLAS}
+    ,volume=4
+    ,number=2
+    ,month=Apr
+    ,year=1982
+    ,pages={283-294}
+    }
+
+@article{hoar69
+    ,key={hoare}
+    ,author={Hoare, C.A.R.}
+    ,title={An axiomatic basis for computer programming}
+    ,journal={CACM}
+    ,volume=12
+    ,month=Dec
+    ,year=1969
+    ,pages={576-580}
+    ,annote={Established the standard for the axiomatic verification method}
+    }
+
+@article{smyt82
+    ,key={smyth}
+    ,author={Smyth, M.B. and Plotkin, G.D.}
+    ,title={The category-theoretic solution of recursive domain equations}
+    ,journal={SIAM Journal of Computing}
+    ,volume=11
+    ,number=4
+    ,month=Nov
+    ,year=1982
+    ,pages={761-783}
+    ,annote={Anyone who can adequately explain to me the contents of this
+    paper gets an automatic honors...}
+    }
+
+@book{stoy77
+    ,key={stoy}
+    ,author={Stoy, J.E.}
+    ,title={Denotational Semantics: The Scott-Strachey Approach to Programming
+    Language Theory}
+    ,publisher={The MIT Press}
+    ,address={Cambridge, Mass.}
+    ,year=1977
+    }
+
+@book{gord79
+    ,key={gordon}
+    ,author={Gordon, J.C.}
+    ,title={The Denotational Description of Programming Languages}
+    ,publisher={Springer-Verlag}
+    ,address={New York}
+    ,year=1979
+    }
+
+@techreport{davi78
+    ,key={davis}
+    ,author={Davis, A.L.}
+    ,title={Data driven nets: a maximally concurrent, procedural, parallel
+            pocess representation for distributed control systems}
+    ,institution={University of Utah}
+    ,number={UUCS-78-108}
+    ,month=Jul
+    ,year=1978
+    }
+
+@techreport{davi77
+    ,key={davis}
+    ,author={Davis, A.L.}
+    ,title={The architecture of DDM1: a recursively structured data driven
+            machine}
+    ,institution={University of Utah}
+    ,number={UUCS-77-113}
+    ,month=Oct
+    ,year=1977
+    }
+
+@techreport{acke79
+    ,key={ackerman}
+    ,author={Ackerman, W.B. and Dennis, J.B}
+    ,title={VAL -- a value-oriented algorithmic language preliminary
+    reference manual}
+    ,institution={MIT}
+    ,type={Laboratory for Computer Science}
+    ,number={MIT/LCS/TR-218}
+    ,month=Jun
+    ,year=1979
+    }
+
+@techreport{arvi80
+    ,key={arvind}
+    ,author={Arvind}
+    ,title={I-structures: an efficient data type for functional languages}
+    ,institution={MIT}
+    ,type={Technical Memo}
+    ,number={MIT/LCS/TM-210}
+    ,month=Sep
+    ,year=1980
+    }
+
+@article{mcgr82
+    ,key={mcgraw}
+    ,author={Mcgraw, J.R.}
+    ,title={The {VAL} language: description and analysis}
+    ,journal={TOPLAS}
+    ,volume=4
+    ,number=1
+    ,month=Jan
+    ,year=1982
+    ,pages={44-82}
+    }
+
+@techreport{lind82
+    ,key={lindstrom}
+    ,author={Lindstrom, G. and Hunt, F.E.}
+    ,title={Consistency and concurrency in functional databases}
+    ,institution={University of Utah}
+    ,type={Draft}
+    ,month=Feb
+    ,year=1982
+    }
+
+@techreport{lind81
+    ,key={lindstrom}
+    ,author={Lindstrom, G. and Wagner, R.}
+    ,title={Incremental recomputation on data-flow graphs}
+    ,institution={University of Utah}
+    ,type={Draft}
+    ,month=Apr
+    ,year=1981
+    }
+
+@InProceedings{bic81
+    ,key={bic}
+    ,author={Bic, L. and Herendeen, M.}
+    ,title={An architecture for a relational dataflow database}
+    ,booktitle={some acm proceedings...}
+    ,organization={ACM}
+    ,year=1981
+    ,month={}
+    ,pages={136-145}
+    }
+
+@InProceedings{
+        Arvi77,
+        key={Arvind},
+        author={Arvind and Gostelow, K.P.},
+        title={A computer capable of exchanging processors for time},
+        booktitle={Proceedings IFIP Congress},
+        Pages={849-853},
+        month=Jun,
+        year= 1977}
+
+@article{gost80
+    ,key={gostelow}
+    ,author={Gostelow, K.P and Thomas, R.L.}
+    ,title={Performance of a simulated dataflow computer}
+    ,journal={IEEE Transactions on Computers}
+    ,volume={C-29}
+    ,number=10
+    ,month=Oct
+    ,year=1980
+    ,pages={905-919}
+    }
+
+@techreport{arvi81
+    ,key={arvind}
+    ,author={Arvind and Pingali, K.}
+    ,title={Safe data driven evaluation}
+    ,institution={MIT}
+    ,type={Draft}
+    ,month=May
+    ,year=1981
+    ,annote={This was published somewhere...}
+    }
+
+@InProceedings{darl81
+    ,key={darlington}
+    ,author={Darlington, J. and Reeve, M.}
+    ,title={ALICE: a multi-processor reduction machine for the parallel
+            evaluation of applicative languages}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,organization={ACM}
+    ,year=1981
+    ,month=Oct
+    ,pages={65-76}
+    }
+
+@InProceedings{catt81
+    ,key={catto}
+    ,author={Catto, A.J. and Gurd, J.R}
+    ,title={Resource management in dataflow}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,organization={ACM}
+    ,year=1981
+    ,month=Oct
+    ,pages={65-76}
+    }
+
+@article{acke82
+    ,key={ackerman}
+    ,author={Ackerman, W.B.}
+    ,title={Data flow languages}
+    ,journal={Computer}
+    ,volume=15
+    ,number=2
+    ,month=Feb
+    ,year=1982
+    ,pages={15-25}
+    }
+
+@article{davi82
+    ,key={davis}
+    ,author={Davis, A.L. and Keller, R.M.}
+    ,title={Data flow program graphs}
+    ,journal={Computer}
+    ,volume=15
+    ,number=2
+    ,month=Feb
+    ,year=1982
+    ,pages={26-41}
+    }
+
+@article{arvi82
+    ,key={Arvind}
+    ,author={Arvind and Gostelow, K.P.}
+    ,title={The {U}-interpreter}
+    ,journal={Computer}
+    ,volume=15
+    ,number=2
+    ,month=Feb
+    ,year=1982
+    ,pages={42-50}
+    }
+
+@InProceedings{burk82
+    ,key={burkowski}
+    ,author={Burkowski, F.J.}
+    ,title={Instruction set design issues relating to a static dataflow computer}
+    ,booktitle={Proceedings 9th Symposium Computer Architecture}
+    ,organization={ACM -- SIGARCH}
+    ,year=1982
+    ,month=Apr
+    ,pages={101-111}
+    }
+
+@InProceedings{homm82
+    ,key={hommes}
+    ,author={Hommes, F.}
+    ,title={The heap-substitution concept -- an implementation of functional
+    operations on data structures for a reduction machine}
+    ,booktitle={Proceedings 9th Symposium Computer Architecture}
+    ,organization={ACM -- SIGARCH}
+    ,year=1982
+    ,month=Apr
+    ,pages={248-258}
+    }
+
+@InProceedings{arvi81b
+    ,key={arvind}
+    ,author={Arvind and Kathail, V.}
+    ,title={A multiple processor data flow machine that supports generalized
+    procedures}
+    ,booktitle={Proceedings 8th Annual Symposium Computer Architecture}
+    ,organization={ACM SIGARCH 9(3)}
+    ,year=1981
+    ,month=May
+    ,pages={291-302}
+    }
+
+@InProceedings{srin81
+    ,key={srini}
+    ,author={Srini, V.P.}
+    ,title={An architecture for extended abstract data flow}
+    ,booktitle={Proceedings 8th Annual Symposium Computer Architecture}
+    ,organization={ACM -- SIGARCH 9(3)}
+    ,year=1981
+    ,month=May
+    ,pages={303-326}
+    }
+
+@InProceedings{burk81
+    ,key={burkowski}
+    ,author={Burkowski, F.J.}
+    ,title={A mult-user data flow architecture}
+    ,booktitle={Proceedings 8th Annual Symposium Computer Architecture}
+    ,organization={ACM -- SIGARCH 9(3)}
+    ,year=1981
+    ,month=May
+    ,pages={327-340}
+    }
+
+@book{feig83
+    ,key={Feigenbaum}
+    ,author={Feigenbaum, E.A. and McCorduck, P.}
+    ,title={The Fifth Generation}
+    ,publisher={Addison-Wesley Publishing Company}
+    ,address={Reading, MA}
+    ,year=1983
+    }
+
+@techreport{fish82
+    ,key={fisher}
+    ,author={Fisher, J.A.}
+    ,title={Very Long Word Architectures}
+    ,institution={Yale University}
+    ,number={YALEU/DCS/RR-253}
+    ,month=Dec
+    ,year=1982
+    }
+
+@article{budn71
+    ,key={budnick}
+    ,author={Budnick, P and Kuck, D.J.}
+    ,title={The organization and use of parallel memories}
+    ,journal={IEEE Transactions on Computers}
+    ,volume={C-20}
+    ,number={}
+    ,month={}
+    ,year=1971
+    ,pages={}
+    }
+@article{linc83
+    ,key={lincoln}
+    ,author={Lincoln, N.R.}
+    ,title={Supercomputers = colossal computations + enormous expectations +
+            renowned risk}
+    ,journal={IEEE Computer}
+    ,volume=16
+    ,number=5
+    ,month=May
+    ,year=1983
+    ,pages={38-47}
+    }
+@book{hend80
+    ,key={Henderson}
+    ,author={Henderson, P.}
+    ,title={Functional Programming: Application and Implementation}
+    ,publisher={Prentice-Hall}
+    ,address={Englewood Cliffs, NJ}
+    ,year=1980
+    }
+@inproceedings{robi82
+    ,key={robinson}
+    ,author={Robinson, J.A.}
+    ,title={Fundamentals of machine-oriented deductive logic}
+    ,booktitle={Introductory Readings in Expert Systems}
+    ,editors={Michie, D.}
+    ,pages={81-92}
+    ,year=1982
+    ,publisher={Gordon and Breach}
+    }
+@inproceedings{bram82
+    ,key={bramer}
+    ,author={Bramer, M.A.}
+    ,title={A survey and critical review of expert systems research}
+    ,booktitle={Introductory Readings in Expert Systems}
+    ,editors={Michie, D.}
+    ,pages={3-30}
+    ,year= 1982
+    ,publisher={Gordon and Breach}
+    }
+@inproceedings{quin82
+    ,key={quinlan}
+    ,author={Quinlan, J.R.}
+    ,title={Fundamentals of the knowledge engineering problem}
+    ,booktitle={Introductory Readings in Expert Systems}
+    ,editors={Michie, D.}
+    ,pages={33-46}
+    ,year= 1982
+    ,publisher={Gordon and Breach}
+    }
+@inproceedings{clar82
+    ,key={clark}
+    ,author={Clark, K.L.}
+    ,title={An introduction to logic programming}
+    ,booktitle={Introductory Readings in Expert Systems}
+    ,editors={Michie, D.}
+    ,pages={93-112}
+    ,year= 1982
+    ,publisher={Gordon and Breach}
+    }
+@book{wins79
+    ,key={winston}
+    ,author={Winston, P.H.}
+    ,title={Artificial Intelligence}
+    ,publisher={Addison-Wesley Publishing Co.}
+    ,address={Don Mills, Ontario, Canada}
+    ,year= 1979
+    }
+@article{wood83
+    ,key={woods}
+    ,author={Woods, W.A.}
+    ,title={What's important about knowledge representation?}
+    ,journal={Computer}
+    ,volume=16
+    ,number=10
+    ,month= Oct
+    ,year=1983
+    ,pages={22-29}
+    }
+@article{scha80
+    ,key={schank}
+    ,author={Schank, R.C.}
+    ,title={Language and memory}
+    ,journal={Cognitive Science}
+    ,volume= 4
+    ,number= 3
+    ,month={Jul-Sep}
+    ,year= 1980
+    ,pages={243-284}
+    }
+@article{brac83
+    ,key={brachman}
+    ,author={Brachman, R.J.}
+    ,title={What is-a is and isn't: an analysis of taxonomic links
+            in semantic networks}
+    ,journal={Computer}
+    ,volume=16
+    ,number=10
+    ,month= Oct
+    ,year= 1983
+    ,pages={30-36}
+    }
+@article{isra83
+    ,key={israel}
+    ,author={Israel, D.J.}
+    ,title={The role of logic in knowledge representation}
+    ,journal={Computer}
+    ,volume=16
+    ,number=10
+    ,month= Oct
+    ,year= 1983
+    ,pages={37-41}
+    }
+@article{dahl83
+        ,key={dahl}
+        ,author={Dahl,V.}
+        ,title={Logic programming as a representation of knowledge}
+        ,journal={Computer}
+        ,volume=16
+        ,number=10
+        ,month= Oct
+        ,year=1983
+        ,pages={106-111}
+        }
+@article{robi65
+    ,key={robinson}
+    ,author={Robinson, A.}
+    ,title={A machine-oriented logic based on the resolution principle}
+    ,journal={JACM}
+    ,volume= 12
+    ,year= 1965
+    ,pages={23-41}
+    }
+@techreport{mins74
+    ,key={minsky}
+    ,author={Minsky, M.}
+    ,title={A framework for representing knowledge}
+    ,institution={MIT}
+    ,type={AI Memo}
+    ,number=306
+    ,month=Jun
+    ,year=1974
+    }
+@InProceedings{scha75
+    ,key={schank,abelson}
+    ,author={Schank, R. and Abelson, R.}
+    ,title={Scripts, plans and knowledge}
+    ,booktitle={Proceedings International Joint Conf. AI}
+    ,organization={AI}
+    ,year= 1975
+    ,pages={151-157}
+    }
+@article{nau83
+    ,key={nau}
+    ,author={Nau, D.}
+    ,title={Expert computer systems}
+    ,journal={Computer}
+    ,volume=16
+    ,number=2
+    ,month=Feb
+    ,year=1983
+    ,pages={63-68}
+    }
+@book{fahl79
+    ,key={fahlman}
+    ,author={Fahlman, S.}
+    ,title={NETL: A System for Representing and Using Real-World Knowlege}
+    ,publisher={MIT Press}
+    ,address={Cambridge, MA}
+    ,year=1979
+    }
+@InProceedings{schm81
+    ,key={schmolze,brachman}
+    ,author={Schmolze, J. and Brachman, R.}
+    ,title={Summary of the KL-one language}
+    ,booktitle={Proceedings 1981 KL-ONE Workshop,FLAIR tech-report 4}
+    ,organization={Fairchild Laboratory for AI Research}
+    ,year=1982
+    ,pages={231-257}
+    }
+@InProceedings{moor82
+    ,key={moore}
+    ,author={Moore, R.C.}
+    ,title={The role of logic in knowledge representation and
+    commonsense reasoning}
+    ,booktitle={Proceedings Nat'l Conf. Artificial Intelligence}
+    ,organization={American Association for Artificial Intelligence}
+    ,year=1982
+    ,month= Aug
+    ,pages={428-433}
+    }
+@InProceedings{rich82
+    ,key={rich}
+    ,author={Rich, C.}
+    ,title={Knowledge representation languages and predicate calculus:
+    How to have your cake and eat it too}
+    ,booktitle={Proceedings AAAI}
+    ,organization={AAAI}
+    ,year=1982
+    ,pages={192-196}
+    }
+@article{trel82b
+    ,key={treleaven,lima}
+    ,author={Treleaven, P. and Lima, I.}
+    ,title={Japan's fifth-generation computer systems}
+    ,journal={Computer}
+    ,volume=15
+    ,number=8
+    ,month=Aug
+    ,year=1982
+    ,pages={79-88}
+    }
+@book{FGCS81
+    ,key={Moto-oka}
+    ,title={Proceedings International Conf. 5th Generation Computer Systems}
+    ,publisher={Japan Information Processing Development Center}
+    ,author={Moto-oka, T., et al.}
+    ,month=Oct
+    ,year=1981
+    }
+@techreport{hill81
+    ,key={Hillis}
+    ,author={Hillis, W.D.}
+    ,title={The Connection Machine}
+    ,institution={MIT}
+    ,number={AI-Memo 646}
+    ,month=Sep
+    ,year=1981
+    }
+@techreport{shap83
+    ,key={Shapiro}
+    ,author={Shapiro, E.Y.}
+    ,title={A Subset of Concurrent Prolog and its Interpreter}
+    ,institution={Weizmann Institute of Science}
+    ,month=Jan
+    ,year=1983
+    }
+@book{barr81
+    ,key={barr}
+    ,title={The Handbook of Artificial Intelligence}
+    ,publisher={HeurisTech Press}
+    ,author={Barr, A. and Feigenbaum, E.A.}
+    ,volume=1
+    ,year=1981
+    }
+@InProceedings{fahl83
+    ,key={fahlman}
+    ,author={Fahlman, S.E. and Hinton, G.E.}
+    ,title={Massively Parallel Architectures for AI: NETL, Thistle,
+            and Boltzmann Machines}
+    ,booktitle={Proceedings AAAI}
+    ,organization={AAAI}
+    ,year=1983
+    ,pages={109-113}
+    }
+@techreport{rabbit
+    ,key={Steele}
+    ,author={Steele, G.L. Jr.}
+    ,title={RABBIT: a compiler for SCHEME}
+    ,institution={MIT}
+    ,month=May
+    ,number=474
+    ,type={AI Memo}
+    ,year=1978
+    }
+@techreport{stee78
+    ,key={Steele}
+    ,author={Steele, G.L. Jr. and Sussman, G.J.}
+    ,title={The Revised Report on Scheme}
+    ,institution={MIT}
+    ,month=Jan
+    ,number=452
+    ,type={AI Memo}
+    ,year=1978
+    }
+@book{dragon
+    ,key={Aho}
+    ,title={Principles of Compiler Design}
+    ,publisher={Addison-Wesley}
+    ,author={Aho, A.V. and Ullman, J.D.}
+    ,year=1977
+    }
+@InProceedings{stee77
+    ,key={steele}
+    ,author={Steele, G.L. Jr.}
+    ,title={Debunking the expensive procedure call myth}
+    ,booktitle={Proceedings ACM National Conf.}
+    ,organization={ACM}
+    ,year=1977
+    ,pages={153-162}
+    }
+@InProceedings{mcde80
+    ,key={mcdermott}
+    ,author={McDermott, D.}
+    ,title={An efficient environment allocation scheme in an
+            interpreter for a lexically-scoped LISP}
+    ,booktitle={The 1980 LISP Conf.}
+    ,organization={Stanford University}
+    ,year=1980
+    ,editors={Davis, R.E. and Allen, J.R.}
+    ,month=Aug
+    ,pages={154-162}
+    }
+@article{bobr73
+    ,key={bobrow}
+    ,author={Bobrow, D.G. and Wegbreit, B.}
+    ,title={A model and stack implementation of multiple environments}
+    ,journal={CACM}
+    ,volume=16
+    ,number=10
+    ,month=Oct
+    ,year=1973
+    ,pages={591-603}
+    }
+@article{hoff82a
+    ,key={hoffman}
+    ,author={Hoffman, C.M. and O'Donnell, M.J.}
+    ,title={Programming with equations}
+    ,journal={ACM Transactions Programming Languages Systems}
+    ,volume=4
+    ,number=1
+    ,month=Jan
+    ,year=1982
+    ,pages={83-112}
+    }
+@InProceedings{huda84a
+    ,key={hudak}
+    ,author={Hudak, P. and Kranz, D.}
+    ,title={A combinator-based compiler for a functional language}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={121-132}
+    }
+@InProceedings{Joua84
+    ,key={Jouannaud}
+    ,author={Jouannaud, J-P. and Kirchner, H.}
+    ,title={Completion of a set of rules modulo a set of equations}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={83-92}
+    }
+@InProceedings{shap84
+    ,key={shapiro}
+    ,author={Shapiro, E.}
+    ,title={Systems programming in concurrent prolog}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={93-105}
+    }
+@InProceedings{band84
+    ,key={bandes}
+    ,author={Bandes, R.G.}
+    ,title={Constraining-unification and the programming language Unicorn}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={106-110}
+    }
+@InProceedings{hoff84
+    ,key={hoffman}
+    ,author={Hoffman, C.M. and O'Donnell, M.J.}
+    ,title={Implementation of an interpreter for abstract equations}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={111-120}
+    }
+@InProceedings{subr84a
+    ,key={subrahmanyam}
+    ,author={Subrahmanyam, P.A. and You, J-H.}
+    ,title={Pattern-driven lazy reduction: a unifying evaluation
+            mechanism for functional and logic programs}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={228-234}
+    }
+@InProceedings{wand84
+    ,key={wand}
+    ,author={Wand, M.}
+    ,title={A types-as-sets semantics for Milner-style polymorphism}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={158-164}
+    }
+@InProceedings{mish84
+    ,key={mishra}
+    ,author={Mishra, P. and Keller, R.M.}
+    ,title={Static inference of properties of functional programs}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={235-244}
+    }
+@InProceedings{schw84
+    ,key={schwarz}
+    ,author={Schwarz, J.S. and Rubine, D.}
+    ,title={Treat -- an applicative code generator}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={133-139}
+    }
+@InProceedings{mitc84
+    ,key={mitchell}
+    ,author={Mitchell, J.C.}
+    ,title={Coercion and type inference}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={175-185}
+    }
+@InProceedings{hend76
+    ,key={henderson}
+    ,author={Henderson and Morris}
+    ,title={A lazy evaluator}
+    ,booktitle={3rd ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1976
+    ,month=Jan
+    ,pages={95-103}
+    }
+@inproceedings{frie76
+    ,key={friedman}
+    ,author={Friedman, D.P. and Wise, D.S.}
+    ,title={CONS should not evaluate its arguments}
+    ,booktitle={Automata, Languages and Programming}
+    ,editors=xx
+    ,pages={257-284}
+    ,year=1976
+    ,publisher={Edinburgh University Press}
+    }
+@article{friexx
+    ,key={friedman}
+    ,author={Friedman, D.P. and Wise, D.S.}
+    ,title={Unbounded computational structures}
+    ,journal={Software -- Practice and Experience}
+    ,volume=8
+    ,number=0
+    ,month="foobar"
+    ,year="198n"
+    ,pages={407-416}
+    }
+@article{shal82
+    ,key={shallit}
+    ,author={Shallit}
+    ,title={Unbounded arrays in APL}
+    ,journal={APL}
+    ,volume=xx
+    ,number=xx
+    ,month=xx
+    ,year=1982
+    }
+@article{knut68
+    ,key={knuth}
+    ,author={Knuth, D.}
+    ,title={Semantics of context-free languages}
+    ,journal={Math Systems Theory}
+    ,volume=2
+    ,number=2
+    ,month=Feb
+    ,year=1968
+    ,pages={127-145}
+    }
+@article{jali83
+    ,key={Jalili}
+    ,author={Jalili, F.}
+    ,title={A general linear-time evaluator for attribute grammars}
+    ,journal={SIGPLAN Notices}
+    ,volume=18
+    ,number=9
+    ,month=Sep
+    ,year=1983
+    ,pages={35-44}
+    }
+@article{raih80
+    ,key={raiha}
+    ,author={Raiha}
+    ,title={Bibliography on attribute grammars}
+    ,journal={SIGPLAN Notices}
+    ,volume=15
+    ,number=3
+    ,month=Mar
+    ,year=1980
+    }
+@techreport{hewi76
+    ,key={hewitt}
+    ,author={Hewitt, C.}
+    ,title={Viewing control structures as patterns of passing messages}
+    ,institution={MIT}
+    ,type={Working Paper}
+    ,number=92
+    ,month=Apr
+    ,year=1976
+    }
+@article{ward80
+    ,key={ward}
+    ,author={Ward, S.A. and Halstead, R.H.}
+    ,title={A syntactic theory of message passing}
+    ,journal={JACM}
+    ,volume=27
+    ,number=2
+    ,month=Apr
+    ,year=1980
+    ,pages={365-383}
+    }
+@InProceedings{gele84
+    ,key={gelernter}
+    ,author={Gelernter, D.}
+    ,title={A note on systems programming in concurrent Prolog}
+    ,booktitle={International Symposium on Logic Programming}
+    ,organization={IEEE}
+    ,year=1984
+    ,month=Feb
+    ,pages={xx}
+    }
+@article{kowa79
+    ,key={kowalski}
+    ,author={Kowalski, R.}
+    ,title={Algorithm = logic + control}
+    ,journal={CACM}
+    ,volume=22
+    ,number=7
+    ,month=Jul
+    ,year=1979
+    ,pages={424-436}
+    }
+@article{clar77b
+    ,key={clark}
+    ,author={Clark and Tarnlund}
+    ,title={A 1st-order theory of data and programs}
+    ,journal={IFIP}
+    ,volume=xx
+    ,number=xx
+    ,year=1977
+    }
+@book{cloc81
+    ,key={clocksin}
+    ,title={Programming in Prolog}
+    ,publisher={Springer-Verlag}
+    ,author={Clocksin, W.F. and Mellish, C.S.}
+    ,year=1981
+    }
+@article{paig82
+    ,key={paige}
+    ,author={Paige, R. and Koenig, S.}
+    ,title={Finite differencing of computable expressions}
+    ,journal={ACM Transactions on Programming Languages and Systems}
+    ,volume=4
+    ,number=3
+    ,year=1982
+    ,pages={402-454}
+    }
+@inproceedings{Arsac
+    ,key={arsac}
+    ,author={Arsac}
+    ,title={Transformation of recursive procedures into iterative ones}
+    ,booktitle={Tools and Notions for Program Construction}
+    ,editors=xx
+    ,pages=xx
+    ,year=xx
+    ,publisher=xx
+    }
+@article{part81
+    ,key={partsch}
+    ,author={Partsch}
+    ,title={A Comprehensive Survey on Program Transformation Schemes}
+    ,journal={TUM}
+    ,volume=I81
+    ,number=08
+    ,year=1981
+    ,pages=xx
+    }
+@techreport{huda84b
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={{ALFL} {R}eference {M}anual and {P}rogrammer's {G}uide}
+    ,institution={Yale University}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-322, Second Edition}
+    ,month=Oct
+    ,year=1984
+    }
+@book{gold83
+    ,key={goldberg}
+    ,title={Smalltalk-80:  The Language and its Implementation}
+    ,publisher={Addison-Wesley}
+    ,author={Goldberg, A. and Robson, D.}
+    ,address={Reading, MA}
+    ,year=1983
+    }
+@article{wand82b
+    ,key={wand}
+    ,author={Wand, M.}
+    ,title={Deriving target code as a representation of continuation semantics}
+    ,journal={ACM Transactions on Programming Languages and Systems}
+    ,volume=4
+    ,number=3
+    ,month=Jul
+    ,year=1982
+    ,pages={496-517}
+    }
+@article{hoff82b
+    ,key={hoffman}
+    ,author={Hoffman, C.M. and O'Donnell, M.J.}
+    ,title={Pattern matching in trees}
+    ,journal={JACM}
+    ,volume=29
+    ,number=1
+    ,month=Jan
+    ,year=1982
+    ,pages={68-95}
+    }
+@article{down80
+    ,key={downey}
+    ,author={Downey, P.J. and Sethi, R.}
+    ,title={Variations on the common subexpression problem}
+    ,journal={JACM}
+    ,volume=27
+    ,number=4
+    ,month=Oct
+    ,year=1980
+    ,pages={758-771}
+    }
+@book{burg75
+    ,key={burge}
+    ,author={Burge, W.H.}
+    ,title={Recursive Programming Techniques}
+    ,publisher={Addison-Wesley}
+    ,address={Reading, MA}
+    ,year=1975
+    }
+@phdthesis{gesc72
+    ,key={geschke}
+    ,author={Geschke, C.M.}
+    ,title={Global Program Optimizations}
+    ,school={CMU}
+    ,month=Oct
+    ,year=1972
+    }
+@InProceedings{huda84c
+    ,key={hudak}
+    ,author={Hudak, P. and Goldberg, B.}
+    ,title={Experiments in diffused combinator reduction}
+    ,booktitle={Proceedings 1984 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Aug
+    ,pages={167-176}
+    }
+@InProceedings{jone84
+    ,key={jones}
+    ,author={Jones, Neil D. and Muchnick, S.S.}
+    ,title={A flexible approach to interprocedural data flow analysis and
+            programs with recursive data structures}
+    ,booktitle={9th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Jan
+    ,pages={66-74}
+    }
+@article{seth82
+    ,key={sethi}
+    ,author={Sethi, R.}
+    ,title={Pebble games for studying storage sharing}
+    ,journal={Theoretical Computer Science}
+    ,volume=19
+    ,number=1
+    ,month=Jul
+    ,year=1982
+    ,pages={69-84}
+    }
+@inproceedings{pipp80
+    ,key={pippenger}
+    ,author={Pippenger, N.}
+    ,title={Pebbling}
+    ,booktitle={Proceedings 5th IBM Symposium on Mathematical Foundations
+                of Computer Sci.}
+    ,organization={IBM}
+    ,month=May
+    ,year=1980
+    ,pages={1-19}
+    }
+@InProceedings{raou84
+    ,key={raoult}
+    ,author={Raoult, Jean-Claude and Sethi, Ravi}
+    ,title={The global storage needs of a subcomputation}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={148-157}
+    }
+@techreport{huda84e
+    ,key={hudak}
+    ,author={Hudak, P.}
+    ,title={Distributed Applicative Processing Systems:
+            Project Goals, Motivation and Status Report}
+    ,institution={Yale University}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-317}
+    ,month=May
+    ,year=1984
+    }
+@article{kell84
+    ,key={keller}
+    ,author={Keller, R.M. and Lin, F.C.H.}
+    ,title={Simulated performance of a reduction-based multiprocessor}
+    ,journal={IEEE Computer}
+    ,volume=17
+    ,number=7
+    ,month=Jul
+    ,year=1984
+    ,pages={70-82}
+    }
+@article{kahn84
+    ,key={Kahn}
+    ,author={Kahn, K.}
+    ,title={Implementation of arrays}
+    ,journal={PROLOG Digest}
+    ,volume=2
+    ,number=4
+    ,month=Jan
+    ,year=1984
+    }
+@InProceedings{schw78
+    ,key={schwarz}
+    ,author={Schwarz, J.}
+    ,title={Verifying the safe use of destructive operations
+            in applicative programs}
+    ,booktitle={Program Transformations -- Proc. 3rd International
+                Symposium on Programming}
+    ,editor={Robinet, B.}
+    ,organization={Dunod Informatique}
+    ,year=1978
+    ,pages={395-411}
+    }
+@techreport{lamp79
+    ,key={lamport}
+    ,author={Lamport, Leslie}
+    ,title={@dq"Sometime" is sometimes @dq"not never"}
+    ,institution={SRI International}
+    ,type={Research Report}
+    ,number={CSL-86 #49}
+    ,month=Jan
+    ,year=1979
+    }
+@book{mann74
+    ,key={Manna}
+    ,editor={Manna, Z.}
+    ,title={Mathematical Theory of Computation}
+    ,publisher={McGraw-Hill Book Company}
+    ,address={New York}
+    ,year=1974
+    ,pages={322-328}
+    }
+@InProceedings{cous77
+    ,key={cousot}
+    ,author={Cousot, P. and Cousot, R.}
+    ,title={Abstract interpretation: a unified lattice model for static
+            analysis of programs by construction or approximation of fixpoints}
+    ,booktitle={4th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1977
+    ,pages={238-252}
+    }
+@InProceedings{cous79
+    ,key={cousot}
+    ,author={Cousot, P. and Cousot, R.}
+    ,title={Systematic design of program analysis frameworks}
+    ,booktitle={6th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1979
+    ,pages={269-282}
+    }
+@InProceedings{huda85a
+    ,key={hudak}
+    ,author={Hudak, P. and Bloss, A.}
+    ,title={The aggregate update problem in functional programming systems}
+    ,booktitle={12th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1985
+    ,pages={300-314}
+    }
+@techreport{huda85b
+    ,key={hudak}
+    ,author={Hudak, P. and Smith, L.}
+    ,title={Para-functional programming: a paradigm for programming
+            multiprocessor systems}
+    ,institution={Yale University}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-390}
+    ,month=Jun
+    ,year=1985
+    }
+@techreport{huda85c
+    ,key={hudak}
+    ,author={Hudak, P. and Young, J.}
+    ,title={A set-theoretic characterization of function strictness
+            in the Lambda Calculus}
+    ,institution={Yale University}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-391}
+    ,month=Jun
+    ,year=1985
+    }
+@article{huda85d
+    ,key={hudak}
+    ,author={Hudak, P. and Goldberg, B.}
+    ,title={Distributed execution of functional programs
+            using serial combinators}
+    ,journal={IEEE Transactions on Computers}
+    ,volume={C-34}
+    ,number=10
+    ,month=Oct
+    ,year=1985
+    ,pages={881-891}
+    ,note={Also appeared in Proceedings of 1985 International Conf. on
+           Parallel Processing, Aug. 1985, pp. 831-839.}
+    }
+@InProceedings{huda85e
+    ,key={hudak}
+    ,author={Hudak, P. and Goldberg, B.}
+    ,title={Serial combinators: ``optimal'' grains of parallelism}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,month=Sep
+    ,year=1985
+    ,publisher={Springer-Verlag LNCS 201}
+    ,pages={382-388}
+    }
+@phdthesis{mycr81b
+    ,key={mycroft}
+    ,author={Mycroft, A.}
+    ,title={Abstract Interpretation and Optimizing Transformations for
+            Applicative Programs}
+    ,school={University of Edinburgh}
+    ,year=1981
+    }
+@InProceedings{mycr80
+    ,key={Mycroft}
+    ,author={Mycroft, A.}
+    ,title={The theory and practice of transforming call-by-need into
+            call-by-value}
+    ,booktitle={Proceedings of International Symposium on Programming}
+    ,organization={Springer-Verlag LNCS Vol. 83}
+    ,year=1980
+    ,pages={269-281}
+    }
+@InProceedings{miln84
+    ,key={milner}
+    ,author={Milner, R.}
+    ,title={A proposal for {S}tandard {ML}}
+    ,booktitle={Proceedings 1984 ACM Conf. on LISP and Functional Programming}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Aug
+    ,pages={184-197}
+    }
+@book{gold83
+    ,key="goldberg"
+    ,author="Goldberg, A. and Robson, D."
+    ,title="Smalltalk-80: The Language and its Implementation"
+    ,publisher="Addison-Wesley Publishing Company"
+    ,address="Reading, Mass."
+    ,year=1983
+    }
+@techreport{john81
+    ,key={johnsson}
+    ,author={Johnsson, T.}
+    ,title={Detecting when call-by-value can be used instead of call-by-need}
+    ,institution={Chalmers University of Technology, Department of Computer Science}
+    ,type={Laboratory for Programming Methodology Memo}
+    ,number={14}
+    ,month=Oct
+    ,year=1981
+    }
+@InProceedings{dama82
+    ,key={damas}
+    ,author={Damas, Lu\'{\i}s and Milner, Robin}
+    ,title={Principal type schemes for functional languages}
+    ,booktitle={9th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1982
+    ,month=Aug
+    }
+@article{burt84
+    ,key={Burton}
+    ,author={Burton, F.W.}
+    ,title={Annotations to control parallelism and reduction order in the
+            distributed evaluation of functional programs}
+    ,journal={ACM Transactions on Programming Languages and Systems}
+    ,volume=6
+    ,number=2
+    ,month=Apr
+    ,year=1984
+    ,pages={159-174}
+    }
+@article{beel84
+    ,key={Beeler}
+    ,author={Beeler, M}
+    ,title={Beyond the baskett benchmark}
+    ,journal={Computer Architecture News}
+    ,volume=19
+    ,number=3
+    ,month=Mar
+    ,year=1984
+    }
+@InProceedings{smit84
+    ,key={smith}
+    ,author={Smith, B.C.}
+    ,title={Reflection and semantics in LISP}
+    ,booktitle={11th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1984
+    ,month=Jan
+    ,pages={121-132}
+    }
+@InProceedings{frie85
+    ,key={friedman}
+    ,author={Friedman, D.P. and Haynes, C.T.}
+    ,title={Constraining control}
+    ,booktitle={12th ACM Symposium on Principles of Programming Languages}
+    ,organization={ACM}
+    ,year=1985
+    ,pages={245-254}
+    }
+@article{seit85
+    ,key={seitz}
+    ,author={Seitz, C.L.}
+    ,title={The cosmic cube}
+    ,journal={CACM}
+    ,volume=28
+    ,number=1
+    ,month=Jan
+    ,year=1985
+    }
+@techreport{shap84b
+    ,key={shapiro}
+    ,author={Shapiro, E.}
+    ,title={Systolic Programming: A Paradigm of Parallel Processing}
+    ,institution={The Weizmann Institute of Science}
+    ,type={Department of Applied Mathematics}
+    ,number={CS84-21}
+    ,month=Aug
+    ,year=1984
+    }
+@book{papp80
+    ,key={Pappert}
+    ,author={Pappert, S.}
+    ,title={Mindstorms: Children, Computers and Powerful Ideas}
+    ,publisher={Basic Books}
+    ,place={New York}
+    ,year=1980
+    }
+@book{bare84
+    ,key={Barendregt}
+    ,author={Barendregt, H.P.}
+    ,title={The lambda calculus: its syntax and semantics}
+    ,publisher={North-Holland}
+    ,place={Amsterdam}
+    ,year=1984
+    }
+@techreport{rich85
+    ,key={richards}
+    ,author={Richards, H. Jr.}
+    ,title={An overview of the Burroughs NORMA}
+    ,institution={Burroughs Austin Research Center}
+    ,month=Jan
+    ,year=1985
+    }
+@techreport{huda85g
+    ,key={li}
+    ,author={Li, K. and Hudak, P.}
+    ,title={A new list compaction method}
+    ,institution={Yale University}
+    ,type={Research Report}
+    ,number={YALEU/DCS/RR-362}
+    ,month=Feb
+    ,year=1985
+    }
+@InProceedings{kell85
+    ,key={Keller}
+    ,author={Keller, R.M. and Lindstrom, G.}
+    ,title={Approaching distributed database implementations
+            through functional programming concepts}
+    ,booktitle={International Conf. on Distributed Systems}
+    ,month=May
+    ,year=1985
+    }
+@techreport{kieb85
+    ,key={kieburtz}
+    ,author={Kieburtz, R.B.}
+    ,title={The G-machine: a fast, graph-reduction evaluator}
+    ,institution={Department of Computer Science, Oregon Graduate Center}
+    ,month=Jan
+    ,number="CS/E-85-002"
+    ,year=1985
+    }
+@techreport{john85
+    ,key={Johnsson}
+    ,author={Johnsson, T.}
+    ,title={The G-machine: an abstract machine for graph reduction}
+    ,institution={PMG, Department of Computer Science, Chalmers University of Tech.}
+    ,month=Feb
+    ,year=1985
+    }
+@techreport{inte85
+    ,key={Intel}
+    ,author={Intel Corporation}
+    ,title={iPSC User's Guide -- Preliminary}
+    ,institution={Intel Corporation}
+    ,month=Jul
+    ,year=1985
+    ,number="175455-001"
+    }
+@unpublished{meye85
+    ,key={Meyer}
+    ,author={Meyer, A.R.}
+    ,title={Complexity of program flow-analysis for strictness}
+    ,note={(Unpublished summary)}
+    ,month=Aug
+    ,year=1985}
+@InProceedings{clac85
+    ,key={clack}
+    ,author={Clack, C. and Peyton Jones, Simon L.}
+    ,title={Strictness analysis -- a practical approach}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,month=Sep
+    ,year=1985
+    ,publisher={Springer-Verlag LNCS 201}
+    ,pages={35-49}
+    }
+@InProceedings{huda86a
+    ,key={hudak}
+    ,author={Hudak, P. and Young, J.}
+    ,title={Higher-order strictness analysis for untyped lambda calculus}
+    ,booktitle={12th ACM Symposium on Principles of Programming Languages}
+    ,month=Jan
+    ,year=1986
+    ,pages={97-109}
+    }
+@InProceedings{huda86b
+    ,key={hudak}
+    ,author={Hudak, P. and Smith, L.}
+    ,title={Para-functional programming: a paradigm for programming
+            multiprocessor systems}
+    ,booktitle={12th ACM Symposium on Principles of Programming Languages}
+    ,month=Jan
+    ,year=1986
+    ,pages={243-254}
+    }
+@InProceedings{turn85
+    ,key={turner}
+    ,author={Turner, D.A.}
+    ,title={Miranda: a non-strict functional language with polymorphic types}
+    ,booktitle={Functional Programming Languages and Computer Architecture}
+    ,month=Sep
+    ,year=1985
+    ,publisher={Springer-Verlag LNCS 201}
+    ,pages={1-16}
+    }
+@techreport{stee76a
+    ,key={steele}
+    ,author={Steele, G.L. Jr.}
+    ,title={LAMBDA --- the ultimate imperative}
+    ,institution={Massachusetts Institute of Technology}
+    ,type={AI Memo}
+    ,month=Mar
+    ,year=1976
+    ,number=353
+    }
+@techreport{stee76b
+    ,key={steele}
+    ,author={Steele, G.L. Jr.}
+    ,title={LAMBDA --- the ultimate declarative}
+    ,institution={Massachusetts Institute of Technology}
+    ,type={AI Memo}
+    ,month=Nov
+    ,year=1976
+    ,number=379
+    }
+@techreport{stee78
+    ,key={steele}
+    ,author={Steele, G.L. Jr.}
+    ,title={The art of the interpreter or, the modularity complex
+            (parts zero, one, and two)}
+    ,institution={Massachusetts Institute of Technology}
+    ,type={AI Memo}
+    ,month=May
+    ,year=1978
+    ,number=453
+    }
+@techreport{RRRS
+    ,key={clinger}
+    ,author={{Clinger, W. et al.}}
+    ,title={The Revised Revised Report on Scheme, or
+            An UnCommon Lisp}
+    ,institution={Massachusetts Institute of Technology}
+    ,type={AI Memo}
+    ,month=Aug
+    ,year=1985
+    ,number=848
+    }
+@InProceedings{powe84
+    ,key={powell} 
+    ,author={Powell, M.L.}
+    ,title={A portable optimizing compiler for Modula-2}
+    ,booktitle={Proceedings Symposium on Compiler Construction}
+    ,organization={ACM, SIGPLAN Notices 19(6)}
+    ,month=Jun
+    ,year=1984
+    ,pages={310-318}
+    }
+@unpublished{gabr85
+    ,key={gabriel}
+    ,author={Gabriel, R.}
+    ,year=1985
+    ,title={(personal communication)}
+    }
+@unpublished{roza85
+    ,key={rozas}
+    ,author={Rozas, W.}
+    ,year=1985
+    ,title={(personal communication)}
+    }
+@article{szym78
+    ,key={szymanski}
+    ,author={Szymanski}
+    ,title={Assembling code for machines with span-dependent instructions}
+    ,journal={CACM}
+    ,volume=21
+    ,number=4
+    ,month=Apr
+    ,year=1978
+    ,pages={300-308}
+    }
+@phdthesis{elli85
+    ,key={ellis}
+    ,author={Ellis, J.R.}
+    ,title={Bulldog: A Compiler for VLIW Architectures}
+    ,school={Yale University}
+    ,note={Available as Research Report YALEU/DCS/RR-364}
+    ,year=1985
+    }
+@InProceedings{huda85f
+    ,key={fasel}
+    ,author={Fasel, J.H. and Hudak, P. and Douglass, R.J. and Michelson, R.}
+    ,title={A distributed implementation of functional program evaluation}
+    ,booktitle={Proceedings of AI-85}
+    ,month=May
+    ,year=1985
+    }
+
+@InProceedings{T00,
+  author = 	 "Walid Taha",
+  title = 	 "A Sound Reduction Semantics for Untyped {CBN} Multi-Stage
+                  Computation.  {O}r, the Theory of {MetaML} is Non-trivial.",
+  booktitle = 	 {Proc. 
+                  Workshop on Partial Evaluation and
+                  Semantics-Based Program Maniplation {(PEPM)}},
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpages = 	 {},
+  year = 	 "2000",
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  address = 	 "Boston",
+  OPTorganization = {},
+  publisher = "ACM Press",
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{Ong,
+  author = 	 "A. S. Murawski and C.-H. L. Ong",
+  title = 	 "Can safe recursion be interpreted in light logic?",
+  booktitle = 	 "Second International Workshop on 
+                  Implicit Computational Complexity",
+  year = 	 200,
+  address = 	 "Santa Barbara",
+  month = 	 jun
+}
+
+@Book{Hodges97,
+  author =       "Wilfred Hodges",
+  title =        "A Shorter Model Theory",
+  publisher =    "Cambridge University Press",
+  year =         "1997",
+}
+
+@Book{Nielson92,
+  author =       "Hanne Riis Nielson and Flenning Nielson",
+  title =        "Semantics with Applications : {A} Formal
+                 Introduction",
+  publisher =    "John Wiley \& Sons",
+  address =      "Chichester",
+  year =         "1992",
+  descriptor =   "Axiomatische Semantik, Denotationelle Semantik,
+                 Miranda, Operationale Semantik, Semantik",
+  annote =       "Einfuehrung und Grundlagen der Semantik von
+                 Programmiersprachen: operational, denotational und
+                 axiomatisch. Anhand einer Miniatursprache (While)
+                 werden die drei unterschiedlichen Methoden vorgestellt
+                 und verglichen.",
+}
+
+@InCollection{CharityI,
+  author =       "J. Robin B. Cockett and Dwight Spencer",
+  title =        "Strong Categorical Datatypes {I}",
+  editor =       "R. A. G. Seely",
+  booktitle =    "Proceedings International Summer Category Theory Meeting,
+                 Montr{\'e}al, Qu{\'e}bec, 23--30 June 1991",
+  series =       "Canadian Mathematical Society Conf.\ Proceedings",
+  volume =       "13",
+  pages =        "141--169",
+  publisher =    "American Mathematical Society",
+  address =      "Providence, RI",
+  year =         "1992",
+  url =          "ftp://ftp.cpsc.ucalgary.ca/pub/projects/charity/literature/papers_and_reports/dataI.ps.gz",
+}
+
+@Article{CharityII,
+  author =       "J. Robin B. Cockett and Dwight Spencer",
+  title =        "Strong Categorical Datatypes {II}: {A} Term Logic for
+                 Categorical Programming",
+  journal =      "Theoretical Computer Science",
+  volume =       "139",
+  number =       "1--2",
+  pages =        "69--113",
+  year =         "1995",
+  url =          "ftp://ftp.cpsc.ucalgary.ca/pub/projects/charity/literature/papers_and_reports/dataII.ps.gz",
+}
+
+@Book{Okasaki98,
+  key =          "Okasaki",
+  author =       "Chris Okasaki",
+  title =        "Purely Functional Data Structures",
+  publisher =    "Cambridge University Press",
+  year =         "1998",
+  address =      "Cambridge, UK",
+  annote =       "Data structures and efficiency analysis for functional
+                 programming. Code in ML and Haskell. Many references.",
+}
+
+@Manual{esterel-manual,
+  title = 	 {The {E}sterel v5.21 System Manual},
+  author = 	 {Gerard  Berry and the Esterel Team},
+  organization = {Centre de Math\'ematiques Appliqu\'ees, Ecole des Mines de Paris and INRIA},
+  month = 	 {March},
+  year = 	 {1999},
+  note = 	 {Available at \fr{http://www.inria.fr/meije/esterel}}
+}
+@Article{statecharts,
+  author = 	 {David Harel},
+  title = 	 {\textsc{Statecharts}: a visual formalism for complex systems},
+  journal = 	 {Science of Computer Programming},
+  year = 	 {1987},
+  volume = 	 {8},
+  number = 	 {3},
+  pages = 	 {231--274},
+  month = 	 {June}
+}
+@InProceedings{berry-rtp,
+  author = 	 {Gerard  Berry},
+  title = 	 {Real time programming: {S}pecial purpose or general purpose languages},
+  booktitle = 	 {IFIP World Computer Congress},
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpages = 	 {},
+  year = 	 {1989},
+  address = 	 {San Francisco}
+}
+
+@InProceedings{ComputingForEmbedded,
+  author = 	 "Edward A. Lee",
+  title = 	 "Computing for Embedded Systems",
+  booktitle = 	 "IEEE Instrumentation and Measurement Technology
+     Conf.",
+  year = 	 2001,
+  address = 	 "Budapest, Hungary"
+}
+
+@InProceedings{WhatsAhead,
+  author = 	 "Edward A. Lee",
+  title = 	 "What's Ahead for Embedded Software?",
+  booktitle = 	 "IEEE Computer",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpages = 	 {},
+  year = 	 2000,
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  month = 	 sep,
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@Article{Okasaki98b,
+  key =          "Okasaki",
+  author =       "Chris Okasaki",
+  title =        "Even higher-order functions for parsing or Why would
+                 anyone ever want to use a sixth-order function?",
+  journal =      "Journal of Functional Programming",
+  year =         "1998",
+  volume =       "8",
+  number =       "2",
+  month =        mar,
+  pages =        "195--199",
+  annote =       "Parsing combinators for ML. 6 references.",
+}
+
+
+@InProceedings{craryModules,
+  author = 	 "K. Crary and R. Harper and S. Puri",
+  title = 	 "What is a recursive module?",
+  booktitle = 	 "Programming Language Design and Implementation
+                 ({PLDI})",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpages = 	 {},
+  year = 	 1999,
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{McSi98,
+  author =       "Nicholas McKay and Satnam Singh",
+  title =        "Dynamic Specialization of {XC6200} {FPGA}s by Partial
+                 Evaluation",
+  editor =       "Reiner W. Hartenstein and Andres Keevallik",
+  series =       LNCS,
+  volume =       1482,
+  publisher =    "Springer-Verlag",
+  booktitle =    "International Workshop on
+                 Field-Programmable Logic and Applications",
+  year =         "1998",
+  pages =        "298--307",
+}
+
+@InProceedings{Kieburtz99,
+  author =       "Richard Kieburtz",
+  title =        "Taming Effects with Monadic Typing",
+  booktitle =    "the International
+                 Conf. on Functional Programming (ICFP '98)",
+  series =       "ACM SIGPLAN Notices",
+  volume =       "34(1)",
+  pages =        "51--62",
+  month =        jun,
+  year =         "1999",
+  organization = "ACM",
+}
+
+@Article{EP97,
+  author =       "Abbas Edalat and Peter John Potts",
+  title =        "A new representation for exact real numbers",
+  journal =      "Electronical Notes in Theoretical Computer Science",
+  year =         "1997",
+  volume =       "6",
+  pages =        "14 pp.",
+  note =         "Mathematical foundations of programming semantics
+                 (Pittsburgh, PA, 1997)",
+}
+@Article{Hofmann00a,
+  author =       "Martin Hofmann",
+  title =        "Programming Languages Capturing Complexity Classes",
+  journal =      "SIGACTN: SIGACT News (ACM Special Interest Group on
+                 Automata and Computability Theory)",
+  volume =       "31",
+  year =         "2000",
+}
+
+@PhdThesis{Koen,
+  author = 	 "Koen Claessen",
+  title = 	 "Embedded Languages for Describing and Verifying Hardware",
+  school = 	 "Chalmers",
+  year = 	 2001,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{Hawk,
+  author =       "John Matthews and Byron Cook and John Launchbury",
+  title =        "Microprocessor Specification in {H}awk",
+  booktitle =    "Proc. 1998 International Conf. on
+                 Computer Languages",
+  publisher =    "IEEE Computer Society Press",
+  year =         "1998",
+  ISBN =         "0-780-35005-7, 0-8186-8454-2, 0-8186-8456-9",
+  pages =        "90--101",
+  abstract =     "Modern microprocessors require an immense investment
+                 of time and effort to create and verify, from the
+                 high-level architectural design downwards. We are
+                 exploring ways to increase the productivity of design
+                 engineers by creating a domain-specific language for
+                 specifying and simulating processor architectures. We
+                 believe that the structuring principles used in modern
+                 functional programming languages, such as static
+                 typing, parametric polymorphism, first-class functions,
+                 and lazy evaluation provide a good formalism for such a
+                 domain-specific language, and have made initial
+                 progress by creating a library on top of the functional
+                 language Haskell. We have specified the integer subset
+                 of an out-of-order, superscalar DLX microprocessor,
+                 with register-renaming, a reorder buffer, a global
+                 reservation station, multiple execution units, and
+                 speculative branch execution. Two key abstractions of
+                 this library are the signal abstract data type (ADT),
+                 which models the simulation history of a wire, and the
+                 transaction ADT, which models the state of an entire
+                 instruction as it travels through the microprocessor.",
+  references =   "Aagaard, M., and Leeser, M. Reasoning about pipelines
+                 with structural hazards. In Second International
+                 Conf. on Theorem Provers in Circuit Design (Bad
+                 Herrenalb, Germany, Sept. 1994). Barton, D. Advanced
+                 modeling features of MHDL. In International Conf.
+                 on Electronic Hardware Description Languages (Jan.
+                 1995). Gill, A., Launchbury, J., and Jones, S. P. A
+                 short-cut to deforestation. In ACM Conf. on
+                 Functional Programming and Computer Architecture
+                 (Copenhagen, Denmark, June 1993). Hennessy, J. L., and
+                 Patterson, D. A. Computer Architecture: A Quantitative
+                 Approach. Morgan Kaufmann, 1995. Hudak, P., Peterson,
+                 J., and Fasel, J. A gentle introduction to Haskell.
+                 Available at www.haskell.org, Dec. 1997. Johnson, M.
+                 Superscalar Microprocessor Design. Prentice Hall, 1991.
+                 Jones, G., and Sheeran, M. Circuit design in Ruby. In
+                 Formal Methods for VLSI Design, J. Staunstrup, Ed.
+                 North-Holland, 1990. Li, Y., and Leeser, M. HML: An
+                 innovative hardware design language and its translation
+                 to VHDL. In Conf. on Hardware Design Languages
+                 (June 1995). Melham, T. Abstraction mechanisms for
+                 hardware verification. In VLSI Specification,
+                 Verification and Synthesis, G. Birtwhistle and P. A.
+                 Subrahmanyam, Eds. Kluwer Academic Publishers, 1988.
+                 O'Donnell, J. From transistors to computer
+                 architecture: Teaching functional circuit specification
+                 in Hydra. In Symposium on Functional Programming
+                 Languages in Education (July 1995). Paulson, L.
+                 Isabelle: A Generic Theorem Prover. Springer-Verlag,
+                 1994. Peterson, J., and et al. Report on the
+                 programming language Haskell: A non-strict, purely
+                 functional language, version 1.4. Available at
+                 www.haskell.org, Apr. 1997. Sinderson, E., and et al.
+                 Hawk: A hardware specification language, version 1.
+                 Available at www.cse.ogi.edu/PacSoft/projects/Hawk/,
+                 Oct. 1997. Windley, P., and Coe, M. A correctness model
+                 for pipelined microprocessors. In Second International
+                 Conf. on Theorem Provers in Circuit Design (Sept.
+                 1994).",
+  annote =       "checked",
+}
+
+@Book{Nordstrom90,
+  key =          "Bengt Nordstrom and Kent Peterson and Jan M. Smith",
+  author =       "Bengt Nordstr{\"o}m and Kent Peterson and Jan M.
+                 Smith",
+  title =        "Programming in Martin-L{\"o}f's Type Theory:  An Introduction",
+  publisher =    "Oxford University Press",
+  year =         "1990",
+  volume =       "7",
+  address =      "New York, NY",
+}
+
+@InProceedings{Aehlig00,
+  author =       "Klaus Aehlig and Helmut Schwichtenberg",
+  title =        "A Syntactical Analysis of Non-Size-Increasing
+                 Polynomial Time Computation",
+  pages =        "84--94",
+  booktitle =    "the Symposium on Logic in Computer Science ({LICS}'
+                 00)",
+  ISBN =         "0-7695-0725-5",
+  month =        jun,
+  publisher =    "IEEE",
+  year =         "2000",
+}
+
+@InProceedings{ac:fruit01,
+  author = {Antony Courtney and Conal Elliott},
+  title = "Genuinely Functional User Interfaces",
+  booktitle = {Proc. Haskell Workshop},
+  year = 2001,
+  month = {September}
+}
+
+@Article{henderson86ieee,
+  author =       "Peter Henderson",
+  title =        "Functional Programming, Formal Specification and Rapid
+Prototyping",
+  journal =      "IEEE Transactions on Software Engineering",
+  year =         1986,
+  volume =       12,
+  number =       2,
+  pages =        {241--250}
+}
+
+@incollection{ stoy82some,
+    author = "Joseph E. Stoy",
+    title = "Some Mathematical Aspects of Functional Programming",
+    booktitle = "Functional Programming and its Applications",
+    publisher = "Cambridge University Press",
+    editor = "John Darlington and Peter Henderson and David A. Turner",
+    pages = "217--252",
+    year = "1982"
+}
+
+@article{ turner84functional,
+    author = "David A. Turner",
+    title = "Functional Programs as Executable Specifications",
+    journal = "Philosophical Transactions of the Royal Society of London",
+    volume = "A312",
+    pages = "363--388",
+    year = "1984"
+}
+
+@Article{backus:78,
+  author =      "John Backus",
+  title =       "Can Programming Be Liberated from the von {N}eumann
+                 Style? {A} functional Style and Its Algebra of Programs",
+  journal =     "Communications of the ACM",
+  year =        "1978",
+  volume =      "21",
+  number =      "8",
+  pages =       "613-641"
+}
+
+@PhdThesis{tos94,
+  author = 	 "Healfdene Goguen",
+  title = 	 "A Typed Operational Semantics for Type Theory",
+  school = 	 "University of Edinburgh",
+  year = 	 1994,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@Article{Hofmann2000,
+  author =       "Martin Hofmann",
+  title =        "A Type System for Bounded Space and Functional
+                 In-Place Update",
+  journal =      "Nordic Journal of Computing",
+  volume =       "7",
+  number =       "4",
+  month =        "Winter",
+  year =         "2000",
+  coden =        "NJCOFR",
+  ISSN =         "1236-6064",
+  bibdate =      "Sat Jul 14 11:08:02 MDT 2001",
+  url =          "http://www.cs.helsinki.fi/njc/References/hofmann2000:258.html",
+  acknowledgement = ack-nhfb,
+}
+
+@PhdThesis{russoThesis,
+  author = 	 "Claudio Russo",
+  title = 	 "Types for Modules",
+  school = 	 "Edinburgh University",
+  year = 	 1998,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InCollection{Pfenning99handbook,
+  author =   "Frank Pfenning",
+  title =   "Logical Frameworks",
+  booktitle =  "Handbook of Automated Reasoning",
+  publisher =  "Elsevier Science Publishers",
+  year =  1999,
+  editor =  "Alan Robinson and Andrei Voronkov",
+  volume =   {II},
+  keywords =  "LF, Elf, misc"
+}
+
+@Article{Harper93jacm,
+  author = "Robert Harper and Furio Honsell and Gordon Plotkin",
+  title = "A Framework for Defining Logics",
+  journal = "Journal of the Association for Computing Machinery",
+  volume = "40",
+  number = "1",
+  month = jan,
+  year = "1993",
+  pages = "143--184",
+  urldvi = "http://www.cs.cmu.edu/~fp/elf-papers/jacm93.dvi.gz",
+  keywords =  "LF"
+}
+
+@InCollection{Basin93le,
+  author = "David A. Basin and Robert L. Constable",
+  title =       "Metalogical Frameworks",
+  booktitle =   "Logical Environments",
+  publisher =   "Cambridge University Press",
+  year =        1993,
+  editor =      "G. Huet and G. Plotkin",
+  pages =       "1--29",
+  keywords =  "misc"
+}
+
+@Book{Paulson94book,
+  author = "Lawrence C. Paulson",
+  title = "Isabelle: A Generic Theorem Prover",
+  publisher = "Springer-Verlag LNCS 828",
+  year = 1994,
+  keywords =  "Isabelle"
+}
+
+@article (CHURCH40,
+key = "Church40" ,
+author = "Alonzo Church" ,
+title = "A Formulation of the Simple Theory of Types" ,
+journal = "Journal of Symbolic Logic" ,
+volume = "5" ,
+year = "1940" ,
+pages = "56--68" ,
+keywords= "hol, fp"
+)
+
+@InProceedings{appel01lics,
+  author =   {Andrew W. Appel},
+  title =   {Foundational Proof-Carrying Code},
+  booktitle =   {16th Annual IEEE Symposium on Logic in Computer Science
+
+                (LICS '01)},
+  year =  2001,
+  address =  {Boston, USA},
+  month =  {June},
+  note =  {to appear}
+}
+
+
+@InProceedings{Appel99ccs,
+  author =   "Andrew W. Appel and Edward W. Felten",
+  title =   "Proof-Carrying Authentication",
+  editor =  "G. Tsudik",
+  booktitle =  "Proc. 6th Conf. on Computer and
+    Communications Security",
+  year =  1999,
+  publisher =  "ACM Press",
+  address =  "Singapore",
+  month =  nov,
+  note =  "To appear",
+  keywords =  "LF, Elf"
+}
+
+@PhdThesis{Necula98phd,
+  author =   "George C. Necula",
+  title =   "Compiling with Proofs",
+  school =   "Carnegie Mellon University",
+  year =   1998,
+  month =  oct,
+  note =         "Available as Technical Report CMU-CS-98-154"
+}
+
+@InProceedings{Necula97popl,
+  author =   "George C. Necula",
+  title =   "Proof-Carrying Code",
+  booktitle =  "Conf. Record of the 24th Symposium on Principles
+    of Programming Languages (POPL'97)",
+  year =  1997,
+  publisher =  "ACM Press",
+  address =  "Paris, France",
+  month =  jan,
+  editor =       "Neil D. Jones",
+  pages =  "106--119"
+}
+
+@InProceedings{Necula96osdi,
+  author =   "George C. Necula and Peter Lee",
+  title =   "Safe Kernel Extensions Without Run-Time Checking",
+  booktitle =  "Proc. Second Symposium on Operating
+    System Design and Implementation (OSDI'96)",
+  year =  1996,
+  address =  "Seattle, Washington",
+  month =  oct,
+  pages =  "229--243"
+}
+
+@InProceedings{Schurmann01csl,
+  author =   {Carsten Sch{\"u}rmann},
+  title =   {Recursion for higher-order encodings},
+  booktitle =   {Proc. Conf. on Computer Science Logic
+(CSL
+  2001)},
+  pages =  {585--599},
+  year =  2001,
+  editor =  {Laurent Fribourg},
+  address =  {Paris, France},
+  month =  {August},
+  publisher =  {Springer Verlag LNCS 2142}
+}
+
+@InProceedings{Schurmann01lpar, author = {Carsten Sch{\"u}rmann},
+  title = {A type-theoretic approach to induction with higher-order
+  encodings}, booktitle = {Proc. Conf. on Logic for
+  Programming, Artificial Intelligence and Reasoning (LPAR 2001)},
+  year = 2001, address = {Havana, Cuba}, note = {to appear} }
+
+
+@InProceedings{polyp,
+  title =        "{PolyP}---a polytypic programming language extension",
+  author =       "Patrik Jansson and Johan Jeuring",
+  pages =        "470--482",
+  booktitle =    "Conf. Record of {POPL}~'97: The 24th {ACM}
+                 {SIGPLAN}-{SIGACT} Symposium on Principles of
+                 Programming Languages",
+  month =        "15--17 " # jan,
+  year =         "1997",
+  address =      "Paris, France",
+  references =   "\cite{TCS::BohmB1985} \cite{IEEETIT::Cameron1988}
+                 \cite{SPE::Contla1985} \cite{POPL::DamasM1982}
+                 \cite{IPL::Dershowitz1979} \cite{LICS::Freyd1990}
+                 \cite{POPL::HarperM1995} \cite{SCP::Jay1995}
+                 \cite{JFP::Jones1995} \cite{SCP::Malcolm1990}
+                 \cite{FACS::Meertens1992}
+                 \cite{TOPLAS::PalsbergXL1995}",
+}
+
+@PhdThesis{ParikThesis,
+  author =       "Patrik Jansson",
+  title =        "Functional Polytypic Programming",
+  type =         "PhD thesis",
+  school =       "Department of Computing Science, Chalmers Univ.\ of
+                 Technology and Univ.\ of G{\"o}teborg",
+  month =        may,
+  year =         "2000",
+  url =          "http://www.cs.chalmers.se/~patrikj/poly/polythesis/polythesis.ps.gz",
+}
+
+
+@InCollection{Gibbons,
+  author =       "Jeremy Gibbons",
+  title =        "Polytypic Downward Accumulations",
+  editor =       "J. Jeuring",
+  booktitle =    "Proceedings 4th Int.\ Conf.\ on Mathematics of Program
+                 Construction, MPC'98, Marstrand, Sweden, 15--17 June
+                 1998",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "1422",
+  pages =        "207--233",
+  publisher =    "Springer-Verlag",
+  address =      "Berlin",
+  year =         "1998",
+  url =          "http://web.comlab.ox.ac.uk/oucl/work/jeremy.gibbons/publications/polyda.ps.gz",
+}
+
+@Article{Hinze,
+  author =       "Ralf Hinze",
+  title =        "Polytypic Functions over Nested Datatypes",
+  journal =      "Discrete Mathematics and Theoretical Computer
+                 Science",
+  volume =       "3",
+  number =       "4",
+  pages =        "193--214",
+  year =         "1999",
+  url =          "http://dmtcs.loria.fr/volumes/ps.gzpapers/dm030407.ps.gz",
+}
+
+@Book{b-book,
+  author =       "J.-R. Abrial",
+  title =        "The {B}-Book: Assigning Programs to Meanings",
+  publisher =    "Cambridge University Press",
+  year =         "1996",
+  price =        "\pounds 40.00",
+  ISBN =         "0-521-49619-5",
+  length =       "850",
+  annote =       "This book is a reference manual for the B-Method
+                 developed by Jean-Raymond Abrial, also the originator
+                 of the Z notation. B is designed for tool-assisted
+                 software development whereas Z is designed mainly for
+                 specification. \par Contents: Mathematical reasoning;
+                 Set notation; Mathematical objects; Introduction to
+                 abstract machines; Formal definition of abstract
+                 machines; Theory of abstract machines; Constructing
+                 large abstract machines; Example of abstract machines;
+                 Sequencing and loop; Programming examples; Refinement;
+                 Constructing large software systems; Example of
+                 refinement; \par Appendices: Summary of the most
+                 current notations; Syntax; Definitions; Visibility
+                 rules; Rules and axioms; Proof obligations.",
+}
+
+@book{vdm,
+    author = "Cliff B. Jones",
+    title = "Systematic Software Development Using {VDM}",
+    publisher = "Pren{\-}tice-Hall",
+    address = "Upper Saddle River, NJ 07458, USA",
+    isbn = "0-13-880733-7",
+    pages = "xiv + 333",
+    year = "1990"
+}
+
+@misc{Z,
+  author = "J. Spivey",
+  title = "A Specification Language and its Formal Semantics",
+  text = "J. M. Spivey, Understanding Z: A Specification Language and its
+Formal
+    Semantics, Cambridge U. P. (1988).",
+  year = "1988" }
+
+
+@InProceedings{Cierniak00,
+  author =       "Michal Cierniak and Guei-Yuan Lueh and James M.
+                 Stichnoth",
+  title =        "Practicing {JUDO}: Java under dynamic optimizations.",
+  pages =        "13--26",
+  booktitle =    "Proc. {ACM} {SIGPLAN} 2000 Conf. on
+                 Programming Language Design and Implementation
+                 ({PLDI}-00)",
+  month =        jun # " ~18--21",
+  series =       "ACM Sigplan Notices",
+  volume =       "35.5",
+  publisher =    "ACM Press",
+  address =      "N.Y.",
+  year =         "2000",
+}
+
+@InProceedings{Cierniak98,
+  author =       "Ali-Reza Adl-Tabatabai and Micha{\l} Cierniak and
+                 Guei-Yuan Lueh and Vishesh M. Parikh and James M.
+                 Stichnoth",
+  title =        "Fast, Effective Code Generation in a Just-in-Time
+                 {J}ava Compiler",
+  booktitle =    "Proc. {ACM} {SIGPLAN}~'98 Conf. on
+                 Programming Language Design and Implementation",
+  year =         "1998",
+  pages =        "280--290",
+  url =          "http://www.acm.org/pubs/articles/proceedings/pldi/277650/p280-adl-tabatabai/p280-adl-tabatabai.pdf",
+  genterms =     "ALGORITHMS, EXPERIMENTATION, LANGUAGES, PERFORMANCE",
+  categories =   "D.3.4 Software, PROGRAMMING LANGUAGES, Processors,
+                 Code generation. D.3.2 Software, PROGRAMMING LANGUAGES,
+                 Language Classifications, Java. D.3.4 Software,
+                 PROGRAMMING LANGUAGES, Processors, Compilers.",
+  annote =       "incomplete",
+}
+
+@InProceedings{FORTRANSpec,
+  author =       "Robert Gl{\"u}ck and Ryo Nakashige and Robert
+                 Z{\"o}chling",
+  year =         "1995",
+  title =        "Binding-Time Analysis Applied to Mathematical
+                 Algorithms",
+  booktitle =    "System Modelling and Optimization",
+  editor =       "J. Dole\v{z}al and J. Fidler",
+  publisher =    "Chapman \& Hall",
+  pages =        "137--146",
+  keywords =     "partial evaluation, numerical algorithms, scientific
+                 computing, Fortran",
+  summary =      "This paper shows how a binding-time analysis can be
+                 used to identify potential sources for specialization
+                 in mathematical algorithms. The method is surprisingly
+                 simple and effective. To demonstrate the effectiveness
+                 of this approach we used an automatic partial evaluator
+                 for Fortran that we developed. Results for five
+                 well-known algorithms show that some remarkable speedup
+                 factors can be obtained on a uniprocessor architecture
+                 (Romberg integration, cubic splines interpolation,
+                 partial differential equations, fast Fourier
+                 transformation, Chebyshev approximation)",
+  semno =        "D-244",
+  puf =          "Artikel i proceedings (med censur)",
+  id =           "KonR",
+}
+
+@InProceedings{Consel98,
+  author =       "Fran{\c{c}}ois No{\"e}l and Luke Hornof and Charles
+                 Consel and Julia L. Lawall",
+  title =        "Automatic, Template-Based Run-Time Specialization:
+                 Implementation and Experimental Study",
+  booktitle =    "Proc. 1998 International Conf. on
+                 Computer Languages",
+  publisher =    "IEEE Computer Society Press",
+  year =         "1998",
+  ISBN =         "0-780-35005-7, 0-8186-8454-2, 0-8186-8456-9",
+  pages =        "132--142",
+  abstract =     "Specializing programs with respect to run-time values
+                 has been shown to drastically improve code performance
+                 on realistic programs ranging from operating systems to
+                 graphics. Recently, various approaches to specializing
+                 code at run-time have been proposed. However, these
+                 approaches still suffer from shortcomings that limit
+                 their applicability: they are manual, too expensive, or
+                 require programs to be written in a dedicated language.
+                 We solve these problems by introducing new techniques
+                 to implement run-time specialization. The key to our
+                 approach is the use of code templates. Templates are
+                 automatically generated from ordinary programs and are
+                 optimized before run time, allowing high-quality code
+                 to be quickly generated at run time. Experimental
+                 results obtained on scientific and graphics code
+                 indicate that our approach is highly effective. Little
+                 run-time overhead is introduced, since code generation
+                 primarily consists of copying instructions. Run-time
+                 specialized programs run up to 10~times faster, and are
+                 nearly as fast as fully optimized programs (80\% on
+                 average). The combination of low run-time overhead and
+                 high code quality enables specialization to be
+                 amortized in as few as 3~runs. Although this approach
+                 is highly effective, its implementation is relatively
+                 simple since it exploits existing partial evaluation
+                 and compiler technologies.",
+  references =   "J. Auslander, M. Philipose, C. Chambers, S.J. Eggers,
+                 and B.N. Bershad. Fast, effective dynamic compilation.
+                 In PLDI'96 [21], pages 149--159. R. Bernstein.
+                 Multiplication by integer constants.
+                 Software---Practice and Experience, 16(7):641--652,
+                 July 1986. C. Consel, L. Hornof, F. No{\"e}l, J.
+                 Noy{\'e}, and E.N. Volanschi. A uniform approach for
+                 compile-time and run-time specialization. In O. Danvy,
+                 R. Gl{\"u}ck, and P. Thiemann, editors, Partial
+                 Evaluation, International Seminar, Dagstuhl Castle,
+                 number 1110 in Lecture Notes in Computer Science, pages
+                 54--72, February 1996. C. Consel and F. No{\"e}l. A
+                 general approach for run-time specialization and its
+                 application to C. In POPL96 [22], pages 145--156. D.R.
+                 Engler, W.C. Hsieh, and M.F. Kaashoek. `C: A language
+                 for high-level, efficient, and machine-independent
+                 dynamic code generation. In POPL96 [22], pages
+                 131--144. C. W. Fraser and D. R. Hanson. A code
+                 generation interface for ANSI C. Software---Practice
+                 and Experience, 21(9):963--988, 1991. R. Gl{\"u}ck, R.
+                 Nakashige, and R. Z{\"o}chling. Binding-time analysis
+                 applied to mathematical algorithms. In J. Dole{\v{z}}al
+                 and J. Fidler, editors, System Modelling and
+                 Optimization, pages 137--146. Chapman \& Hall, 1995. L.
+                 Hornof. Static Analyses for the Effective
+                 Specialization of Realistic Applications. PhD thesis,
+                 Universit{\'e} de Rennes I, June 1997. L. Hornof and J.
+                 Noy{\'e}. Accurate binding-time analysis for imperative
+                 languages: Flow, context, and return sensitivity. In
+                 PEPM'97 [19], pages 63--73. L. Hornof, J. Noy{\'e}, and
+                 C. Consel. Effective specialization of realistic
+                 programs via use sensitivity. In P. Van Hentenryck,
+                 editor, Proc. Fourth International
+                 Symposium on Static Analysis, SAS'97, volume 1302 of
+                 Lecture Notes in Computer Science, pages 293--314,
+                 Paris, France, September 1997. Springer-Verlag. N.D.
+                 Jones, Carsten K. Gomard, and P. Sestoft. Partial Evaluation
+                 and Automatic Program Generation. International Series
+                 in Computer Science. Prentice-Hall, June 1993. D.
+                 Keppel, S. Eggers, and R. Henry. A case for run-time
+                 code generation. Technical Report 91-11-04, Department
+                 of Computer Science, University of Washington, Seattle,
+                 WA, 1991. D. Kincaid and W. Cheney. Numerical Analysis:
+                 Mathematics of Scientific Computing. Brooks/Cole, 1991.
+                 P. Lee and M. Leone. Optimizing ML with run-time code
+                 generation. In PLDI'96 [21], pages 137--148. M. Leone
+                 and P. Lee. Lightweight run-time code generation. In
+                 ACM SIGPLAN Workshop on Partial Evaluation and
+                 Semantics-Based Program Manipulation, Orlando, FL, USA,
+                 June 1994. Technical Report 94/9, University of
+                 Melbourne, Australia. Karoline Malmkj{\ae}r. Abstract
+                 Interpretation of Partial-Evaluation Algorithms. PhD
+                 thesis, Department of Computing and Information
+                 Sciences, Kansas State University, Manhattan, Kansas,
+                 March 1993. G. Muller, B. Moura, F. Bellard, and C.
+                 Consel. JIT vs. offline compilers: Limits and benefits
+                 of byte-code compilation. Rapport de recherche 1063,
+                 IRISA, Rennes, France, December 1996. F. No{\"e}l.
+                 Sp{\'e}cialisation dynamique de code par {\'e}valuation
+                 partielle. PhD thesis, Universit{\'e} de Rennes I,
+                 October 1996. ACM SIGPLAN Symposium on Partial
+                 Evaluation and Semantics-Based Program Manipulation,
+                 Amsterdam, The Netherlands, June 1997. ACM Press. R.
+                 Pike, B. N. Locanthi, and J.F. Reiser.
+                 Hardware/software trade-offs for bitmap graphics on the
+                 blit. Software---Practice and Experience,
+                 15(2):131--151, 1985. Proc. ACM SIGPLAN
+                 '96 Conf. on Programming Language Design and
+                 Implementation, Philadelphia, PA, May 1996. ACM SIGPLAN
+                 Notices, 31(5). Conf. Record of the 23rd Annual
+                 ACM SIGPLAN-SIGACT Symposium on Principles Of
+                 Programming Languages, St. Petersburg Beach, FL, USA,
+                 January 1996. ACM Press. W. H. Press, S. A. Teukolsky,
+                 W. T. Vetterling, and B. P. Flannery. Numerical Recipes
+                 in FORTRAN The Art of Scientific Computing. Cambridge
+                 University Press, Cambridge, 2nd edition, 1993. C. Pu,
+                 H. Massalin, and J. Ioannidis. The Synthesis kernel.
+                 Computing Systems, 1(1):11--32, Winter 1988. M. Sperber
+                 and T. Thiemann. Two for the price of one: Composing
+                 partial evaluation and compilation. In Proceedings of
+                 the ACM SIGPLAN '97 Conf. on Programming Language
+                 Design and Implementation, pages 215--224, Las Vegas,
+                 Nevada, June 15--18, 1997. W. Taha and T. Sheard.
+                 Multi-state programming with explicit annotations. In
+                 PEPM'97 [19], pages 203--217. C. Yarvin and A. Sah.
+                 QuaC: Binary optimization for fast runtime code
+                 generation in C. Technical Report 94-792, Computer
+                 Science Department, University of California, Berkeley,
+                 1994.",
+  annote =       "checked",
+}
+
+@InCollection{Erratic,
+  author =       "A. K. Moran and D. Sands and M. Carlsson",
+  title =        "Erratic {F}udgets: {A} semantic theory for an embedded
+                 coordination language",
+  booktitle =    "Coordination '99",
+  series =       "{LNCS}",
+  volume =       "1594",
+  publisher =    "Springer-Verlag",
+  year =         "1999",
+  month =        apr,
+}
+
+@InProceedings{Mins97a,
+  author =       "Naftaly Minsky and Victoria Ungureanu",
+  editor =       "David Garlan and Daniel Le M{\`e}tayer",
+  title =        "Regulated Coordination in Open Distributed Systems",
+  booktitle =    "Proceedings COORDINATION'97",
+  series =       "LNCS 1282",
+  pages =        "81--97",
+  publisher =    "Springer-Verlag",
+  address =      "Berlin, Germany",
+  month =        sep,
+  year =         "1997",
+  keywords =     "olit coordination97",
+}
+
+@InProceedings{Inve97a,
+  author =       "Paola Inverardi and Alexander L. Wolf and Daniel
+                 Yankelevich",
+  title =        "Checking Assumptions in Component Dynamics at the
+                 Architectural Level",
+  booktitle =    "Proceedings of COORDINATION'97",
+  series =       "LNCS 1282",
+  pages =        "46--63",
+  publisher =    "Springer-Verlag",
+  month =        sep,
+  year =         "1997",
+  keywords =     "CHAM Coordination",
+}
+
+@InProceedings{BroJac99,
+  author =       "A. Brogi and JM. Jacquet",
+  title =        "{On the expressiveness of Coordination Models}",
+  booktitle =    "Proc. 3rd Int. Conf. on Coordination Models and
+                 Languages",
+  month =        apr,
+  address =      "Amsterdam, Netherland",
+  year =         "1999",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "1594",
+  pages =        "134--149",
+  editor =       "P. Ciancarini and A. Wolf",
+  publisher =    "Springer-Verlag, Berlin",
+  keyword =      "coordination semantics",
+}
+
+@InProceedings{BKZ99,
+  author =       "M. Bonsangue and J. Kok and G. Zavattaro",
+  title =        "{Comparing Software Architectures for coordination
+                 languages}",
+  booktitle =    "Proc. 3rd Int. Conf. on Coordination Models and
+                 Languages",
+  month =        apr,
+  address =      "Amsterdam, Netherland",
+  year =         "1999",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "1594",
+  pages =        "150--165",
+  editor =       "P. Ciancarini and A. Wolf",
+  publisher =    "Springer-Verlag, Berlin",
+  keyword =      "coordination semantics",
+}
+
+@Article{CoadyEtAl01,
+  author =       "Coady and Kiczales and Feeley and Hutchinson and Ong",
+  title =        "Structuring Operating System Aspects: Using {AOP} to
+                 Improve {OS} Structure Modularity",
+  journal =      "CACM: Communications of the ACM",
+  volume =       "44",
+  year =         "2001",
+}
+
+@Article{ElrFilBad01,
+  author =       "Elrad and Filman and Bader",
+  title =        "Aspect-Oriented Programming",
+  journal =      "CACM: Communications of the ACM",
+  volume =       "44",
+  year =         "2001",
+}
+
+@InProceedings{Heitmeyer01,
+  author =       "Heitmeyer",
+  title =        "Applying Practical Formal Methods to the Specification
+                 and Analysis of Security Properties",
+  booktitle =    "International Workshop on Methods, Models and
+                 Architectures for Network Security, LNCS",
+  year =         "2001",
+}
+
+@InProceedings{Heitmeyer97a,
+  author =       "Constance Heitmeyer and James Kirby and Bruce Labaw",
+  title =        "The {SCR} Method for Formally Specifying, Verifying,
+                 and Validating Software Requirements: Tool Support",
+  booktitle =    "Proc. ~19th~ International Conf. on
+                 Software Engineering",
+  year =         "1997",
+  pages =        "610--611",
+  publisher =    "ACM Press",
+  month =        may,
+}
+
+@InProceedings{heintze:lics92,
+  title =        "An {E}ngine for {L}ogic {P}rogram {A}nalysis",
+  author =       "N. Heintze and J. Jaffar",
+  pages =        "318--328",
+  booktitle =    "Proceedings, Seventh Annual {IEEE} Symposium on Logic
+                 in Computer Science",
+  year =         "1992",
+  month =        jun # " 22--25",
+  address =      "Santa Cruz, California",
+  organization = "IEEE Computer Society Press",
+  ISBN =         "0-8186-2735-2",
+  acknowledgement = ack-mmc,
+}
+
+@InProceedings{Abadi-etal99,
+  key =          "Abadi, {\em et al.}",
+  author =       "Mart\'{\i}n Abadi and Anindya Banerjee and Nevin
+                 Heintze and Jon G. Riecke",
+  title =        "A Core Calculus of Dependency",
+  booktitle =    "Conf. Record of POPL 99: The 26th ACM
+                 SIGPLAN-SIGACT Symposium on Principles of Programming
+                 Languages, San Antonio, Texas",
+  year =         "1999",
+  organization = "ACM",
+  address =      "New York, NY",
+  month =        jan,
+  pages =        "147--160",
+  annote =       "40 references.",
+}
+
+@Article{CMS,
+  author = 	 "Calcagno, Cristiano and Moggi, Eugenio and Sheard, Tim",
+  title = 	 "Closed Types for a Safe Imperative {MetaML}",
+  journal = 	 "Journal of Functional Programming",
+  year = 	 {2003},
+  OPTkey = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTpages = 	 {},
+  OPTmonth = 	 {},
+  note = 	 "To appear",
+  OPTannote = 	 {}
+}
+
+@InProceedings{PTS02,
+  author =       {Pa\v{s}ali\'{c}, Emir and Taha, Walid and Sheard, Tim},
+  title =        {Tagless Staged Interpreters for Typed Languages},
+  booktitle =    {the International Conf. on 
+                  Functional Programming ({ICFP} '02)},
+  year =         {2002},
+  address =      {Pittsburgh, USA},
+  month =        {October},
+  organization = {ACM},
+}
+
+@InProceedings{N02,
+  author =       {Aleksander Nanevski},
+  title =        {Meta-Programming with Names and Necessity},
+  booktitle =    {the International Conf. on 
+                  Functional Programming ({ICFP} '02)},
+  year =         {2002},
+  address =      {Pittsburgh, USA},
+  month =        {October},
+  organization = {ACM},
+}
+
+@Book{BasicCat,
+  author =       "Benjamin C. Pierce",
+  title =        "Basic Category Theory for Computer Scientists",
+  publisher =    "MIT Press",
+  address =      "Cambridge, Mass.",
+  year =         "1991",
+  ISBN =         "0-262-66071-7",
+  descriptor =   "Semantik, Programmiersprache, Natuerliche
+                 Transformation, Kategorie, Funktor",
+  annote =       "Das Buch ist ein einfuehrendes Lehrbuch in die
+                 Kategorientheorie. Es enthaelt einige Anwendungen der
+                 Kategorientheorie aus dem Bereich der Semantik von
+                 Programmiersprachen.",
+}
+
+@InProceedings{CayenneInterp,
+  author = 	 " Lennart Augustsson and Magnus Carlsson",
+  title = 	 "An exercise in dependent types: A well-typed interpreter",
+  booktitle = 	 "Workshop on Dependent Types in Programming",
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpages = 	 {},
+  year = 	 1999,
+  OPTeditor = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTseries = 	 {},
+  address = 	 "Gothenburg",
+  OPTmonth = 	 {},
+  OPTorganization = {},
+  OPTpublisher = {},
+  note = 	 "Available online from \verb|www.cs.chalmers.se/~augustss/cayenne/interp.ps|",
+  OPTannote = 	 {}
+}
+
+@TechReport{Pu:83,
+  author = 	 "Calton Pu and Jonathan Walpole",
+  title = 	 "A Study of Dynamic Optimization Techniques: Lessons and Directions in Kernel Design",
+  institution =  "Oregon Graduate Institute",
+  year = 	 1993,
+  OPTkey = 	 {},
+  OPTtype = 	 {},
+  number = 	 "CSE-93-007",
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {},
+  note  =        "Available from \cite{ogi-tr-site}",
+}
+
+@article{dsls-on-line
+    ,author={Paul Hudak}
+    ,title={Building Domain Specific Embedded Languages}
+    ,journal={ACM Computing Surveys}
+    ,volume={28A}
+    ,month=Dec
+    ,year=1996
+    ,pages={(electronic)}
+    }
+
+@article{little-languages
+    ,author={Jon Bentley}
+    ,title={Little Languages}
+    ,journal={CACM}
+    ,volume=29
+    ,number=8
+    ,year=1986
+    ,pages={711-721}
+    }
+
+@inproceedings{dsel-reuse-98
+    ,author={Paul Hudak}
+    ,title={Modular Domain Specific Languages and Tools}
+    ,booktitle={Proceedings of Fifth International Conf. 
+                on Software Reuse}
+    ,organization={IEEE Computer Society}
+    ,year=1998
+    ,month=Jun
+    ,pages={134-142}
+    }
+
+@InProceedings{TMH01,
+  author =       "Walid Taha and Henning Makholm and John Hughes",
+  title =        "Tag Elimination and {Jones}-Optimality",
+  pages =        "257-275",
+  booktitle =    {Programs as Data Objects},
+  venue =        "Aarhus, Denmark",
+  year =         2001,
+  editor =       "Olivier Danvy and Andrzej Filinksi",
+  series =       LNCS,
+  volume =       2053,
+}
+
+@InProceedings{HarperMorrisett,
+  key =          "Harper \& Morrisett",
+  author =       "Robert Harper and Greg Morrisett",
+  title =        "Compiling Polymorphism Using Intentional Type
+                 Analysis",
+  booktitle =    "Conf. Record of POPL '95: 22nd Annual ACM
+                 SIGPLAN-SIGACT Symposium on Principles of Programming
+                 Languages, San Francisco, Calif.",
+  month =        jan,
+  year =         "1995",
+  organization = "ACM",
+  address =      "New York, NY",
+  pages =        "130--141",
+  annote =       "53 references.",
+}
+
+@InProceedings{FullyReflexive,
+  author =       "Valery Trifonov and Bratin Saha and Zhong Shao",
+  title =        "Fully reflexive intensional type analysis.",
+  pages =        "82--93",
+  booktitle =    "Proc. {ACM} Sigplan International
+                 Conf. on Functional Programming ({ICFP}-00)",
+  month =        sep # " ~18--21",
+  series =       "ACM Sigplan Notices",
+  volume =       "35.9",
+  publisher =    "ACM Press",
+  address =      "N.Y.",
+  year =         "2000",
+}
+
+
+@Unpublished{Huang,
+  author = 	 "Liwen Huang and Walid Taha",
+  title = 	 "A Practical Implementation of Tag Elimination",
+  note = 	 "In preperation"
+}
+
+@Unpublished{McCreight,
+  author = 	 "Andrew McCreight and Walid Taha",
+  title = 	 "An Experiment in Staging MetaPRL",
+  note = 	 "In preperation"
+}
+
+@InProceedings{XP99,
+  key =          "Xi \& Pfenning",
+  author =       "Howgwei Xi and Frank Pfenning",
+  title =        "Dependent Types in Practical Programming",
+  booktitle =    "Conf. Record of POPL 99: The 26th ACM
+                 SIGPLAN-SIGACT Symposium on Principles of Programming
+                 Languages, San Antonio, Texas",
+  year =         "1999",
+  organization = "ACM",
+  address =      "New York, NY",
+  month =        jan,
+  pages =        "214--227",
+  annote =       "28 references.",
+}
+
+
+@InProceedings{Dybjer87,
+  author =       "Peter Dybjer",
+  title =        "Inductively Defined Sets in {M}artin-{L}{\"o}f's Set
+                 Theory",
+  booktitle =    "Workshop on General Logic",
+  editor =       "A. Avron and R. Harper and F. Honsell and I. Mason and
+                 G. Plotkin",
+  institution =  "Report ECS-LFCS-88-52, Department of Computer Science,
+                 University of Edinburgh",
+  month =        feb,
+  year =         "1987",
+}
+
+
+@InCollection{Dybjer90,
+  author =       "Peter Dybjer",
+  title =        "Inductive Sets and Families in {M}artin-{L}{\"o}f's
+                 Type Theory and Their Set-Theoretic Semantics",
+  editor =       "G. Huet and G. Plotkin",
+  booktitle =    "Preliminary Proc.\ of 1st Int.\ Workshop on Logical
+                 Frameworks, Antibes, France, 7--11 May 1990",
+  pages =        "213--230",
+  note =         "ftp://ftp.inria.fr/INRIA/Projects/coq/types/Proceedings/book90.ps.Z",
+  year =         "1990",
+}
+
+@InCollection{Dybjer91,
+  author =       "Peter Dybjer",
+  title =        "Inductive Sets and Families in {M}artin-{L}{\"o}f's
+                 Type Theory and Their Set-Theoretic Semantics",
+  editor =       "G. Huet and G. Plotkin",
+  booktitle =    "Logical Frameworks",
+  publisher =    "Cambridge University Press",
+  year =         "1991",
+  pages =        "280--306",
+  url =          "ftp://ftp.cs.chalmers.se/pub/clics/peterd/Setsem_Inductive.ps",
+}
+
+
+@Article{Dybjer94,
+  author =       "Peter Dybjer",
+  title =        "Inductive Families",
+  journal =      "Formal Aspects of Computing",
+  year =         "1994",
+  volume =       "6",
+  number =       "4",
+  pages =        "440--465",
+  url =          "ftp://ftp.cs.chalmers.se/pub/clics/peterd/Inductive_Families.ps",
+}
+
+
+@Unpublished{Dybjer97,
+  author =       "Peter Dybjer",
+  title =        "A General Formulation of Simultaneous
+                 Inductive-Recursive Definitions in Type Theory",
+  month =        jun,
+  year =         "1997",
+  note =         "To appear in JSL",
+  url =          "ftp://ftp.cs.chalmers.se/pub/clics/peterd/Inductive_Recursive.ps",
+}
+
+@InCollection{Dybjer98,
+  author =       "Peter Dybjer and Anton Setzer",
+  title =        "Finite Axiomatizations of Inductive and
+                 Inductive-Recursive Definitions",
+  editor =       "R. Backhouse and T. Sheard",
+  booktitle =    "Informal Proc.\ of Workshop on Generic Programming,
+                 WGP'98, Marstrand, Sweden, 18 June 1998",
+  publisher =    "Dept.\ of Computing Science, Chalmers Univ.\ of
+                 Techn., and G{\"o}teborg Univ.",
+  month =        jun,
+  year =         "1998",
+  note =         "Electronic version available at
+                 http://wsinwp01.win.tue.nl:1234/WGPProceedings/",
+  url =          "http://www.math.uu.se/~setzer/articles/genprog98.ps.gz",
+}
+
+@InProceedings{Nordstrm81,
+  author =       "Bengt Nordstr{\"o}m",
+  title =        "Programming in Constructive Set Theory: Some
+                 Examples",
+  booktitle =    "Proc. ACM Conf. on Functional
+                 Programming and Computer Architecture, Portsmouth, NH",
+  pages =        "141--154",
+  publisher =    "ACM",
+  address =      "New York",
+  year =         "1981",
+}
+
+@Article{Magnusson94,
+  author =       "L. Magnusson and B. Nordstroem",
+  title =        "The {ALF} Proof Editor and Its Proof Engine",
+  journal =      "Lecture Notes in Computer Science",
+  volume =       "806",
+  pages =        "213--237",
+  year =         "1994",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Wed Sep 15 10:01:31 MDT 1999",
+  acknowledgement = ack-nhfb,
+  keywords =     "proofs; programs; TYPES",
+}
+
+@InCollection{NOR83a,
+  author =       "B. Nordstr{\"o}m and K. Petersson",
+  title =        "Types and Specifications",
+  booktitle =    "IFIP '83",
+  publisher =    "Elsevier Science Publishers",
+  editor =       "R. E. Mason",
+  pages =        "915--920",
+  year =         "1983",
+}
+
+@InCollection{NOR85a,
+  author =       "B. Nordstr{\"o}m",
+  title =        "Multilevel Functions in Type Theory",
+  booktitle =    "Programs as Data Objects",
+  editor =       "N. Jones",
+  publisher =    "Springer-Verlag, LNCS 217",
+  year =         "1985",
+}
+
+
+@Article{Coquand94,
+  author =       "Thierry Coquand and Bengt Nordstr{\"o}m and Jan M. Smith and
+                 Bjorne von Sydow",
+  title =        "Type Theory and Programming",
+  journal =      "Bulletin of the European Association for Theoretical
+                 Computer Science",
+  volume =       "52",
+  pages =        "203--228",
+  month =        feb,
+  year =         "1994",
+  note =         "Columns: Logic in Computer Science",
+}
+
+@Book{NPS90,
+  key =          "Nordstrom \& Peterson \& Smith",
+  author =       "Bengt Nordstr{\"o}m and Kent Peterson and Jan M.
+                 Smith",
+  title =        "Programming in Martin-Lof's Type Theory",
+  publisher =    "Oxford University Press",
+  year =         "1990",
+  volume =       "7",
+  series =       "International Series of Monographs on Computer
+                 Science",
+  address =      "New York, NY",
+  note    =      "Currently available online from first authors homepage."
+}
+
+@Article{Saibi:1995:FLC,
+  author =       "A. Saibi",
+  title =        "Formalization of a lambda-Calculus with Explicit
+                 Substitutions in {Coq}",
+  journal =      "Lecture Notes in Computer Science",
+  volume =       "996",
+  pages =        "183--202",
+  year =         "1995",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Wed Sep 15 10:01:31 MDT 1999",
+  acknowledgement = ack-nhfb,
+  keywords =     "types; proofs; programs",
+}
+
+@Article{Monin:1998:PRT,
+  author =       "J.-F Monin",
+  title =        "Proving a Real Time Algorithm for {ATM} in {Coq}",
+  journal =      "Lecture Notes in Computer Science",
+  volume =       "1512",
+  pages =        "277--??",
+  year =         "1998",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Tue Jan 5 08:21:58 MST 1999",
+  acknowledgement = ack-nhfb,
+}
+
+@Article{Leclerc:1994:PSC,
+  author =       "F. Leclerc and C. Paulin-Mohring",
+  title =        "Programming with Streams in {Coq} --- {A} Case Study:
+                 The Sieve of Eratosthenes",
+  journal =      "Lecture Notes in Computer Science",
+  volume =       "806",
+  pages =        "191--212",
+  year =         "1994",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Wed Sep 15 10:01:31 MDT 1999",
+  acknowledgement = ack-nhfb,
+  keywords =     "proofs; programs; TYPES",
+}
+
+@InProceedings{Chetali97a,
+  author =       "B. Chetali and B. Heyd",
+  year =         "1997",
+  title =        "Formal Verification of Concurrent Programs in {LP} and
+                 in {COQ}: {A} Comparative Analysis",
+  booktitle =    "Proc. 10th International Theorem Proving in Higher
+                 Order Logics Conf.",
+  pages =        "69--85",
+  abstract =     "This paper describes the formal verification of
+                 parallel programs using a rewrite and induction based
+                 theorem prover like LP and a higher order theorem
+                 prover based on the Calculus of Inductive Construction,
+                 namely COQ. The chosen specification environment is
+                 UNITY, a subset of temporal logic for specifying and
+                 verifying concurrent programs. By means of an example,
+                 a lift-control program, we describe the embedding of
+                 UNITY and we show how to verify mechanically program
+                 properties using the two provers. Then we summarize a
+                 comparison between the theorem proving environments,
+                 based on our practical experience with both systems for
+                 the verification of UNITY programs.",
+}
+
+@InProceedings{Zammit97a,
+  author =       "V. Zammit",
+  year =         "1997",
+  title =        "A Comparative Study of Coq and {HOL}",
+  booktitle =    "Proc. 10th International Theorem Proving in Higher
+                 Order Logics Conf.",
+  pages =        "323--337",
+  abstract =     "This paper illustrates the differences between the
+                 style of theory mechanisation of Coq and of HOL. This
+                 comparative study is based on the mechanisation of
+                 fragments of the theory of computation in these
+                 systems. Examples from these implementations are given
+                 to support some of the arguments discussed in this
+                 paper. The mechanisms for specifying definitions and
+                 for theorem proving are discussed separately, building
+                 in parallel two pictures of the different approaches of
+                 mechanisation given by these systems.",
+}
+
+@Article{PMW:synmps,
+  author =       "Christine Paulin-Mohring and Benjamin Werner",
+  title =        "Synthesis of {ML} Programs in the System {Coq}",
+  journal =      "Journal of Symbolic Computation",
+  volume =       "15",
+  number =       "5--6",
+  pages =        "607--640",
+  year =         "1993",
+  url =          "ftp://ftp.inria.fr/INRIA/Projects/coq/Benjamin.Werner/JSC93.dvi.gz",
+}
+
+@TechReport{PM92,
+  author =       "Christine Paulin-Mohring",
+  title =        "Inductive Definitions in the System {Coq}: Rules and
+                 Properties",
+  type =         "Research report",
+  number =       "RR 92-49",
+  institution =  "Laboratoire de l'Informatique du Parall{\'e}lisme,
+                 Ecole normale sup{\'e}rieure de Lyon",
+  month =        dec,
+  year =         "1992",
+  url =          "ftp://ftp.ens-lyon.fr/pub/LIP/Rapports/RR/RR1992/RR1992-49.ps.Z",
+}
+
+@InCollection{PM93,
+  author =       "Christine Paulin-Mohring",
+  title =        "Inductive Definitions in the System {Coq}: Rules and
+                 Properties",
+  editor =       "M. Bezem and J. F. Groote",
+  booktitle =    "Proc.\ of 1st Int.\ Conf.\ on Typed Lambda Calculi and
+                 Applications, TLCA'93, Utrecht, The Netherlands, 16--18
+                 March 1993",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "664",
+  pages =        "328--345",
+  publisher =    "Springer-Verlag",
+  address =      "Berlin",
+  year =         "1993",
+}
+
+@TechReport{Gim:appcit-r,
+  author =       "Eduardo Gim{\'e}nez",
+  title =        "Co-Inductive Types in {Coq}: An Experiment with the
+                 Alternating Bit Protocol",
+  type =         "Research report",
+  number =       "RR 95-38",
+  institution =  "Laboratoire de l'Informatique du Parall{\'e}lisme,
+                 Ecole Normale Sup{\'e}rieure de Lyon",
+  month =        jun,
+  year =         "1995",
+  url =          "ftp://ftp.ens-lyon.fr/pub/LIP/Rapports/RR/RR95/RR95-38.ps.Z",
+}
+
+@InCollection{Gim:appcit,
+  author =       "Eduardo Gim{\'e}nez",
+  title =        "An Application of Co-Inductive Types in {Coq}: An
+                 Experiment with the Alternating Bit Protocol",
+  editor =       "S. Berardi and M. Coppo",
+  booktitle =    "Selected Papers 3rd Int.\ Workshop on Types for Proofs
+                 and Programs, TYPES'95, Torino, Italy, 5--8 June 1995",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "1158",
+  pages =        "135--152",
+  publisher =    "Springer-Verlag",
+  address =      "Berlin",
+  year =         "1996",
+}
+
+@TechReport{G98,
+  author =       "Eduardo Gim{\'e}nez",
+  title =        "A Tutorial on Recursive Types in {Coq}",
+  type =         "Technical Report",
+  number =       "TR-0221",
+  institution =  "INRIA Rocquencourt",
+  month =        may,
+  year =         "1998",
+  url =          "ftp://ftp.inria.fr/INRIA/publication/RT/RT-0221.ps.gz",
+}
+
+@InCollection{CGJ:coqhw,
+  author =       "Solange Coupet-Grimal and Line Jakubiec",
+  title =        "{Coq} and Hardware Verification: {A} Case Study",
+  editor =       "J. von Wright and J. Grundy and J. Harrison",
+  booktitle =    "Proc.\ of 9th Int.\ Conf.\ on Theorem Proving in
+                 Higher Order Logics, TPHOLs'96, Turku, Finland, 26--30
+                 Aug 1996",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "1125",
+  pages =        "125--139",
+  publisher =    "Springer-Verlag",
+  address =      "Berlin",
+  year =         "1996",
+}
+
+@InCollection{Coq:patmdt,
+  author =       "Thierry Coquand",
+  title =        "Pattern Matching with Dependent Types",
+  editor =       "B. Nordstr{\"o}m and K. Pettersson and G. Plotkin",
+  booktitle =    "Informal Proc.\ of Workshop on Types for Proofs and
+                 Programs, B{\aa}stad, Sweden, 8--12 June 1992",
+  publisher =    "Dept.\ of Computing Science, Chalmers Univ.\ of
+                 Technology and G{\"o}teborg Univ.",
+  pages =        "71--84",
+  year =         "1992",
+  note =         "ftp://ftp.cs.chalmers.se/pub/cs-reports/baastad.92/proc.ps.Z",
+}
+
+@InCollection{Coq:infott,
+  author =       "Thierry Coquand",
+  title =        "Infinite Objects in Type Theory",
+  editor =       "H. Barendregt and T. Nipkow",
+  booktitle =    "Selected Papers 1st Int.\ Workshop on Types for Proofs
+                 and Programs, TYPES'93, Nijmegen, The Netherlands,
+                 24--28 May 1993",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "806",
+  pages =        "62--78",
+  publisher =    "Springer-Verlag",
+  address =      "Berlin",
+  year =         "1994",
+}
+
+@InProceedings{Argon96,
+  author =       "Pablo Arg{\'o}n and John Mullins and Olivier Roux",
+  title =        "A Correct Compiler Construction Using {Coq}",
+  editor =       "Didier Galmiche",
+  pages =        "3--12",
+  booktitle =    "Informal Proc. Workshop on Proof Search
+                 in Type-Theoretic Languages",
+  year =         "1996",
+  address =      "New Brunswick, New Jersey",
+  month =        jul,
+  keywords =     "misc",
+}
+
+@TechReport{ercim.inria.publications//RR-2536,
+  pages =        "33 p.",
+  type =         "Technical Report",
+  number =       "RR-2536",
+  institution =  "Inria, Institut National de Recherche en Informatique
+                 et en Automatique",
+  title =        "Proving Correctness of the Translation from Mini-{ML}
+                 to the {CAM} with the Coq Proof Development System",
+  bibdate =      "April 1, 1995",
+  author =       "Samuel Boutin",
+  language =     "A",
+  abstract =     "Nous d\&eacute;crivons dans ce papier comment, en
+                 utilisant le syst\&egrave;me d\&apos;aide \&agrave; la
+                 d\&eacute;monstration Coq, nous avons
+                 r\&eacute;alis\&eacute; une preuve formelle de la
+                 correction d\&apos;un compilateur d\&apos;un petit
+                 langage applicatif contenant des d\&eacute;finitions
+                 r\&eacute;cursives (Mini-ML) en code CAM (Categorical
+                 Abstract Machine). Notre objectif a \&eacute;t\&eacute;
+                 de m\&eacute;caniser une preuve
+                 pr\&eacute;sent\&eacute;e dans l\&apos;article de J.
+                 Despeyroux \&bsol;cite\&lcub;Des\&rcub; et
+                 \&eacute;crite \&agrave; l\&apos;aide du langage Typol.
+                 Nous utilisons des s\&eacute;mantiques naturelles pour
+                 mod\&eacute;liser l\&apos;\&eacute;valuation de nos
+                 langages. Nous ne sommes parvenus que partiellement
+                 \&agrave; m\&eacute;caniser cette preuve de correction.
+                 En effet, les sp\&eacute;cifications naturelles des
+                 langages source et cible contiennent des termes
+                 rationnels difficiles \&agrave; axiomatiser dans
+                 l\&apos;\&eacute;tat actuel du syst\&egrave;me. Nous
+                 proposons un d\&eacute;coupage de la preuve isolant
+                 cette difficult\&eacute;. In this report we show how we
+                 proved correctness of the translation from a small
+                 applicative language with recursive definitions
+                 (Mini-ML) to the Categorical abstract machine (CAM)
+                 using the Coq system. Our aim was to mechanize the
+                 proof of J. Despeyroux \&bsol;cite\&lcub;Des\&rcub;.
+                 Like her, we use natural semantics to axiomatise the
+                 semantics of our languages. We have only partially
+                 mecanised the proof. The semantics of the source and
+                 target languages use rational trees in their definition
+                 and at this stage the Coq system is inefficient in
+                 axiomatising such structures. We propose a presentation
+                 of the correctness proof to isolate this difficulty.",
+}
+
+@TechReport{ercim.inria.publications//RR-3488,
+  pages =        "30 p.",
+  type =         "Technical Report",
+  number =       "RR-3488",
+  institution =  "Inria, Institut National de Recherche en Informatique
+                 et en Automatique",
+  title =        "A certified Compiler for an Imperative Language",
+  bibdate =      "September 1, 1998",
+  author =       "Yves Bertot",
+  language =     "A",
+  abstract =     "Cet article d\&eacute;crit la v\&eacute;rification
+                 m\&eacute;canique de la d\&eacute;monstration de
+                 certification d\&apos;un compilateur vis-\&agrave;-vis
+                 des sp\&eacute;cifications s\&eacute;mantiques du
+                 langage source et du langage cible. Ces
+                 v\&eacute;rifications sont effectu\&eacute;es dans le
+                 formalisme de la th\&eacute;orie des types, \&agrave;
+                 l\&apos;aide du syst\&egrave;me Coq. Cette
+                 v\&eacute;rification permet d\&apos;introduire des
+                 outils th\&eacute;oriques adapt\&eacute;s:
+                 th\&eacute;or\&egrave;mes de fragmentation et principe
+                 de r\&eacute;currence g\&eacute;n\&eacute;ral. This
+                 paper describes the process of mechanically certifying
+                 a compiler with respect to the semantic specification
+                 of the source and target languages. The proofs are
+                 performed in type theory using the Coq system. These
+                 proofs introduce specific theoretical tools:
+                 fragmentation theorems and general induction
+                 principles.",
+}
+
+@Article{Terrasse:1995:ENS,
+  author =       "D. Terrasse",
+  title =        "Encoding Natural Semantics in Coq",
+  journal =      "Lecture Notes in Computer Science",
+  volume =       "936",
+  pages =        "230--??",
+  year =         "1995",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Sat May 11 13:45:32 MDT 1996",
+  acknowledgement = ack-nhfb,
+}
+
+@InProceedings{AFADL2000-Bodeveix,
+  author =       "J.-P. Bodeveix and Mamoun Filali and C. A. Munoz",
+  title =        "Formalisation de la m{\'e}thode {B} en {COQ} et {PVS}",
+  booktitle =    "AFADL'2000",
+  booktitle =    "Approches Formelles dans l'Assistance au
+                 {D}{\'e}veloppement de Logiciels",
+  year =         "2000",
+  address =      "LSR/IMAG -- BP 72 38402 Saint-Martin d'Heres Cedex --
+                 Grenoble -- France",
+  month =        jan,
+  organization = "LSR/IMAG",
+  publisher =    "LSR/IMAG",
+  local =        "yes",
+  url =          "http://www-lsr.imag.fr/afadl/Programme/ProgrammeAFADL2000.html",
+  pages =        "96--110",
+  year =         "2000",
+}
+
+@InProceedings{Cayenne,
+  key =          "Augustsson",
+  author =       "Lennart Augustsson",
+  title =        "Cayenne --- a language with dependent types",
+  booktitle =    "Proc. ACM SIGPLAN International
+                 Conf. on Functional Programming (ICFP '98)",
+  series =       "ACM SIGPLAN Notices",
+  volume =       "34(1)",
+  month =        jun,
+  year =         "1999",
+  organization = "ACM",
+  pages =        "239--250",
+  annote =       "A Haskell variant with dependent types. 27
+                 references.",
+}
+
+
+
+@Article{JAR::AndrewsBINPX1996,
+  title =        "{TPS}: {A} Theorem-Proving System for Classical Type
+                 Theory",
+  author =       "Peter B. Andrews and Matthew Bishop and Sunil Issar
+                 and Dan Nesmith and Frank Pfenning and Hongwei Xi",
+  journal =      "Journal of Automated Reasoning",
+  pages =        "321--353",
+  month =        jun,
+  year =         "1996",
+  volume =       "16",
+  number =       "3",
+}
+
+@InProceedings{XP98,
+  title =        "Eliminating Array Bound Checking through Dependent
+                 Types",
+  author =       "Hongwei Xi and Frank Pfenning",
+  booktitle =    "Proc. {ACM} {SIGPLAN}'98 Conf. on
+                 Programming Language Design and Implementation
+                 ({PLDI})",
+  address =      "Montreal, Canada",
+  month =        "17--19~" # jun,
+  year =         "1998",
+  pages =        "249--257",
+  references =   "\cite{PLDI::FreemanP1991} \cite{LOPLAS::Gupta1994}
+                 \cite{POPL::Necula1997} \cite{PLDI::NeculaL1998}
+                 \cite{PLDI::Pugh1992} \cite{JACM::Shostak1977}
+                 \cite{POPL::SusukiI1977}",
+}
+
+@InProceedings{FLINT,
+  title =        "A Type-Based Compiler for Standard {ML}",
+  author =       "Zhong Shao and Andrew W. Appel",
+  booktitle =    "Proc. {ACM} {SIGPLAN}'95 Conf. on
+                 Programming Language Design and Implementation
+                 ({PLDI})",
+  address =      "La Jolla, California",
+  month =        "18--21~" # jun,
+  year =         "1995",
+  pages =        "116--129",
+}
+
+@InProceedings{THW01, author = {Taha, Walid and Hudak, Paul and Wan,
+  Zhanyong}, title = "Directions in Functional Programming for
+  Real(-Time) Applications", booktitle = "the International Workshop
+  on Embedded Software {(EMSOFT '01)}", year = 2001, series = LNCS,
+  volume = 221, pages = "185--203", address = "Lake Tahoe", publisher =
+  "Springer-Verlag", }
+
+@InProceedings{Crary2000,
+  author =       "Karl Crary and Stephanie Weirich",
+  title =        "Resource Bound Certification.",
+  pages =        "184--198",
+  booktitle =    "the Symposium on Principles of Programming Languages
+                 ({POPL} '00)",
+  month =        jan # " ~19--21",
+  publisher =    "ACM Press",
+  address =      "N.Y.",
+  year =         "2000",
+}
+
+@InProceedings{inherit,
+  author =       "Torben Mogensen",
+  title =        "Inherited Limits",
+  booktitle =    "Partial Evaluation: Practice and Theory",
+  pages =        "189--202",
+  year =         1999,
+  volume =       1706,
+  series =       LNCS,
+  publisher =    "Springer-Verlag",
+}
+
+@Article{Shao:2002:TSC,
+  author =       "Zhong Shao and Bratin Saha and Valery Trifonov and
+                 Nikolaos Papaspyrou",
+  title =        "A type system for certified binaries",
+  journal =      "ACM SIG{\-}PLAN Notices",
+  volume =       "31",
+  number =       "1",
+  pages =        "217--232",
+  month =        jan,
+  year =         "2002",
+  coden =        "SINODQ",
+  ISSN =         "0362-1340",
+  bibdate =      "Tue Feb 12 10:39:33 MST 2002",
+  acknowledgement = ack-nhfb,
+  annote =       "Proc. 29th ACM SIGPLAN-SIGACT symposium
+                 on Principles of Programming Languages (POPL'02).",
+}
+
+@InProceedings{crary98intensional,
+  author =       "Karl Crary and Stephanie Weirich and J. Gregory
+                 Morrisett",
+  title =        "Intensional Polymorphism in Type-Erasure Semantics",
+  booktitle =    "{I}nternational {C}onference on {F}unctional
+                 {P}rogramming ({ICFP}) , Baltimore, Maryland, USA",
+  pages =        "301--312",
+  year =         "1998",
+  fullurl =      "citeseer.nj.nec.com/article/crary98intensional.html",
+}
+
+
+@InProceedings{Makholm,
+  author =       "Henning Makholm",
+  title =        "On {J}ones-Optimal Specialization
+                  for Strongly Typed Languages",
+  booktitle =    "\cite{saig00}",
+  pages =        "129--148",
+  year = 2000,
+}
+
+
+
+@Misc{MetaDOnline, key = "{Meta-D} Prototype", OPTauthor = {}, title =
+  "{M}eta-{D}: A Dependently Typed Multi-stage Language", howpublished = "Available online from
+  \fr{http://www.cse.ogi.edu/~pasalic/metad/}", year = 2002,
+  OPTnote = "", OPTannote = {} }
+
+@Unpublished{TM00,
+  author =       "Walid Taha and Henning Makholm",
+  title =        "Tag Elimination -- or --
+                  Type Specialisation is a Type-Indexed Effect",
+  note =         "In Subtyping and Dependent Types in Programming,
+                  APPSEM Workshop.  INRIA technical report",
+  OPTkey =       {},
+  year =         2000,
+  OPTannote =    {}
+}
+
+
+@InProceedings{ICFP99*233,
+  author =       "Karl Crary and Stephanie Weirich",
+  title =        "Flexible Type Analysis",
+  pages =        "233--248",
+  ISBN =         "1-58113-111-9",
+  booktitle =    "Proc. Fourth {ACM} {SIGPLAN}
+                 International Conf. on Functional Programming
+                 ({ICFP}-99)",
+  month =        sep # " ~27--29",
+  series =       "ACM Sigplan Notices",
+  volume =       "34.9",
+  publisher =    "ACM Press",
+  address =      "N.Y.",
+  year =         "1999"
+}
+
+@InProceedings{Cardelli:Linking,
+  title =        "Program Fragments, Linking, and Modularization",
+  author =       "Luca Cardelli",
+  pages =        "266--277",
+  booktitle =    "Conf. Record of {POPL}~'97: The 24th {ACM}
+                 {SIGPLAN}-{SIGACT} Symposium on Principles of
+                 Programming Languages",
+  month =        "15--17 " # jan,
+  year =         "1997",
+  address =      "Paris, France",
+  references =   "\cite{POPL::AbadiCCL1990} \cite{TOPLAS::ChambersL1995}
+                 \cite{POPL::HarperL1994} \cite{POPL::Leroy1994}
+                 \cite{POPL::MacQueen1986} \cite{POPL::ShaoA1993}",
+}
+
+@InCollection{TFF,
+  author =       "Philip Wadler",
+  title =        "Theorems for Free!",
+  booktitle =    "Proc.\ of 4th Int.\ Conf.\ on Funct.\ Prog.\ Languages
+                 and Computer Arch., FPCA'89, London, UK, 11--13 Sept.\
+                 1989",
+  pages =        "347--359",
+  publisher =    "ACM Press",
+  address =      "New York",
+  year =         "1989",
+  url =          "http://cm.bell-labs.com/cm/cs/who/wadler/papers/free/free.ps.gz",
+}
+
+@InProceedings{Abadi93,
+  author =       "Mart{\'\i}n  Abadi and Luca Cardelli and Pierre-Louis
+                  Curien",
+  title =        "Formal Parametric Polymorphism",
+  booktitle =    "Conf. Record of the Twentieth Annual ACM
+                 SIGPLAN-SIGACT Symposium on Principles of Programming
+                 Languages",
+  pages =        "157--170",
+  publisher =    "ACM New York, NY",
+  year =         "1993",
+  keywords =     "functional",
+  ISBN =         "0-89791-560-7",
+  abstract =     "A polymorphic function is parametric if its behavior
+                 does not depend on the type at which it is
+                 instantiated. Starting with J.C. Reynolds' (1983) work,
+                 the study of parametricity is typically semantic. The
+                 authors develop a syntactic approach to parametricity,
+                 and a formal system that embodies this approach: system
+                 R. Girard's system F (J.Y. Girard et al., 1989) deals
+                 with terms and types; R is an extension of F that deals
+                 also with relations between types. In R, it is possible
+                 to derive theorems about functions from their types, or
+                 'theorems for free', as P. Wadler (1989) calls them. An
+                 easy 'theorem for free' asserts that the type For all
+                 (X)X to Bool contains only constant functions; this is
+                 not provable in F. There are many harder and more
+                 substantial examples. Various metatheorems can also be
+                 obtained.",
+}
+
+@Article{DaviesPfenning01jacm,
+  author =       "Rowan Davies and Frank Pfenning",
+  title =         "A Modal Analysis of Staged Computation",
+  journal =        "Journal of the ACM",
+  year =   2001,
+  volume =       48,
+  number =       3,
+  pages =        "555--604",
+  annote =        "Preliminary version available as Technical
+           Report CMU-CS-99-153, August 1999",
+  keywords =     "fp, staged",
+  url =
+  "http://www.cs.cmu.edu/~fp/papers/CMU-CS-99-153.ps.gz"
+}
+
+@Article{MoggiSabry,
+  author = 	 "Eugenio Moggi and Amr Sabry",
+  title = 	 "Monadic Encapsulation of Effects",
+  journal = 	 "Journal of Functional Programming",
+  year = 	 {2001},
+  OPTkey = 	 {},
+  OPTvolume = 	 {},
+  OPTnumber = 	 {},
+  OPTpages = 	 {},
+  OPTmonth = 	 {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@Article{DrScheme,
+  author =       "Robert Bruce Findler and Cormac Flanagan and Matthew
+                 Flatt and Shriram Krishnamurthi and Matthias
+                 Felleisen",
+  title =        "{D}r{S}cheme: {A} Pedagogic Programming Environment
+                 for Scheme",
+  year =         "1997",
+  url =          "http://www.cs.rice.edu/CS/PLT/Publications/plilp97-fffkf.ps.gz",
+  keywords =     "Programming Environments, Scheme, Programming,
+                 Pedagogy, Algebraic Evaluation, Static Debugging,
+                 Teaching Programming to Introductory Students",
+  month =        sep,
+  pages =        "369--388",
+  volume =       "1292",
+  scope =        "Programming Environments",
+  journal =      "Programming Languages: Implementations, Logics, and
+                 Program s",
+}
+
+@Article{Garrigue99,
+  author =       "Garrigue and Remy",
+  title =        "Semi-Explicit First-Class Polymorphism for {ML}",
+  journal =      "INFCTRL: Information and Computation (formerly
+                 Information and Control)",
+  volume =       "155",
+  year =         "1999",
+}
+
+@InCollection{Wells,
+  author =       "J. B. Wells",
+  title =        "Typability and Type Checking in the Second-Order
+                 {$\lambda$}-Calculus Are Equivalent and Undecidable",
+  booktitle =    "Proc.\ of 9th Ann.\ IEEE Symp.\ on Logic in Computer
+                 Science, LICS'94, Paris, France, 4--7 July 1994",
+  pages =        "176--185",
+  publisher =    "IEEE Computer Society Press",
+  address =      "Los Alamitos, CA",
+  year =         "1994",
+}
+
+@InProceedings{OPT02,
+  author =       "Karol Ostrovsk\'y and K.~V.~S.~Prasad and Walid Taha",
+  title =        {Towards a Primitive Higher Order Calculus of Broadcasting Systems},
+  booktitle =    {The International Conf. on 
+                 Principles and Practice of 
+                 Declarative Programming ({PPDP} '02)},
+  year =         {2002},
+  address =      {Pittsburgh, USA},
+  month =        {October},
+  organization = {ACM},
+}
+
+@InProceedings{TemplateHaskell,
+  author =       "Tim Sheard and Simon Peyton-Jones",
+  title =        "Template meta-programming for Haskell.",
+  booktitle =    "Proc. of the workshop on Haskell",
+  pages =        "1--16",
+  publisher =    "ACM",
+  year =         "2002",
+  keywords =     "workshop, functional programming, FP, zz1002",
+  abstract =     "...extension to the purely functional programming
+                 language Haskell that supports compile-time
+                 meta-programming. The purpose of the system is to
+                 support the algorithmic construction of programs at
+                 compile-time. The ability to generate code at compile
+                 time allows the programmer to implement such features
+                 as polytypic programs, macro-like expansion, user
+                 directed optimization (such as inlining), and the
+                 generation of supporting data structures and functions
+                 from existing data structures and functions. Our design
+                 is being implemented in the Glasgow Haskell Compiler,
+                 ghc. [http://doi.acm.org/10.1145/581690.581691
+                 (paper)][10/'02]
+                 http://www.amazon.com/exec/obidos/ISBN=1581136056/fourwheeldriveinA/
+                 .",
+}
+
+@InProceedings{Michaylov,
+  author =       "Spiro Michaylov and Frank Pfenning",
+  title =        "Natural Semantics and Some of its Meta-Theory in
+                 {Elf}",
+  booktitle =    "Extensions of Logic Programming",
+  editor =       "Lars Halln{\"a}s",
+  publisher =    "Springer-Verlag LNCS",
+  year =         "1992",
+  note =         "To appear. A preliminary version is available as
+                 Technical Report MPI-I-91-211, Max-Planck-Institute for
+                 Computer Science, Saarbr{\"u}cken, Germany, August
+                 1991",
+}
+
+@InProceedings{Filinski99,
+  author =       "Andrzej Filinski",
+  title =        "A Semantic Account of Type-Directed Partial Evaluation",
+  year         = 1999,
+  volume       = 1702,
+  series       = LNCS,
+  publisher =    "Springer-Verlag",
+  booktitle    = {Principles and Practice of Declarative Programming
+                  {(PPDP)}},
+  pages        = "378--395",
+}
+
+@InProceedings{Filinski01,
+  author =       "Andrzej Filinski",
+  title =        "Normalization by Evaluation for the Computational Lambda-Calculus",
+  year         = 2001,
+  volume       = 2044,
+  series       = LNCS,
+  publisher =    "Springer-Verlag",
+  booktitle    = {Typed Lambda Calculi and Applications: 5th International Confe
+rence
+                  {(TLCA)}},
+  pages        = "151--165",
+}
+@InProceedings{MML,
+  author = 	 {Eugenio Moggi},
+  title = 	 {A Monadic Multi-stage Metalanguage},
+  booktitle = 	 {Foundations of Software Science and Computation Structures (FOSSACS)},
+  OPTcrossref =  {},
+  OPTkey = 	 {},
+  OPTpages = 	 {},
+  year = 	 {2003},
+  OPTeditor = 	 {},
+  volume = 	 {2620},
+  OPTnumber = 	 {LNCS},
+  series = 	 {},
+  OPTaddress = 	 {},
+  OPTmonth = 	 {},
+  OPTorganization = {},
+  OPTpublisher = {},
+  OPTnote = 	 {},
+  OPTannote = 	 {}
+}
+
+@InProceedings{LJB01,
+  AUTHOR       = {Lee, Chin Soon and Jones, Neil D. and Ben-Amram, Amir M.},
+  YEAR         = {2001},
+  TITLE        = {The Size-Change Principle for Program Termination},
+  BOOKTITLE    = POPL,
+  editor       = {},
+  publisher    = {ACM press},
+  organization = {},
+  address      = {},
+  series       = {},
+  volume       = {28},
+  pages        = {81--92},
+  month        = {january},
+  keywords     = {termination, program analysis, lexical order, pspace
+hardness},
+  summary = {The ``size-change termination''  principle for a first-order
+functional language with well-founded data is: a program terminates on all
+inputs if {\em every infinite call sequence} (following program control flow)
+would cause an  infinite descent in some data values.
+Size-change analysis is based only on local
+approximations to parameter size changes derivable from program syntax.
+The set of infinite call sequences that follow program flow and can be
+recognized as causing infinite descent is an
+$\omega$-regular set, representable by a B\"uchi automaton.
+Algorithms for such automata can be used to decide size-change termination.
+We also give a direct algorithm operating on ``size-change graphs''
+(without the
+passage to automata).
+Compared to other results in the literature, termination analysis
+based on the size-change principle is surprisingly simple and general:
+lexical orders (also called lexicographic orders), indirect function
+calls and permuted arguments (descent that is not {\em in-situ}) are
+all handled {\em automatically and without special treatment}, with no
+need for manually supplied argument orders, or theorem-proving methods
+not certain to terminate at analysis time.
+We establish the  problem's
+{\em intrinsic complexity}. This turns out to be surprisingly high,
+complete for {\sc pspace}, in spite of the simplicity of the principle.
+{\sc pspace} hardness is proved by a reduction from Boolean program
+termination. An interesting consequence: the same hardness result applies
+to many other analyses found in the termination and quasi-termination
+literature.},
+  SEMNO        = {D-429},
+  PUF          = {Artikel i proceedings (med censur)},
+  ID           = {KonR},
+  POSTSCRIPT   = {http://www.diku.dk/~neil/term.ps}
+ }
+
+@InProceedings{CBUE02,
+  author =       "Krzysztof Czarnecki and Thomas Bednasch and Peter
+                 Unger and Ulrich Eisenecker",
+  year =         "2002",
+  title =        "Generative Programming for Embedded Software: An
+                 Industrial Experience Report",
+  booktitle =    "Generative Programming and Component Engineer
+                 SIGPLAN/SIGSOFT Conf., GPCE 2002",
+  editor =       "Don Batory and Charles Consel and Walid Taha",
+  publisher =    "Springer",
+  organization = "ACM",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "2487",
+  pages =        "156--172",
+  month =        oct,
+}
+
+@InProceedings{L02,
+  author =       "Chin Soon Lee",
+  year =         "2002",
+  title =        "Program termination analysis in polynomial time",
+  booktitle =    "Generative Programming and Component Engineering: ACM
+                 SIGPLAN/SIGSOFT Conf., GPCE 2002",
+  editor =       "Don Batory and Charles Consel and Walid Taha",
+  publisher =    "Springer",
+  organization = "ACM",
+  series =       "Lecture Notes in Computer Science",
+  volume =       "2487",
+  pages =        "218--235",
+  month =        oct,
+  keywords =     "program termination analysis, size-change
+                 termination",
+  summary =      "Recall the {"}size-change principle{"} for program
+                 termination: An infinite computation is impossible, if
+                 it would give rise to an infinite sequence of size
+                 decreases for some data values. For an actual analysis,
+                 {"}size-change graphs{"} are used to capture data size
+                 changes in possible program state transitions. A graph
+                 sequence that respects program control flow is called a
+                 {"}multipath.{"} Multipaths describe possible state
+                 transition sequences. To show that such sequences are
+                 finite, it is sufficient that the graphs satisfy
+                 {"}size-change termination{"} (SCT): Every infinite
+                 multipath has infinite descent, according to the arcs
+                 of the graphs. This is an application of the
+                 size-change principle. SCT is decidable, but complete
+                 for PSPACE. In this paper, we explore efficient
+                 approximations that are sufficiently precise in
+                 practice. For size-change graphs that can loop (i.e.,
+                 they give rise to an infinite multipath), and that
+                 satisfy SCT, it is usually easy to identify among them
+                 an {"}anchor{"}-- some graph whose infinite occurrence
+                 in a multipath causes infinite descent. The SCT
+                 approximations are based on finding and eliminating
+                 anchors as far as possible. If the remaining graphs
+                 cannot loop, then SCT is established. An efficient
+                 method is proposed to find anchors among {"}fan-in
+                 free{"} graphs, as such graphs occur commonly in
+                 practice. This leads to a worst-case quadratic-time
+                 approximation of SCT. An extension of the method
+                 handles general graphs and can detect some rather
+                 subtle descent. It leads to a worst-case cubic-time
+                 approximation of SCT. Experiments confirm the
+                 effectiveness and efficiency of the approximations in
+                 practice.",
+  semno =        "D-472",
+  puf =          "Artikel i proceedings (med censur)",
+  id =           "KonR",
+}
+@InProceedings{satnam,
+  author =       "Nicholas McKay and Satnam Singh",
+  title =        "Dynamic Specialization of {XC6200} {FPGA}s by Partial
+                 Evaluation",
+  editor =       "Reiner W. Hartenstein and Andres Keevallik",
+  series =       LNCS,
+  volume =       1482,
+  publisher =    "Springer-Verlag",
+  booktitle =    "International Workshop on
+                 Field-Programmable Logic and Applications",
+  year =         "1998",
+  pages =        "298--307",
+}
+
+@Article{transmeta,
+  author =       "Linda Geppert and Tekla S. Perry",
+  journal =      "IEEE Spectrum",
+  number =       "5",
+  pages =        "26--33",
+  title =        "Transmeta's magic show",
+  volume =       "37",
+  year =         "1999",
+  crindex =      "Fichier",
+  url =          "http://www.spectrum.ieee.org/spectrum/may00/features/tran.html",
+}
+
+@InProceedings{DML,
+  author =       "Hongwei Xi and Frank Pfenning",
+  title =        "Dependent types in practical programming",
+  editor =       "{ACM}",
+  booktitle =    "{POPL} '99. Proc. 26th {ACM}
+                 {SIGPLAN-SIGACT} on Principles of programming
+                 languages, January 20--22, 1999, San Antonio, {TX}",
+  publisher =    "ACM Press",
+  address =      "New York, NY, USA",
+  year =         "1999",
+  ISBN =         "????",
+  series =       "ACM SIG{\-}PLAN Notices",
+  pages =        "214--227",
+  year =         "1999",
+  bibdate =      "Mon May 3 12:58:58 MDT 1999",
+  url =          "http://www.acm.org:80/pubs/citations/proceedings/plan/292540/p214-xi/",
+  acknowledgement = ack-nhfb,
+  subject =      "{\bf F.4.1} Theory of Computation, MATHEMATICAL LOGIC
+                 AND FORMAL LANGUAGES, Mathematical Logic. {\bf D.3.2}
+                 Software, PROGRAMMING LANGUAGES, Language
+                 Classifications, ML. {\bf D.1.1} Software, PROGRAMMING
+                 TECHNIQUES, Applicative (Functional) Programming. {\bf
+                 D.3.3} Software, PROGRAMMING LANGUAGES, Language
+                 Constructs and Features, Polymorphism.",
+}
+@Article{lava,
+  author =       "Per Bjesse and Koen Claessen and Mary Sheeran and
+                 Satnam Singh",
+  title =        "{Lava}: Hardware Design in {Haskell}",
+  journal =      "ACM SIG{\-}PLAN Notices",
+  volume =       "34",
+  number =       "1",
+  pages =        "174--184",
+  month =        jan,
+  year =         "1999",
+  coden =        "SINODQ",
+  ISSN =         "0362-1340",
+  bibdate =      "Wed Dec 30 14:35:17 1998",
+  acknowledgement = ack-nhfb,
+  affiliation =  "Chalmers University; Xilinx",
+}
+
+@InProceedings{aliastypes,
+  author =       "Frederick Smith and David Walker and Greg Morrisett",
+  title =        "Alias Types",
+  editor =       "Gert Smolka",
+  booktitle =    "Ninth European Symposium on Programming",
+  publisher =    "Springer-Verlag",
+  series =       "Lecture Notes in Computer Science",
+  month =        apr,
+  volume =       "1782",
+  year =         "2000",
+  pages =        "366--381",
+}
+
+@Article{Hume,
+  author =       "Kevin Hammond",
+  title =        "The Dynamic Properties of {Hume}: {A}
+                 Functionally-Based Concurrent Language with Bounded
+                 Time and Space Behaviour",
+  journal =      "Lecture Notes in Computer Science",
+  volume =       "2011",
+  pages =        "122--??",
+  year =         "2001",
+  coden =        "LNCSD9",
+  ISSN =         "0302-9743",
+  bibdate =      "Sat Feb 2 13:03:29 MST 2002",
+  url =          "http://link.springer-ny.com/link/service/series/0558/bibs/2011/20110122.htm;
+                 http://link.springer-ny.com/link/service/series/0558/papers/2011/20110122.pdf",
+  acknowledgement = ack-nhfb,
+}
+
+@InProceedings{TN03,
+  author =       "Walid Taha and Michael Florentin Nielsen",
+  title =        "Environment Classifiers",
+  booktitle =    "In Proc. ACM Symposium on Principles of
+                  Programming Languages {(POPL '03)}",
+  year =         2003,
+  address =      "New Orleans"
+}
+
+
+ papers/ivor/code.tex view
@@ -0,0 +1,31 @@+\section{Haskell Code}++This appendix contains some of the more important definitions from the+logic theorem prover and functional language implementation. The+complete code for both examples is available from+\url{http://www.dcs.st-and.ac.uk/~eb/Ivor}; the code presented here+illustrates the building of complex tactics with \Ivor{}.++\subsection{Propositional Logic}++Two domain specific tactics are needed; firstly +Secondly, we need a tactic to prove a contradiction as discussed in+section \ref{example1}:++\begin{verbatim}+> contradiction :: String -> String -> Tactic+> contradiction x y = claim (name "false") "False" >+>+>                     induction "false" >+>+>                     (try (fill $ x ++ " " ++ y)+>                           idTac+>                           (fill $ y ++ " " ++ x))+\end{verbatim}++\subsection{\Funl{}}++\label{funlapp}++When building a function definition, we prove a \hdecl{theorem} of the+appropriate type. Then the \hdecl{buildTerm} tactic traverses the+structure of the raw term, constructing a proof of the+theorem. 
+ papers/ivor/conclusions.tex view
@@ -0,0 +1,122 @@+\section{Related Work}++The ability to extend a theorem prover with user defined tactics has+its roots in Robin Milner's LCF~\cite{lcf-milner}. This introduced the+programming language ML to allow users to write tactics; we follow the+LCF approach in exposing the tactic engine as an API. +%However, unlike+%other systems, we have not treated the theorem prover as an end in+%itself, but intend to expose the technology to any Haskell application+%which may need it.  +The implementation of \Ivor{} is based on the+presentation of \Oleg{} in Conor McBride's+thesis~\cite{mcbride-thesis}. We use implementation+techniques from \cite{not-a-number} for dealing with variables and+renaming.++The core language of \Epigram{}~\cite{view-left,epireloaded} is+similar to $\source$, with extensions for observational+equality. \Epigram{} is a dependently typed functional programming+language, where types can be predicated on arbitrary values so that+types can be read as precise specifications.+Another recent language which shares the aim of begin theorem proving+technology closer to programers is Sheard's+$\Omega$mega~\cite{sheard-langfuture}. While \Ivor{} emphasises+interactive theorem proving, $\Omega$mega emphasises programming but+nevertheless allows more precise types to be given to programs through+Generalised Algebraic Data Types~\cite{gadts} and extensible+kinds. ++Other theorem provers such as \Coq{}~\cite{coq-manual},+\Agda{}~\cite{agda} and Isabelle~\cite{isabelle} have varying degrees+of extensibility. +%The interface design largely follows that of+%\Coq{}. +\Coq{} includes a high level domain specific language for+combining tactics and creating new tactics, along the lines of the+tactic combinators presented in section \ref{combinators}. This+language is ideal for many purposes, such as our \hdecl{contradiction}+tactic, but more complex examples such as \hdecl{buildTerm} would+require extending \Coq{} itself. Using a+DSEL~\cite{hudak-edsl} as provided by \Ivor{} gives complete+flexibility in the construction of tactics, and allows a close+relationship between the tactics and the structures on which they+operate (e.g. \hdecl{Raw}). +%In future, it may+%be worth exploring automatic translation between \Ivor{} and other+%theorem provers.++Isabelle~\cite{isabelle} is a+generic theorem prover, in that it includes a large body of object+logics and a meta-language for defining new logics. It includes a+typed, extensible tactic language, and can be called from ML programs,+but unlike \Ivor{} is not based on a dependent type theory.+There is therefore no \remph{proof term} associated with an Isabelle+proof --- the proof term gives a derivation tree for the+proof, allowing easy and independent rechecking without referring to+the tactics used to build the proof. ++The implementation of \Funl{} allows a theorem prover to be attached+to the language in a straightforward way, using \Ivor{}'s tactics+directly. This would be a possible method of attaching a theorem+prover to a more full featured programming language such as the+Sparkle~\cite{sparkle} prover for Clean~\cite{clean}. Implementing a+full language in this way would require some extra work to deal+with general recursion and partial definitions (in particular, dealing+with $\perp$ as a possible value), but the general method remains the same.++\section{Conclusions and Further Work}++We have seen an overview of the \Ivor{} library, including the term+and tactic language. By exposing the tactic API and+providing an interface for term construction and evaluation, we are+able to embed theorem proving technology in a Haskell+application. This in itself is not a new idea, having first been seen+as far back as the LCF~\cite{lcf-milner} prover --- however, the+theorem proving technology is not an end in itself, but a+mechanism for constructing domain specific tools such as the+propositional logic theorem prover in section \ref{example1} and the+programming language with built in equational reasoning support in+section \ref{example2}.++The library includes several features we have not been able to discuss+here, e.g. dependently typed pattern matching~\cite{coquand-pm}, which+gives a better notation for \remph{programming} as well as proof.+There is experimental support for multi-stage programming with+dependent types, exploited in~\cite{dtpmsp-gpce}.  The term language+can be extended with primitive types and operations, e.g. integers and+strings with associated arithmetic and string manipulation+operators. Such features would be essential in a representation of a+real programming language. In this paper, we have stated that+$\source$ is strongly normalising, with no general recursion allowed,+but again in the representation of a real programming language general+recursion may be desirable --- however, this means that correctness+proofs can no longer be total. The library can optionally allow+general recursive definitions, but such definitions cannot be reduced+by the typechecker. Finally, a command driven interface is available,+which can be accessed as a Haskell API or used from a command line+driver program, and allows user directed proof scripts in the style of+other proof assistants. These and other features are fully documented+on the web+site\footnote{\url{http://www.cs.st-andrews.ac.uk/~eb/Ivor/}}.++%% \subsection{Further Work}++Development of the library has been driven by the requirements of+our research into Hume~\cite{Hume-GPCE}, a resource aware functional+language. We are investigating the use of dependent types in+representing and verifying resource bounded functional+programs~\cite{dt-framework}. +For this, automatic generation of+injectivity and disjointness lemmas for constructors will be+essential~\cite{concon}.+Future versions will include+optimisations from \cite{brady-thesis} and some support for compiling+$\source$ terms; this would not only improve the efficiency of the+library (and in particular its use for evaluating certified code)+but also facilitate the use of \Ivor{} in a real language+implementation. Finally, an implementation of coinductive+types~\cite{coinductive} is likely to be very useful; currently it can+be achieved by implementing recursive functions which do not reduce at+the type level, but a complete implementation with criteria for+checking productivity would be valuable for modelling streams in Hume.
+ papers/ivor/corett.tex view
@@ -0,0 +1,330 @@+\section{The Type Theory, $\source$}++\renewcommand{\Vnil}{\DC{vnil}}+\renewcommand{\Vcons}{\DC{vcons}}++\subsection{The Core Calculus}++\label{corett}++The core type theory of \Ivor{} is a strongly normalising dependently+typed $\lambda$-calculus with inductive families~\cite{dybjer94},+similar to Luo's UTT~\cite{luo94}, the Calculus of Inductive+Constructions in \Coq{}~\cite{coq-manual}, or \Epigram{}'s+ETT~\cite{epireloaded}.  This language, which I call+$\source$~\cite{brady-thesis}, is an enriched lambda calculus, with+the usual reduction rules, and properties of subject reduction, Church+Rosser, and uniqueness of types up to conversion. +More details on programming in $\source$ are given+in~\cite{brady-thesis,dt-framework}.+The strong+normalisation property (i.e. that evaluation always terminates) is+guaranteed by allowing only primitive recursion over strictly positive+inductive datatypes. The syntax of terms ($\vt$) and binders ($\vb$)+in this language is:++\DM{+\begin{array}{rll@{\hg}|rll}+\vt ::= & \Type_i & (\mbox{type universes}) &+\hg\vb ::= & \lam{\vx}{\vt} & (\mbox{abstraction}) \\++ \mid  & \vx & (\mbox{variable}) &+ \mid & \LET\:\vx\defq\vt\Hab\vt & (\mbox{let binding}) \\++ \mid   & \vb\SC\:\vt & (\mbox{binding}) &+ \mid & \all{\vx}{\vt} & (\mbox{function space}) \\++ \mid   & \vt\:\vt & (\mbox{application})++\end{array}+}++We may also write the function space+\mbox{$\all{\vx}{\vS}\SC\vT$} as \mbox{$\fbind{\vx}{\vS}{\vT}$}, or+abbreviate it to \mbox{$\vS\to\vT$} if $\vx$ is not free in+$\vT$. This is both for readability and a notation more consistent+with traditional functional programming languages.+Universe levels on types (e.g. $\Type_0$ for values, $\Type_1$ for+types, etc.) may be inferred as in~\cite{implicit-pollack}.+Contexts ($\Gamma$) are collections of binders.++%% defined inductively; the empty context+%% is valid, as is a context extended with a $\lambda$, $\forall$ or+%% $\LET$ binding:++%% \DM{+%% \Axiom{\proves\RW{valid}}+%% \hg+%% \Rule{\Gamma\proves\RW{valid}}+%% {\Gamma;\vb\proves\RW{valid}}+%% }++The typing rules, given below, depend on a conversion+relation \mbox{$\Gamma\proves\vx\conv\vy$}, which holds if and only if+$\vx$ and $\vy$ have a common reduct. This requires the typechecker to+normalise terms, to find the common reduct, so it is+important for decidability of typechecking that the language is+strongly normalising.++\DM{\begin{array}{c}+\Rule{\Gamma\proves\RW{valid}}+{\Gamma\vdash\Type_n\Hab\Type_{n+1}}\hspace*{0.1in}\mathsf{Type}+\\+\Rule{(\lam{\vx}{\vS})\in\Gamma}+{\Gamma\vdash\vx\Hab\vS}\hspace*{0.1in}\mathsf{Var}_1+\hg+\Rule{(\all{\vx}{\vS})\in\Gamma}+{\Gamma\vdash\vx\Hab\vS}\hspace*{0.1in}\mathsf{Var}_2+\hg+\Rule{(\LET\:\vx\Hab\vS\defq\vs)\in\Gamma}+{\Gamma\vdash\vx\Hab\vS}\hspace*{0.1in}\mathsf{Val}+\\+\Rule{\Gamma\vdash\vf\Hab\fbind{\vx}{\vS}{\vT}\hg\Gamma\vdash\vs\Hab\vS}+{\Gamma\vdash\vf\:\vs\Hab\vT[\vs/\vx]} % \LET\:\vx\Hab\vS\:\defq\:\vs\:\IN\:\vT}+\hspace*{0.1in}\mathsf{App}+\\++\Rule{\Gamma;\lam{\vx}{\vS}\vdash\ve\Hab\vT\hg\Gamma\proves\fbind{\vx}{\vS}{\vT}\Hab\Type_n}+{\Gamma\vdash\lam{\vx}{\vS}.\ve\Hab\fbind{\vx}{\vS}{\vT}}\hspace*{0.1in}\mathsf{Lam}+\\+\Rule{\Gamma;\all{\vx}{\vS}\vdash\vT\Hab\Type_n\hg\Gamma\vdash\vS\Hab\Type_n}+{\Gamma\vdash\fbind{\vx}{\vS}{\vT}\Hab\Type_n}\hspace*{0.1in}\mathsf{Forall}+\\++\Rule{\begin{array}{c}\Gamma\proves\ve_1\Hab\vS\hg+      \Gamma;\LET\:\vx\defq\ve_1\Hab\vS\proves\ve_2\Hab\vT\\+      \Gamma\proves\vS\Hab\Type_n\hg+      \Gamma;\LET\:\vx\defq\ve_1\Hab\vS\proves\vT\Hab\Type_n\end{array}+      }+{\Gamma\vdash\LET\:\vx\defq\ve_1\Hab\vS\SC\:\ve_2\Hab+   \vT[\ve_1/\vx]}   +%\Let\:\vx\Hab\vS\defq\ve_1\:\IN\:\vT}+\hspace*{0.1in}\mathsf{Let}+\\++\Rule{\Gamma\proves\vx\Hab\vA\hg\Gamma\proves\vA'\Hab\Type_n\hg+      \Gamma\proves\vA\converts\vA'}+     {\Gamma\proves\vx\Hab\vA'}+\hspace*{0.1in}\mathsf{Conv}+\end{array}+}+%{Typing rules for $\source$}+%{typerules}++\subsection{Inductive Families}++\label{indfamilies}++Inductive families \cite{dybjer94} are a form of simultaneously+defined collection of algebraic data types (such as Haskell+\texttt{data} declarations) which can be parametrised over+\remph{values} as well as types.  An inductive family is declared +in a similar style to a Haskell GADT declaration~\cite{gadts}+as+follows, using the de Bruijn telescope notation, $\tx$, to indicate a+sequence of zero or more $\vx$:++\DM{+\AR{+\Data\:\TC{T}\:(\tx\Hab\ttt)\Hab\vt\hg\Where\hg+\DC{c}_1\Hab\vt\:\mid\:\ldots\:\mid\:\DC{c}_n\Hab\vt+}+}++Constructors may take recursive arguments in the family+$\TC{T}$. Furthermore these arguments may be indexed by another type,+as long it does not involve $\TC{T}$ --- this restriction is known as+\demph{strict positivity} and ensures that recursive arguments of a+constructor are structurally smaller than the value itself.++The Peano style natural numbers can be declared as follows:++\DM{+\Data\:\Nat\Hab\Type\hg\Where\hg\Z\Hab\Nat\:\mid\:\suc\Hab\fbind{\vk}{\Nat}{\Nat}+}++A data type may have zero or more parameters (which are invariant+across a structure) and a number of indices, given by the type. For+example, a list is parametrised over its element type:++\DM{+\AR{+\Data\:\List\:(\vA\Hab\Type)\Hab\Type\hg\Where+\ARd{+& \nil\Hab\List\:\vA\\+\mid & \cons\Hab\fbind{\vx}{\vA}{\fbind{\vxs}{\List\:\vA}{\List\:\vA}}+}+}+}++Types can be+parametrised over values. Using this, we can declare the type of+vectors (lists with length), where the empty list is statically known+to have length zero, and the non empty list is statically known to+have a non zero length. $\Vect$ is parametrised over its element type,+like $\List$, but \remph{indexed} over its length.++\DM{+\AR{+\Data\:\Vect\:(\vA\Hab\Type)\Hab\Nat\to\Type\hg\Where \\+\hg\hg\ARd{+& \Vnil\Hab\Vect\:\vA\:\Z\\+\mid & \Vcons\Hab\fbind{\vk}{\Nat}{+\fbind{\vx}{\vA}{\fbind{\vxs}{\Vect\:\vA\:\vk}{\Vect\:\vA\:(\suc\:\vk)}}+}+}+}+}++\subsection{Elimination Rules}++\label{elimops}++When we declare an inductive family $\dD$, we give the constructors+which explain how to build objects in that family.+\Ivor{} generates from this an \demph{elimination operator} $\delim$ and corresponding+reductions, which implements the reduction and recursion+behaviour of terms in the family --- it is a fold+operator.  The method for constructing elimination operators+automatically is well documented, in particular+by~\cite{dybjer94,luo94,mcbride-thesis}.  For $\Vect$, \Ivor{} generates the+following operator:++\DM{+\AR{+\begin{array}{ll}+\vectelim\Hab & \fbind{\vA}{\Type}{\fbind{\vn}{\Nat}{+                \fbind{\vv}{\Vect\:\vA\:\vn}{}}} \\+              & \fbind{\motive}{+  \fbind{\vn}{\Nat}{\fbind{\vv}{\Vect\:\vA\:\vn}{\Type}}}{} +   \\+              & \fbind{\meth{\Vnil}}{\motive\:\Z\:(\Vnil\:\vA)}{} \\+              & (\meth{\Vcons}\Hab+  \AR{+  \fbind{\vk}{\Nat}{\fbind{\vx}{\vA}{\fbind{\vxs}{\Vect\:\vA\:\vk}{}}} \\+  \fbind{\VV{ih}}{\motive\:\vk\:\vxs}{\motive\:(\suc\:\vk)\:+        (\Vcons\:\vA\:\vk\:\vx\:\vxs)})\to} \\+              & \motive\:\vn\:\vv +\end{array}+\\+\PA{\A\A\A\A\A\A}{+& \vectelim & \vA & \Z & (\Vnil\:\vA) & \motive & \meth{\Vnil} & \meth{\Vcons} &+      \IRet{\meth{\Vnil}} \\+& \vectelim & \vA & (\suc\:\vk) & (\Vcons\:\vA\:\vk\:\vx\:\vxs) & \motive &+      \meth{\Vnil} & \meth{\Vcons} & \\+& & & \IMRet{6}{\meth{\Vcons}\:\vk\:\vx\:\vxs\:(\vectelim\:\vA\:\vk\:\vxs\:\motive\:\meth{\Vnil}\:\meth{\Vcons})} \\+}+}+}++The arguments are the \demph{parameters}+and \demph{indices} ($\vA$ and $\vn$ here), the \demph{target} (the+object being eliminated; $\vv$ here), the \demph{motive} (a function+which computes the return type of the elimination; $\vP$ here) and the+\demph{methods} (which describe how to achieve the motive for each+constructor form).  Note the distinction between parameters and+indices --- the parameter $\vA$ is invariant across the structure so+is not passed to the methods as an argument, but $\vn$ does vary, so+is passed. A more detailed explanation of this distinction can be+found in~\cite{luo94,brady-thesis}.+A case analysis operator $\dcase$, is obtained similarly, but without+the induction hypotheses.++%These operators are the only means to+%analyse a data structure and the only operators which can make+%recursive calls. This, along with the restriction that data types must+%be strictly positive, ensures that evaluation always terminates.++\subsection{The Development Calculus}++\label{sec:devcalc}++For developing terms interactively, the type theory needs to support+\remph{incomplete} terms, and a method for term construction. We+extend $\source$ with the concept of \demph{holes}, which stand for+the parts of constructions which have not yet been instantiated; this+largely follows McBride's \Oleg{} development+calculus~\cite{mcbride-thesis}.++The basic idea is to extend the syntax for binders with a \remph{hole}+binding and a \remph{guess} binding. The \remph{guess} binding is+similar to a $\LET$ binding, but without any computational force,+i.e. the bound names do not reduce:++\DM{+\vb ::= \ldots + \:\mid\: \hole{\vx}{\vt} \:\:(\mbox{hole binding}) \:\:+ \:\mid\: \guess{\vx}{\vt}{\vt} \:\:(\mbox{guess})+}++Using binders to represent holes as discussed in~\cite{mcbride-thesis}+is useful in a dependently typed setting since one value may determine+another. Attaching a ``guess'' to a binder ensures that instantiating one+such value also instantiates all of its dependencies. The typing rules for+binders ensure that no $?$ bindings leak into types, and are given+below.++\DM{+\AR{+\Rule{+\Gamma;\hole{\vx}{\vS}\proves\ve\Hab\vT+}+{+\Gamma\proves\hole{\vx}{\vS}\SC\ve\Hab\vT+}+\hspace*{0.1cm}\vx\not\in\vT+\hspace*{0.1in}\mathsf{Hole}+\hg+\Rule{+\Gamma;\guess{\vx}{\vS}{\ve_1}\proves\ve_2\Hab\vT+}+{+\Gamma\proves\guess{\vx}{\vS}{\ve_1}\SC\ve_2\Hab\vT+}+\hspace*{0.1cm}\vx\not\in\vT+\hspace*{0.1in}\mathsf{Guess}++}+}+%{Typing rules for $\source$ holes}+%{typerulesholes}++%% \subsection{Hole Manipulation}++%% \label{holeops}++%% Construction of terms through the \Ivor{} library relies on four basic+%% operations on holes: \demph{claim}, which introduces a new hole of a+%% given type; \demph{fill}, which attaches a guess to a hole;+%% \demph{abandon}, which removes a guess from a hole; and \demph{solve}+%% which finalises a guess by converting it to a $\LET$ binding,+%% providing that the guess is \remph{pure}, i.e. does not contain any+%% hole bindings or guesses.++%% \DM{+%% \begin{array}{l@{\hg}l}+%% \mbox{Claim} & +%% \Rule{\Gamma\proves\ve\Hab\vT\hg+%% \Gamma\proves\vS\Hab\Type+%% }+%% {\Gamma\proves\hole{\vx}{\vS}\SC\ve\Hab\vT+%% }+%% \\+%% \mbox{Fill} & +%% \Rule{\Gamma\proves\hole{\vx}{\vS}\SC\ve\Hab\vT\hg+%% \Gamma\proves\vv\Hab\vS}+%% {\Gamma\proves\guess{\vx}{\vS}{\vv}\SC\ve\Hab\vT}+%% \\+%% \mbox{Abandon} &+%% \Rule{\Gamma\proves\guess{\vx}{\vS}{\vv}\SC\ve\Hab\vT}+%% {\Gamma\proves\hole{\vx}{\vS}\SC\ve\Hab\vT}+%% \\+%% \mbox{Solve} &+%% \Rule{\Gamma\proves\guess{\vx}{\vS}{\vv}\SC\ve\Hab\vT}+%% {\Gamma\proves\LET\:\vx\Hab\vS\defq\:\vv\SC\ve\Hab\vT}+%% \hspace*{0.1cm}\vv\:\mbox{pure}++%% \end{array}+%% }++
+ papers/ivor/dtp.bib view
@@ -0,0 +1,151 @@+@phdthesis{ brady-thesis,+    author = {Edwin Brady},+    title = {Practical Implementation of a Dependently Typed Functional Programming Language},+    year = 2005,+    school = {University of Durham}+}++@article{view-left,+   journal = {Journal of Functional Programming},+   number = {1},+   volume = {14},+   title = {The View From The Left},+   year = {2004},+   author = {Conor McBride and James McKinna},+   pages = {69--111}+}++@misc{epigram-afp,+    author = {Conor McBride},+    title = {Epigram: Practical Programming with Dependent Types},+    year = {2004},+    howpublished = {Lecture Notes, International Summer School on Advanced Functional Programming}+}++@misc{coq-manual,+   howpublished = {\verb+http://coq.inria.fr/+},+   title = {The {Coq} Proof Assistant --- Reference Manual},+   year = {2004},+   author = {{Coq Development Team}}+}++@inproceedings{extraction-coq,+   title = {A New Extraction for {Coq}},+   year = {2002},+   booktitle = {Types for proofs and programs},+   editor = {Herman Geuvers and Freek Wiedijk},+   publisher = {Springer},+   author = {Pierre Letouzey},+   series = {LNCS}+}++@techreport{lego-manual,+   title = {\textsc{Lego} Proof Development System: User's Manual},+   year = {1992},+   institution = {Department of Computer Science, University of Edinburgh},+   author = {Zhaohui Luo and Robert Pollack}+}++@book{luo94,+   title = {Computation and Reasoning -- A Type Theory for Computer Science},+   year = {1994},+   publisher = {OUP},+   author = {Zhaohui Luo},+   series = {International Series of Monographs on Computer Science}+}++@phdthesis{goguen-thesis,+   school = {University of Edinburgh},+   title = {A Typed Operational Semantics for Type Theory},+   year = {1994},+   author = {Healfdene Goguen}+}++@phdthesis{mcbride-thesis,+   month = {May},+   school = {University of Edinburgh},+   title = {Dependently Typed Functional Programs and their         proofs},+   year = {2000},+   author = {Conor McBride}+}++@misc{mckinnabrady-phase,+   title = {Phase Distinctions in the Compilation of {Epigram}},+   year = 2005,+   author = {James McKinna and Edwin Brady},+   note = {Draft}+}++@article{pugh-omega,+   title =  "The {Omega} {Test}: a fast and practical integer programming algorithm for dependence analysis", +   author = "William Pugh", +   journal = "Communication of the ACM", +   year = 1992, +   pages = {102--114}+}++@Article{RegionTypes,+  refkey =       "C1753",+  title =        "Region-Based Memory Management",+  author =       "M. Tofte and J.-P. Talpin",+  pages =        "109--176",+  journal =      "Information and Computation",+  month =        "1~" # feb,+  year =         "1997",+  volume =       "132",+  number =       "2"+}++@phdthesis{ pedro-thesis,+    author = {Pedro Vasconcelos},+    title = {Space Cost Modelling for Concurrent Resource Sensitive Systems},+    year = 2006,+    school = {University of St Andrews}+}++@book{curry-feys,+   title = {Combinatory Logic, volume 1},+   year = {1958},+   publisher = {North Holland},+   author = {Haskell B. Curry and Robert Feys}+}+@inproceedings{howard,+   title = {The formulae-as-types notion of construction},+   year = {1980},+   booktitle = {To H.B.Curry: Essays on combinatory logic, lambda calculus and formalism},+   editor = {Jonathan P. Seldin and J. Roger Hindley},+   publisher = {Academic Press},+   author = {William A. Howard},+   note = {A reprint of an unpublished manuscript from 1969}+}++@misc{ydtm,+    author = {Thorsten Altenkirch and Conor McBride and James McKinna},+    title = {Why Dependent Types Matter},+    note = {Submitted for publication},+    year = 2005}++@inproceedings{regular-types,+    author = { Peter Morris and Conor McBride and Thorsten Altenkirch},+    title = {Exploring The Regular Tree Types},+    year = 2005,+    booktitle = {Types for Proofs and Programs 2004}+}++@inproceedings{xi_arraybounds,+author = "Hongwei Xi and Frank Pfenning",+title = {Eliminating Array Bound Checking through Dependent Types},+booktitle = "Proceedings of ACM SIGPLAN Conference on Programming Language Design and Implementation",+year = 1998,+month = "June",+address = "Montreal",+pages = "249--257",+}++@misc{interp-cayenne,+   url = {\verb+http://www.cs.chalmers.se/~augustss/cayenne/+},+   title = {An exercise in dependent types: A well-typed interpreter},+   year = {1999},+   author = {Lennart Augustsson and Magnus Carlsson}+}+
+ papers/ivor/embounded.bib view
@@ -0,0 +1,279 @@+@Book{BurnsWellings,+author = {A. Burns and A.J. Wellings}, +title = {{Real-Time Systems and Programming Languages (Third Edition)}},+publisher = {Addison Wesley Longman}, +year = 2001+}++@Book{Ganssle:Book,+author = {J.G. Ganssle},+title = {{The Art of Programming Embedded Systems}},+publisher = {Academic Press},+year = {1992},+note = {ISBN 0-12274880-8},+}++@Book{Ganssle:Design,+author = {J.G. Ganssle},+title = {{The Art of Designing Embedded Systems}},+publisher = {Newnes},+year = {1999},+note = {ISBN 0-75069869-1},+}++@article{Ganssle:OnLanguage,+author = {J.G. Ganssle},+title = {{On Language}},+journal ={{Electronic Eng. Times}},+month = "March",+year = {2003}+}++@article{Ganssle:MicroMinis,+author = {J.G. Ganssle},+title = {{Micro Minis}},+journal ={{Embedded Systems Programming}},+month = "March",+year = {2003}+}++@article{Barr:EmbeddedSystProg,+author = {M. Barr},+title = {{The Long Winter}},+journal ={{Electronic Systems Programming}},+month = "January",+year = {2003}+}++@unpublished{Ganssle:WebSite,+author = {The Ganssle Group},+title = {{Perfecting the Art of Building Embedded Systems}},+month = "May",+year = 2003,+note = {\url{http://www.ganssle.com}}+}++@article{Schoitsch,+author = {E. Schoitsch},+title = {{Embedded Systems -- Introduction}},+journal = {ERCIM News},+pages = {10--11},+volume = 52,+month = jan,+year = 2003+}++@article{UMLESE,+author = {C. Holland},+title = {{Telelogic Second Generation Tools}},+journal = {Embedded Systems Europe},+month = aug,+year = 2002+}++@article{DSL,+author = {P. Hudak},+title = {{Building Domain-Specific Embedded Languages}},+journal = {ACM Computing Surveys},+volume = 28,+number = 4,+month = dec,+year = 1996+}++@article{DSL:devicedriver,+author = {C. Conway},+title = {{A Domain-Specific Language for Device Drivers}},+journal = {ACM Computing Surveys},+volume = 28,+number = 4,+month = dec,+year = 1996+}++@unpublished{Klocwork,+author = {Klocwork},+year = 2003,+}++@inproceedings{Bernat1,+author = {Bernat, G. and Burns, A. and Wellings, A.},+title  = {{Portable Worst-Case Execution Time Analysis Using Java Byte Code}},+booktitle = {Proc. 12th Euromicro International Conf. on+			Real-Time Systems},+address = {Stockholm},+year    = 2000,+month   = {June}+}++@inproceedings{Bernat2,+author = {Bernat, G. and Colin, A. and Petters, S. M.},+title  = {{WCET Analysis of Probabilistic Hard Real-Time Systems}},+booktitle = {Proc. 23rd IEEE Real-Time Systems Symposium (RTSS 2002)},+address  = {Austin, TX. (USA)},+year     = 2002,+month    = {December}+}++@inproceedings{SizedRecursion,+author = {P. Vasconcelos and K. Hammond},+title = {{Inferring Costs for Recursive, Polymorphic and Higher-Order Functions}},+booktitle = {Proc. Implementation of Functional Languages (IFL 2003)},+publisher = {Springer-Verlag},+year = {2003}+}++@inproceedings{HAM,+author = {K. Hammond and G.J. Michaelson},+title = {{An Abstract Machine Implementation for Hume}},+booktitle = {submitted to Intl. Conf. on Compilers, Architectures and Synthesis for Embedded Systems (CASES~03)},+year = {2003}+}++@unpublished{EmbeddedSystSurvey,+author = {Embedded.com},+title = {Poll: What Language do you use for embedded work?},+note = {\url{http://www.embedded.com/pollArchive/?surveyno=2228}},+year = 2003,+}++@inproceedings{ESP,+author = {S. Kumar and K. Li},+title = {Automatic Memory Management for Programmable Devices},+booktitle = {Proc. ACM Intl. Symp. on Memory Management, Berlin, Germany},+month = jun,+year = 2002,+pages = {245--255},+}++@inproceedings{RegionJava,+author = {F. Qian and L. Hendrie},+title = {An Adaptive Region-Based Allocator for Java},+booktitle = {Proc. ACM Intl. Symp. on Memory Management, Berlin, Germany},+month = jun,+year = 2002,+pages = {233--244},+}++@inproceedings{RegionsRTSJ,+author = {M. Deters and R.K. Cytron},+title = {Automated Discovery of Scoped Memory Regions for Real-Time Java},+booktitle = {Proc. ACM Intl. Symp. on Memory Management, Berlin, Germany},+month = jun,+year = 2002,+pages = {132--141},+}++@inproceedings{RTGC,+author = {S. Nettles and J. O'Toole},+title = {{Real-Time Replication Garbage Collection}},+booktitle = {ACM Sigplan Notices},+volume = 28,+number = 6,+month = jun,+year = 1993,+pages = {217--226},+}++@inproceedings{Blelloch,+author = {P. Cheng and G. Blelloch},+title = {{A Parallel, Real-Time Garbage Collector}},+booktitle = {ACM Sigplan Notices},+volume = 36,+number = 5,+month = may,+year = 2001,+pages = {125--136},+}++@inproceedings{RegionsGC,+author = {N. Hallenberg and M. Elsman and M. Tofte},+title = {{Combining Region Inference and Garbage Collection}},+booktitle = {Proc. ACM Conf. on Prog. Lang. Design and Impl. (PLDI~'02), Berlin, Germany},+month = jun,+year = 2002,+}+++@article{RTSJIssues,+author = {K. Nilsen},+title = {{Issues in the Design and Implementation of Real-Time Java}},+booktitle = {Java Developers' Journal},+volume = 1,+number = 1,+year = 1996,+pages = 44+}++++@unpublished{CyCab,+author = {RoboSoft SA},+title = {{CyCab Outdoor Vehicle, for Road and/or All-terrain Use}},+note = {\url{http://www.robosoft.fr/SHEET/01Mobil/2001Cycab/CyCab.html}},+year = 2003,+month = may+}+++@unpublished{Joyner,+author = {I. Joyner},+title = {{C++??: a Critique of C++, 3rd Edition}},+year = 1996,+institution = {Unisys - ACUS, Australia},+note = {\url{http://www.kcl.ac.uk/kis/support/cit//fortran/cpp/cppcritique.ps}}+}++@unpublished{Sakkinen,+author = {M. Sakkinen},+title = {{The Darker Side of C++ Revisited}},+year = 1993,+institution = {Univerity of Jyv\"{a}skyl\"{a}},+note = {Technical Report 1993-I-13, \url{http://www.kcl.ac.uk/kis/support/cit//fortran/cpp/dark-cpl.ps}},+}++@TechReport{BCLogicDelvb,+  author = 	 {Hans-Wolfgang Loidl and Olha Shkaravska and Lennart Beringer},+  title = 	 {Preliminary investigations into a bytecode logic for Grail},+  institution =  {Institut f{\"u}r Informatik, LMU University and LFCS, Edinburgh University},+  year = 	 2003,+  month =	 jan,+  note =	 {Project Deliverable}+}++@InProceedings{HWLtofillin,+  author = 	 {Lennart Beringer and Kenneth MacKenzie and Ian Stark},+  title = 	 {Grail: a functional form for imperative mobile code},+  booktitle =	 {FGC03 --- Workshop on Foundations of Global Computing},+  year =	 2003,+  address =	 {28--29 June 2003, Eindhoven, The Netherlands},+  note =	 {Submitted}+}+++@inproceedings{AbsInt:EmsoftTahoe,+  author    =  "C. Ferdinand and R. Heckmann and M. Langenbach and+                    F. Martin and M. Schmidt and+                    H. Theiling and S. Thesing and R. Wilhelm",+  title     =  {Reliable and Precise {WCET} Determination for a Real-Life Processor},+  booktitle =  {Proc. EMSOFT 2001, First Workshop on Embedded Software},+  publisher =  {Springer-Verlag},+  series    =  {LNCS},+  volume    =  2211,+  pages     =  {469--485},+  year      =  2001+}+++@inproceedings{AbsInt:Avionics,+  author    =  "S. Thesing and J. Souyris and R. Heckmann and+                        F. Randimbivololona and M. Langenbach and+                        R. Wilhelm and C. Ferdinand",+  title     =  {An Abstract Interpretation-Based Timing Validation+                        of Hard Real-Time Avionics Software},+  booktitle =  {Proc. 2003 Intl. Conf.+                        on Dependable Systems and Networks (DSN 2003)},+  pages     =  {625--632},+  year      =  2003+}+
+ papers/ivor/examples.tex view
@@ -0,0 +1,285 @@+\section{Examples}++In this section we show two examples of embedding \Ivor{} in a Haskell+program. The first shows an embedding of a simple theorem prover for+propositional logic. The second example extends this theorem prover by+using the same logic as a basis for showing properties of a functional+language.++\subsection{A Propositional Logic Theorem Prover}++\label{example1}++Propositional logic is straightforward to model in dependent type+theory; here we show how \Ivor{} can be used to implement a theorem+prover for propositional logic. The full implementation is available+from \url{http://www.cs.st-andrews.ac.uk/~eb/Ivor/}.  The language of+propositional logic is defined as follows, where $\vx$ stands for an+arbitrary free variable:++\DM{+\begin{array}{rll}+\vL ::= & \vx +\mid \vL \land \vL+\mid \vL \lor \vL+\mid \vL \to \vL+\mid \neg\vL+\end{array}+}++\newcommand{\Tand}{\TC{And}}+\newcommand{\andintro}{\DC{and\_intro}}+\newcommand{\Tor}{\TC{Or}}+\newcommand{\orintrol}{\DC{inl}}+\newcommand{\orintror}{\DC{inr}}++There is a simple mapping from this language to dependent type theory+--- the $\land$ and $\lor$ connectives can be declared as inductive+families, where the automatically derived elimination rules give the+correct elimination behaviour, and the $\to$ connective follows the+same rules as the function arrow. Negation can be defined with the+empty type.++The $\land$ connective is declared as an inductive family, where an+instance of the family gives a proof of the connective. The $\andintro$+constructor builds a proof of $\vA\land\vB$, given a proof of $\vA$ and+a proof of $\vB$:++\DM{+\AR{+\Data\:\Tand\:(\vA,\vB\Hab\Type)\Hab\Type\hg\Where\\+\hg\hg+\andintro\Hab\fbind{\va}{\vA}{\fbind{\vb}{\vB}{\Tand\:\vA\:\vB}}+}+}++Similarly, $\lor$ is declared as an inductive family; an instance of+$\vA\lor\vB$ is built either from a proof of $\vA$ ($\orintrol$) or a+proof of $\vB$ ($\orintror$):++\DM{+\AR{+\Data\:\Tor\:(\vA,\vB\Hab\Type)\Hab\Type\hg\Where\\+\hg\hg\ARd{+& \orintrol\Hab\fbind{\va}{\vA}{\Tor\:\vA\:\vB}\\+\mid & \orintror\Hab\fbind{\vb}{\vB}{\Tor\:\vA\:\vB}+}+}+}++I will write $\interp{\ve}$ to denote the translate from an expression+$\ve\in\vL$ to an implementation in $\source$; in the implementation,+this is a parser from strings to \hdecl{ViewTerm}s:++\DM{+\AR{+\interp{\ve_1\land\ve_2}\:=\:\Tand\:\interp{\ve_1}\:\interp{\ve_2}\\+\interp{\ve_1\lor\ve_2}\:=\:\Tor\:\interp{\ve_1}\:\interp{\ve_2}\\+\interp{\ve_1\to\ve_2}\:=\:\interp{\ve_1}\to\interp{\ve_2}\\+}+}++To implement negation, we declare the empty type:++\DM{+\Data\:\False\Hab\Type\hg\Where+}++Then $\interp{\neg\ve}\:=\:\interp{\ve}\to\False$. The automatically+derived elimination shows that a value+of \remph{any} type can be created from a proof of the empty type:++\DM{+\Elim{\False}\Hab\fbind{\vx}{\False}{+\fbind{\motive}{\False\to\Type}{\motive\:\vx}}+}++In the implementation, we initialise the \hdecl{Context} with these+types (using \hdecl{addData}) and propositional variables+$\vA\ldots\vZ$ (using \hdecl{addAxiom}\footnote{This adds a name with+  a type but no definition to the context.}).++\subsubsection{Domain Specific Tactics}+Mostly, the implementation of a propositional logic theorem prover+consists of a parser and pretty printer for the language $\vL$, and a+top level loop for applying introduction and elimination+tactics. However, some domain+specific tactics are needed, in particular to deal with negation and+proof by contradiction. ++To prove a negation $\neg\vA$, we assume $\vA$ and attempt to prove+$\False$. This is achieved with an \hdecl{assumeFalse} tactic which+assumes the negation of the goal. Negation is defined with a function+$\FN{not}$; the \hdecl{assumeFalse} tactic then unfolds this name so+that a goal (in $\source$ syntax) $\FN{not}\:\vA$ is transformed to+$\vA\:\to\:\False$, then $\vA$ can be introduced.++\begin{verbatim}+assumeFalse :: Tactic+assumeFalse = unfold (name "not") >+> intro +\end{verbatim}++The proof by contradiction tactic+is implemented as follows:+\\++\begin{verbatim}+contradiction :: String -> String -> Tactic+contradiction x y = claim (name "false") "False" >+>+                    induction "false" >+>+                    (try (fill $ x ++ " " ++ y)+                          idTac+                          (fill $ y ++ " " ++ x))+\end{verbatim}++This tactic takes the names of the two contradiction premises. One is+of type $\vA\to\False$ for some $\vA$, the other is of type $\vA$. The+tactic works by claiming there is a contradiction and solving the goal+by induction over that assumed contradiction (which gives no subgoals,+since $\Elim{\False}$ has no methods). Finally, using \texttt{>+>} to+solve the next subgoal (and discharge the assumption of the+contradiction), it looks for a value of type $\False$ by first+applying $\vy$ to $\vx$ then, if that fails, applying $\vx$ to $\vy$.++\subsection{\Funl{}, a Functional Language with a Built-in Theorem Prover}++\label{example2}++Propositional logic is an example of a simple formal system which can+be embedded in a Haskell program using \Ivor{}; however, more complex+languages can be implemented. \Funl{} is a simple functional language,+with primitive recursion over integers and higher order functions. It+is implemented on top of \Ivor{} as a framework for both language+representation and correctness proofs in that language. By using the+same framework for both, it is a small step from implementing the+language to implementing a theorem prover for showing properties of+programs, making use of the theorem prover developed+in sec. \ref{example1}.+An implementation is available from+\url{http://www.cs.st-andrews.ac.uk/~eb/Funl/}; in this section I will+sketch some of the important details of this implementation. Like the+propositional logic theorem prover, much of the detail is in the+parsing and pretty printing of terms and propositions, relying on+\Ivor{} for typechecking and evaluation.++\subsubsection{Programs and Properties}++The \Funl{} language allows programs and statements of the properties+those programs should satisfy to be expressed within the same input file.+Functions are defined as in the following examples, using \hdecl{rec}+to mark a primitive recursive definition:++\begin{verbatim}+fac : Int -> Int =+     lam x . rec x 1 (lam k. lam recv. (k+1)*recv);+myplus : Int -> Int -> Int =+     lam x. lam y. rec x y (lam k. lam recv. 1+recv);+\end{verbatim}++The \hdecl{myplus} function above defines addition by primitive+recursion over its input. To show that this really is a definition of+addition, we may wish to show that it satisfies some appropriate+properties of addition. In the \Funl{} syntax, we declare the+properties we wish to show as follows:++\begin{verbatim}+myplusn0 proves +     forall x:Int. myplus x 0 = x;+myplusnm1 proves +     forall x:Int. forall y:Int. myplus x (1+y) = 1+(myplus x y);+myplus_commutes proves +     forall x:Int. forall y:Int. myplus x y = myplus y x;+\end{verbatim}++On compiling a program, the compiler requires that proofs are provided+for the stated properties. Once built, the proofs can be saved as+proof terms, so that properties need only be proved once.++\subsubsection{Building Terms}+Terms are parsed into a data type \hdecl{Raw}; the name+\hdecl{Raw} reflects the fact that these are raw, untyped terms; note+in particular that \hdecl{Rec} is an operator for primitive recursion+on arbitrary types, like the $\delim$ operators in $\source$ --- it+would be fairly simple to write a first pass which translated+recursive calls into such an operator using techniques similar to+McBride and McKinna's labelled types~\cite{view-left}, which are+implemented in \Ivor{}. Using this, we could easily extend the+language with more primitive types (e.g. lists) or even user defined+data types. The representation is as follows:++\begin{verbatim}+data Raw = Var String | Lam String Ty Raw | App Raw Raw+         | Num Int | Boolval Bool  | InfixOp Op Raw Raw+         | If Raw Raw Raw | Rec Raw [Raw]+\end{verbatim}++Building a \Funl{} function consists of creating a \hdecl{theorem} +with a goal representing the function's type, then using the+\hdecl{buildTerm} tactic to traverse the+structure of the raw term, constructing a proof of the+theorem --- note especially that \texttt{rec} translates into an+application of the appropriate elimination rule via the+\texttt{induction} tactic:++\begin{verbatim}+buildTerm :: Raw -> Tactic+buildTerm (Var x) = refine x+buildTerm (Lam x ty sc) = introName (name x) >+> buildTerm sc+buildTerm (Language.App f a) = buildTerm f >+> buildTerm a+buildTerm (Num x) = fill (mkNat x)+buildTerm (If a t e) = +    cases (mkTerm a) >+> buildTerm t >+> buildTerm e+buildTerm (Rec t alts) =+    induction (mkTerm t) >+> tacs (map buildTerm alts)+buildTerm (InfixOp Plus x y) = +    refine "plus" >+> buildTerm x >+> buildTerm y+buildTerm (InfixOp Times x y) = ...+\end{verbatim}++A helper function, \hdecl{mkTerm}, is used to translate simple+expressions into \hdecl{ViewTerm}s. This is used for the scrutinees of+\hdecl{if} and \hdecl{rec} expressions, although if more complex+expressions are desired here, it would be possible to use+\hdecl{buildTerm} instead.++\begin{verbatim}+mkTerm :: Raw -> ViewTerm+mkTerm (Var x) = (Name Unknown (name x))+mkTerm (Lam x ty sc) = Lambda (name x) (mkType ty) (mkTerm sc)+mkTerm (Apply f a) = App (mkTerm f) (mkTerm a)+mkTerm (Num x) = mkNat x+mkTerm (InfixOp Plus x y) = +    App (App (Name Free (name "plus")) (mkTerm x)) (mkTerm y)+mkTerm (InfixOp Times x y) = ...+\end{verbatim}++\Ivor{} handles+the typechecking and any issues with renaming, using techniques from+\cite{not-a-number}; if there are any type errors in the \hdecl{Raw}+term, this tactic will fail (although some extra work is required to+produce readable error messages). By using \Ivor{} to handle+typechecking and evaluation, we are in no danger of constructing or +evaluating an ill-typed term.+++\subsubsection{Building Proofs}+We also define a language of propositions over terms in \Funl{}.+This uses propositional logic, just like the theorem prover in+section \ref{example1}, but extended with equational reasoning. For+the equational reasoning, we use a library of equality proofs to+create tactics for applying commutativity and associativity of+addition and simplification of expressions.++A basic language of propositions with the obvious translation to+$\source$ is:++\begin{verbatim}+data Prop = Eq Raw Raw+          | And Prop Prop | Or Prop Prop+          | All String Ty Prop | FalseProp+\end{verbatim}++This allows equational reasoning over \Funl{} programs, quantification+over variables and conjunction and disjunction of propositions. A more+full featured prover may require relations other than \hdecl{Eq} or+even user defined relations.
+ papers/ivor/intro.tex view
@@ -0,0 +1,124 @@+\section{Introduction}++%\Ivor{} is a tactic-based theorem proving engine with a Haskell+%API. Unlike other systems such as \Coq{}~\cite{coq-manual} and+%Agda~\cite{agda}, the tactic engine is primarily intended to be used+%by programs, rather than a human operator. ++Type theory based theorem provers such as \Coq{}~\cite{coq-manual} and+\Agda{}~\cite{agda} have been used as tools for verification of programs+(e.g.~\cite{leroy-compiler,why-tool,mckinna-expr}), extraction of+correct programs from proofs (e.g.~\cite{extraction-coq})+and formal proofs of mathematical properties+(e.g.~\cite{fta,four-colour}).  However, these tools are designed with a+human operator in mind; the interface is textual which makes it+difficult for an external program to interact with them. +In contrast, the \Ivor{} library is designed to provide an+implementation of dependent type theory (i.e. dependently typed+$\lambda$-calculus) and tactics for proof and+program development to a Haskell application programmer, via a stable,+well-documented and lightweight (as far as possible) API. The goal is+to allow: i) easy embedding of theorem proving tools in a Haskell+application; and ii) easy extension of the theorem prover with+\remph{domain specific} tactics, via a domain specific embedded+language (DSEL) for tactic construction.++%% \Coq{}+%% provides an extraction mechanism~\cite{extraction-coq} which generates+%% ML or Haskell code from a proof term, but this does not allow the easy+%% \remph{construction} of proof terms by an external tool. It is also+%% extensible to some extent, for example using a domain specific+%% language for creating user tactics, but the result is difficult to+%% embed in an external program.++%More+%recently, dependent types have been incorporated into programming+%languages such as Cayenne~\cite{cayenne-icfp}, DML~\cite{xi-thesis} and+%\Epigram{}~\cite{view-left,epigram-afp}.+++%% have been used for several+%% large practical applications, including correctness proofs for a+%% compiler~\cite{leroy-compiler} and a computer assisted proof of the+%% four colour theorem~\cite{four-colour}. ++\subsection{Motivating Examples}++Many situations can benefit from a dependently typed proof and+programming framework accessible as a library from a Haskell program.+For each of these, by using an implementation of a well understood+type theory, we can be confident that the underlying framework is+sound. ++%% --- provided of course that the implementation itself is correct. +%% Implementing+%% eliminates the need to prove that a language and proof system are consistent with+%% each other or that a special purpose proof framework is sound.++\begin{description}+\item[Programming Languages] +Dependent type theory is a possible internal representation for a+functional programming language. +%The core language of the Glasgow+%Haskell Compiler is \SystemF{}~\cite{core} --- dependent type theory+%generalises this by allowing types to be parametrised over values.+Correctness+properties of programs in purely functional languages can be proven by+equational reasoning, +e.g. with Sparkle~\cite{sparkle} for the Clean language~\cite{clean}, or+Cover~\cite{cover} for translating Haskell into+\Agda{}~\cite{agda}. However these tools +separate the language implementation from the theorem prover --- every+language feature must be translated into the theorem prover's+representation, and any time the language implementation is changed,+this translation must also be changed.+In section+\ref{example2}, we will see how \Ivor{} can be used to implement a+language with a built-in theorem prover, with a common representation+for both.++\item[Verified DSL Implementation] ++We have previously implementated a verified domain specific+language~\cite{dtpmsp-gpce} with \Ivor{}.  The abstract syntax tree of+a program is a dependent data structure, and the type system+guarantees that invariant properties of the program are maintained+during evaluation.  Using staging annotations~\cite{multi-taha}, such+an interpreter can be specialised to a translator. We are continuing+to explore these techniques in the context of resource aware+programming~\cite{dt-framework}.++\item[Formal Systems] ++A formal system can be modelled in dependent type theory, and+derivations within the system can be constructed and checked. +A simple example is propositional logic --- the connectives+$\land$, $\lor$ and $\to$ are represented as types, and a theorem+prover is used to prove logical formulae.  Having an implementation of+type theory and an interactive theorem prover accessible as an API+makes it easy to write tools for working in a formal system, whether+for educational or practical purposes.  In section \ref{example1}, I+will give details of an implementation of propositional logic.++\end{description}++In general, the library can be used wherever formally certified code+is needed --- evaluation of dependently typed \Ivor{} programs is+possible from Haskell programs and the results can be inspected+easily.  Domain specific tactics are often required; e.g. an+implementation of a programming language with subtyping may require a+tactic for inserting coercions, or a computer arithmetic system may+require an implementation of Pugh's Omega decision+procedure~\cite{pugh-omega}.  \Ivor{}'s API is designed to make+implementation of such tactics as easy as possible.++In \Ivor{}'s dependent type system, types may be predicated on+arbitrary values. Programs and properties can be+expressed within the same self-contained system --- properties are+proved by construction, at the same time as the program is+written. The tactic language can thus be used not only for+constructing proofs but also for interactive program development.++%\subsection{Why Do We Need Another Theorem Prover?}++%Relationship to e.g. \Coq{}.
+ papers/ivor/ivor.tex view
@@ -0,0 +1,84 @@+%\documentclass{article}+\documentclass[orivec,dvips,10pt]{llncs}++\usepackage{epsfig}+\usepackage{path}+\usepackage{url}+\usepackage{amsmath,amssymb} ++\newenvironment{template}{\sffamily}++\usepackage{graphics,epsfig}+\usepackage{stmaryrd}++\input{macros.ltx}+\input{library.ltx}++\NatPackage++\newcommand{\Ivor}{\textsc{Ivor}}+\newcommand{\Funl}{\textsc{Funl}}+\newcommand{\Agda}{\textsc{Agda}}++\newcommand{\mysubsubsection}[1]{+\noindent+\textbf{#1}+}+\newcommand{\hdecl}[1]{\texttt{#1}}++\begin{document}++\title{\Ivor{}, a Proof Engine}+\author{Edwin Brady}++\institute{School of Computer Science, \\+ University of St Andrews, St Andrews, Scotland. \\ \texttt{Email: eb@cs.st-andrews.ac.uk}.\\+\texttt{Tel: +44-1334-463253}, \texttt{Fax: +44-1334-463278} \vspace{0.1in}+}+ +\maketitle++\begin{abstract}+Dependent type theory has several practical applications in the fields+of theorem proving, program verification and programming language+design. \Ivor{} is a Haskell library designed to allow easy extending+and embedding of a type theory based theorem prover in a Haskell+application. In this paper, I give an overview of the library and show+how it can be used to embed theorem proving technology in an+implementation of a simple functional programming language; by using+type theory as a core representation, we can construct and evaluate+terms and prove correctness properties of those terms within the+\remph{same} framework, ensuring consistency of the implementation and+the theorem prover. ++\end{abstract}++\input{intro}++\input{corett}++%\input{usage}++\input{tactics}++\input{examples}++\input{conclusions}++\section*{Acknowledgements}++My thanks to Kevin Hammond and James McKinna for their comments on an+earlier draft of this paper, and to the anonymous reviewers for their+helpful comments.+This work is generously supported by EPSRC grant EP/C001346/1. ++\bibliographystyle{abbrv}+\begin{small}+\bibliography{../bib/literature.bib}++%\appendix++%\input{code}++\end{small}+\end{document}
+ papers/ivor/library.ltx view
@@ -0,0 +1,325 @@+%%%%%%%%%%%%%%% library file for datatypes etc.++%%% Identifiers++\newcommand{\va}{\VV{a}}+\newcommand{\vb}{\VV{b}}+\newcommand{\vc}{\VV{c}}+\newcommand{\vd}{\VV{d}}+\newcommand{\ve}{\VV{e}}+\newcommand{\vf}{\VV{f}}+\newcommand{\vg}{\VV{g}}+\newcommand{\vh}{\VV{h}}+\newcommand{\vi}{\VV{i}}+\newcommand{\vj}{\VV{j}}+\newcommand{\vk}{\VV{k}}+\newcommand{\vl}{\VV{l}}+\newcommand{\vm}{\VV{m}}+\newcommand{\vn}{\VV{n}}+\newcommand{\vo}{\VV{o}}+\newcommand{\vp}{\VV{p}}+\newcommand{\vq}{\VV{q}}+\newcommand{\vr}{\VV{r}}+\newcommand{\vs}{\VV{s}}+\newcommand{\vt}{\VV{t}}+\newcommand{\vu}{\VV{u}}+\newcommand{\vv}{\VV{v}}+\newcommand{\vw}{\VV{w}}+\newcommand{\vx}{\VV{x}}+\newcommand{\vy}{\VV{y}}+\newcommand{\vz}{\VV{z}}+\newcommand{\vA}{\VV{A}}+\newcommand{\vB}{\VV{B}}+\newcommand{\vC}{\VV{C}}+\newcommand{\vD}{\VV{D}}+\newcommand{\vE}{\VV{E}}+\newcommand{\vF}{\VV{F}}+\newcommand{\vG}{\VV{G}}+\newcommand{\vH}{\VV{H}}+\newcommand{\vI}{\VV{I}}+\newcommand{\vJ}{\VV{J}}+\newcommand{\vK}{\VV{K}}+\newcommand{\vL}{\VV{L}}+\newcommand{\vM}{\VV{M}}+\newcommand{\vN}{\VV{N}}+\newcommand{\vO}{\VV{O}}+\newcommand{\vP}{\VV{P}}+\newcommand{\vQ}{\VV{Q}}+\newcommand{\vR}{\VV{R}}+\newcommand{\vS}{\VV{S}}+\newcommand{\vT}{\VV{T}}+\newcommand{\vU}{\VV{U}}+\newcommand{\vV}{\VV{V}}+\newcommand{\vW}{\VV{W}}+\newcommand{\vX}{\VV{X}}+\newcommand{\vY}{\VV{Y}}+\newcommand{\vZ}{\VV{Z}}+\newcommand{\vas}{\VV{as}}+\newcommand{\vbs}{\VV{bs}}+\newcommand{\vcs}{\VV{cs}}+\newcommand{\vds}{\VV{ds}}+\newcommand{\ves}{\VV{es}}+\newcommand{\vfs}{\VV{fs}}+\newcommand{\vgs}{\VV{gs}}+\newcommand{\vhs}{\VV{hs}}+\newcommand{\vis}{\VV{is}}+\newcommand{\vjs}{\VV{js}}+\newcommand{\vks}{\VV{ks}}+\newcommand{\vls}{\VV{ls}}+\newcommand{\vms}{\VV{ms}}+\newcommand{\vns}{\VV{ns}}+\newcommand{\vos}{\VV{os}}+\newcommand{\vps}{\VV{ps}}+\newcommand{\vqs}{\VV{qs}}+\newcommand{\vrs}{\VV{rs}}+%\newcommand{\vss}{\VV{ss}}+\newcommand{\vts}{\VV{ts}}+\newcommand{\vus}{\VV{us}}+\newcommand{\vvs}{\VV{vs}}+\newcommand{\vws}{\VV{ws}}+\newcommand{\vxs}{\VV{xs}}+\newcommand{\vys}{\VV{ys}}+\newcommand{\vzs}{\VV{zs}}++%%% Telescope Identifiers++\newcommand{\ta}{\vec{\VV{a}}}+\newcommand{\tb}{\vec{\VV{b}}}+\newcommand{\tc}{\vec{\VV{c}}}+\newcommand{\td}{\vec{\VV{d}}}+\newcommand{\te}{\vec{\VV{e}}}+\newcommand{\tf}{\vec{\VV{f}}}+\newcommand{\tg}{\vec{\VV{g}}}+%\newcommand{\th}{\vec{\VV{h}}}+\newcommand{\ti}{\vec{\VV{i}}}+\newcommand{\tj}{\vec{\VV{j}}}+\newcommand{\tk}{\vec{\VV{k}}}+\newcommand{\tl}{\vec{\VV{l}}}+\newcommand{\tm}{\vec{\VV{m}}}+\newcommand{\tn}{\vec{\VV{n}}}+%\newcommand{\to}{\vec{\VV{o}}}+\newcommand{\tp}{\vec{\VV{p}}}+\newcommand{\tq}{\vec{\VV{q}}}+\newcommand{\tr}{\vec{\VV{r}}}+\newcommand{\tts}{\vec{\VV{s}}}+\newcommand{\ttt}{\vec{\VV{t}}}+\newcommand{\tu}{\vec{\VV{u}}}+%\newcommand{\tv}{\vec{\VV{v}}}+\newcommand{\tw}{\vec{\VV{w}}}+\newcommand{\tx}{\vec{\VV{x}}}+\newcommand{\ty}{\vec{\VV{y}}}+\newcommand{\tz}{\vec{\VV{z}}}+\newcommand{\tA}{\vec{\VV{A}}}+\newcommand{\tB}{\vec{\VV{B}}}+\newcommand{\tC}{\vec{\VV{C}}}+\newcommand{\tD}{\vec{\VV{D}}}+\newcommand{\tE}{\vec{\VV{E}}}+\newcommand{\tF}{\vec{\VV{F}}}+\newcommand{\tG}{\vec{\VV{G}}}+\newcommand{\tH}{\vec{\VV{H}}}+\newcommand{\tI}{\vec{\VV{I}}}+\newcommand{\tJ}{\vec{\VV{J}}}+\newcommand{\tK}{\vec{\VV{K}}}+\newcommand{\tL}{\vec{\VV{L}}}+\newcommand{\tM}{\vec{\VV{M}}}+\newcommand{\tN}{\vec{\VV{N}}}+\newcommand{\tO}{\vec{\VV{O}}}+\newcommand{\tP}{\vec{\VV{P}}}+\newcommand{\tQ}{\vec{\VV{Q}}}+\newcommand{\tR}{\vec{\VV{R}}}+\newcommand{\tS}{\vec{\VV{S}}}+\newcommand{\tT}{\vec{\VV{T}}}+\newcommand{\tU}{\vec{\VV{U}}}+\newcommand{\tV}{\vec{\VV{V}}}+\newcommand{\tW}{\vec{\VV{W}}}+\newcommand{\tX}{\vec{\VV{X}}}+\newcommand{\tY}{\vec{\VV{Y}}}+\newcommand{\tZ}{\vec{\VV{Z}}}++++%%% Nat++\newcommand{\NatPackage}{+  \newcommand{\Nat}{\TC{\mathbb{N}}}+  \newcommand{\Z}{\DC{0}}+  \newcommand{\suc}{\DC{s}}+  \newcommand{\NatDecl}{+    \Data \hg+    \Axiom{\Nat\Hab\Type} \hg+    \Where \hg+    \Axiom{\Z\Hab\Nat} \hg+    \Rule{\vn\Hab\Nat}+         {\suc\:\vn\Hab\Nat}+}}++%%% Bool++\newcommand{\BoolPackage}{+  \newcommand{\Bool}{\TC{Bool}}+  \newcommand{\true}{\DC{true}}+  \newcommand{\false}{\DC{false}}+  \newcommand{\BoolDecl}{+    \Data \hg+    \Axiom{\Bool\Hab\Type} \hg+    \Where \hg+    \Axiom{\true\Hab\Bool} \hg+    \Axiom{\false\Hab\Bool}+}}++%%% So++\newcommand{\SoPackage}{+  \newcommand{\So}{\TC{So}}+  \newcommand{\oh}{\DC{oh}}+  \newcommand{\SoDecl}{+    \Data \hg+    \Rule{\vb\Hab\Bool}+         {\So\:\vb\Hab\Type} \hg+    \Where \hg+    \Axiom{\oh\Hab\So\:\true}+}}++%%% Unit++\newcommand{\UnitPackage}{+  \newcommand{\Unit}{\TC{Unit}}+  \newcommand{\void}{\DC{void}}+  \newcommand{\UnitDecl}{+    \Data \hg+    \Axiom{\Unit\Hab\Type} \hg+    \Where \hg+    \Axiom{\void\Hab\Unit}+}}++%%% Maybe++\newcommand{\MaybePackage}{+  \newcommand{\Maybe}{\TC{Maybe}}+  \newcommand{\yes}{\DC{yes}}+  \newcommand{\no}{\DC{no}}+  \newcommand{\MaybeDecl}{+    \Data \hg+    \Rule{\vA\Hab\Type}+         {\Maybe\:\vA\Hab\Type} \hg+    \Where \hg+    \Rule{\va \Hab \vA}+         {\yes\:\va\Hab\Maybe\:\vA} \hg+    \Axiom{\no\Hab\Maybe\:\vA}+}}++%%% Cross++\newcommand{\pr}[2]{(#1\DC{,}#2)}  %grrrr+\newcommand{\CrossPackage}{+  \newcommand{\Cross}{\times}+  \newcommand{\CrossDecl}{+    \Data \hg+    \Rule{\vA,\vB\Hab\Type}+         {\vA\Cross\vB\Hab\Type} \hg+    \Where \hg+    \Rule{\va \Hab \vA \hg \vb\Hab\vB}+         {\pr{\va}{\vb}\Hab\vA\Cross\vB}+}}++%%% Fin++\newcommand{\FinPackage}{+  \newcommand{\Fin}{\TC{Fin}}+  \newcommand{\fz}{\DC{f0}}+  \newcommand{\fs}{\DC{fs}}+  \newcommand{\FinDecl}{+    \AR{+    \Data \hg+    \Rule{\vn\Hab\Nat}+         {\Fin\:\vn\Hab\Type} \hg \\+    \Where \hg+    \begin{array}[t]{c}+    \Axiom{\fz\Hab\Fin\:(\suc\:\vn)} \hg+    \Rule{\vi\Hab\Fin\:\vn}+         {\fs\:\vi\Hab\Fin\:(\suc\:\vn)}+    \end{array}+    }+}}++%%% Vect++\newcommand{\VectPackage}{+  \newcommand{\Vect}{\TC{Vect}}+  \newcommand{\vnil}{\varepsilon}+  \newcommand{\vcons}{\,\dcolon\,}+  \newcommand{\vsnoc}{\,\dcolon\,}+  \newcommand{\VectConsDecl}{+    \Data \hg+    \Rule{\vA \Hab \Type \hg \vn\Hab\Nat}+         {\Vect\:\vA\:\vn\Hab\Type} \hg+    \Where \hg \begin{array}[t]{c}+    \Axiom{\vnil \Hab \Vect\:\vA\:\Z} \\+    \Rule{\vx\Hab\vA \hg \vxs\Hab \Vect\:\vA\:\vn }+         {\vx\vcons\vxs\Hab\Vect\:\vA\:(\suc\vn)}+    \end{array}+}+  \newcommand{\VectSnocDecl}{+    \Data \hg+    \Rule{\vA \Hab \Type \hg \vn\Hab\Nat}+         {\Vect\:\vA\:\vn\Hab\Type} \hg+    \Where \hg \begin{array}[t]{c}+    \Axiom{\vnil \Hab \Vect\:\vA\:\Z} \\+    \Rule{\vxs\Hab \Vect\:\vA\:\vn \hg \vx\Hab\vA}+         {\vxs\vsnoc\vx\Hab\Vect\:\vA\:(\suc\vn)}+    \end{array}+}+}++%%% Compare++%Data Compare : (x:nat)(y:nat)Type+%  = lt : (x:nat)(y:nat)(Compare x (plus (S y) x))+%  | eq : (x:nat)(Compare x x)+%  | gt : (x:nat)(y:nat)(Compare (plus (S x) y) y);+++\newcommand{\ComparePackage}{+  \newcommand{\Compare}{\TC{Compare}}+  \newcommand{\ltComp}{\DC{lt}}+  \newcommand{\eqComp}{\DC{eq}}+  \newcommand{\gtComp}{\DC{gt}}+  \newcommand{\CompareDecl}{+    \Data \hg+    \Rule{\vm\Hab\Nat\hg\vn\Hab\Nat}+         {\Compare\:\vm\:\vn\Hab\Type} \\+    \Where \hg\begin{array}[t]{c}+    \Rule{\vx\Hab\Nat\hg\vy\Hab\Nat}+         {\ltComp_{\vx}\:\vy\Hab\Compare\:\vx\:(\FN{plus}\:\vx\:(\suc\:\vy))} \\+    \Rule{\vx\Hab\Nat}+         {\eqComp_{\vx}\Hab\Compare\:\vx\:\vx}\\+    \Rule{\vx\Hab\Nat\hg\vy\Hab\Nat}+         {\gtComp_{\vy}\:\vx\Hab\Compare\:(\FN{plus}\:\vy\:(\suc\:\vx))\:\vy} \\+    \end{array}	 +  }++%Data CompareM : Type+%  = ltM : (ydiff:nat)CompareM+%  | eqM : CompareM+%  | gtM : (xdiff:nat)CompareM;++  \newcommand{\CompareM}{\TC{Compare^-}}+  \newcommand{\ltCompM}{\DC{lt^-}}+  \newcommand{\eqCompM}{\DC{eq^-}}+  \newcommand{\gtCompM}{\DC{gt^-}}+  \newcommand{\CompareMDecl}{++     \Data \hg+     \Axiom{\CompareM\Hab\Type} \\+     \Where \hg\begin{array}[t]{c}+     \Rule{\vy\Hab\Nat}+          {\ltCompM\:\vy\Hab\CompareM} \\+     \Axiom{\eqCompM\Hab\CompareM}\\+     \Rule{\vx\Hab\Nat}+          {\gtCompM\:\vx\Hab\CompareM} \\+     \end{array}	+  }+  \newcommand{\CompareRec}{\FN{CompareRec}}+  \newcommand{\CompareRecM}{\FN{CompareRec^-}}++}
+ papers/ivor/llncs.cls view
@@ -0,0 +1,1190 @@+% LLNCS DOCUMENT CLASS -- version 2.14 (17-Aug-2004)
+% Springer Verlag LaTeX2e support for Lecture Notes in Computer Science
+%
+%%
+%% \CharacterTable
+%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%%   Digits        \0\1\2\3\4\5\6\7\8\9
+%%   Exclamation   \!     Double quote  \"     Hash (number) \#
+%%   Dollar        \$     Percent       \%     Ampersand     \&
+%%   Acute accent  \'     Left paren    \(     Right paren   \)
+%%   Asterisk      \*     Plus          \+     Comma         \,
+%%   Minus         \-     Point         \.     Solidus       \/
+%%   Colon         \:     Semicolon     \;     Less than     \<
+%%   Equals        \=     Greater than  \>     Question mark \?
+%%   Commercial at \@     Left bracket  \[     Backslash     \\
+%%   Right bracket \]     Circumflex    \^     Underscore    \_
+%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
+%%   Right brace   \}     Tilde         \~}
+%%
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\ProvidesClass{llncs}[2004/08/17 v2.14
+^^J LaTeX document class for Lecture Notes in Computer Science]
+% Options
+\let\if@envcntreset\iffalse
+\DeclareOption{envcountreset}{\let\if@envcntreset\iftrue}
+\DeclareOption{citeauthoryear}{\let\citeauthoryear=Y}
+\DeclareOption{oribibl}{\let\oribibl=Y}
+\let\if@custvec\iftrue
+\DeclareOption{orivec}{\let\if@custvec\iffalse}
+\let\if@envcntsame\iffalse
+\DeclareOption{envcountsame}{\let\if@envcntsame\iftrue}
+\let\if@envcntsect\iffalse
+\DeclareOption{envcountsect}{\let\if@envcntsect\iftrue}
+\let\if@runhead\iffalse
+\DeclareOption{runningheads}{\let\if@runhead\iftrue}
+
+\let\if@openbib\iffalse
+\DeclareOption{openbib}{\let\if@openbib\iftrue}
+
+% languages
+\let\switcht@@therlang\relax
+\def\ds@deutsch{\def\switcht@@therlang{\switcht@deutsch}}
+\def\ds@francais{\def\switcht@@therlang{\switcht@francais}}
+
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+
+\ProcessOptions
+
+\LoadClass[twoside]{article}
+\RequirePackage{multicol} % needed for the list of participants, index
+
+\setlength{\textwidth}{12.2cm}
+\setlength{\textheight}{19.3cm}
+\renewcommand\@pnumwidth{2em}
+\renewcommand\@tocrmarg{3.5em}
+%
+\def\@dottedtocline#1#2#3#4#5{%
+  \ifnum #1>\c@tocdepth \else
+    \vskip \z@ \@plus.2\p@
+    {\leftskip #2\relax \rightskip \@tocrmarg \advance\rightskip by 0pt plus 2cm
+               \parfillskip -\rightskip \pretolerance=10000
+     \parindent #2\relax\@afterindenttrue
+     \interlinepenalty\@M
+     \leavevmode
+     \@tempdima #3\relax
+     \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
+     {#4}\nobreak
+     \leaders\hbox{$\m@th
+        \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
+        mu$}\hfill
+     \nobreak
+     \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
+     \par}%
+  \fi}
+%
+\def\switcht@albion{%
+\def\abstractname{Abstract.}
+\def\ackname{Acknowledgement.}
+\def\andname{and}
+\def\lastandname{\unskip, and}
+\def\appendixname{Appendix}
+\def\chaptername{Chapter}
+\def\claimname{Claim}
+\def\conjecturename{Conjecture}
+\def\contentsname{Table of Contents}
+\def\corollaryname{Corollary}
+\def\definitionname{Definition}
+\def\examplename{Example}
+\def\exercisename{Exercise}
+\def\figurename{Fig.}
+\def\keywordname{{\bf Key words:}}
+\def\indexname{Index}
+\def\lemmaname{Lemma}
+\def\contriblistname{List of Contributors}
+\def\listfigurename{List of Figures}
+\def\listtablename{List of Tables}
+\def\mailname{{\it Correspondence to\/}:}
+\def\noteaddname{Note added in proof}
+\def\notename{Note}
+\def\partname{Part}
+\def\problemname{Problem}
+\def\proofname{Proof}
+\def\propertyname{Property}
+\def\propositionname{Proposition}
+\def\questionname{Question}
+\def\remarkname{Remark}
+\def\seename{see}
+\def\solutionname{Solution}
+\def\subclassname{{\it Subject Classifications\/}:}
+\def\tablename{Table}
+\def\theoremname{Theorem}}
+\switcht@albion
+% Names of theorem like environments are already defined
+% but must be translated if another language is chosen
+%
+% French section
+\def\switcht@francais{%\typeout{On parle francais.}%
+ \def\abstractname{R\'esum\'e.}%
+ \def\ackname{Remerciements.}%
+ \def\andname{et}%
+ \def\lastandname{ et}%
+ \def\appendixname{Appendice}
+ \def\chaptername{Chapitre}%
+ \def\claimname{Pr\'etention}%
+ \def\conjecturename{Hypoth\`ese}%
+ \def\contentsname{Table des mati\`eres}%
+ \def\corollaryname{Corollaire}%
+ \def\definitionname{D\'efinition}%
+ \def\examplename{Exemple}%
+ \def\exercisename{Exercice}%
+ \def\figurename{Fig.}%
+ \def\keywordname{{\bf Mots-cl\'e:}}
+ \def\indexname{Index}
+ \def\lemmaname{Lemme}%
+ \def\contriblistname{Liste des contributeurs}
+ \def\listfigurename{Liste des figures}%
+ \def\listtablename{Liste des tables}%
+ \def\mailname{{\it Correspondence to\/}:}
+ \def\noteaddname{Note ajout\'ee \`a l'\'epreuve}%
+ \def\notename{Remarque}%
+ \def\partname{Partie}%
+ \def\problemname{Probl\`eme}%
+ \def\proofname{Preuve}%
+ \def\propertyname{Caract\'eristique}%
+%\def\propositionname{Proposition}%
+ \def\questionname{Question}%
+ \def\remarkname{Remarque}%
+ \def\seename{voir}
+ \def\solutionname{Solution}%
+ \def\subclassname{{\it Subject Classifications\/}:}
+ \def\tablename{Tableau}%
+ \def\theoremname{Th\'eor\`eme}%
+}
+%
+% German section
+\def\switcht@deutsch{%\typeout{Man spricht deutsch.}%
+ \def\abstractname{Zusammenfassung.}%
+ \def\ackname{Danksagung.}%
+ \def\andname{und}%
+ \def\lastandname{ und}%
+ \def\appendixname{Anhang}%
+ \def\chaptername{Kapitel}%
+ \def\claimname{Behauptung}%
+ \def\conjecturename{Hypothese}%
+ \def\contentsname{Inhaltsverzeichnis}%
+ \def\corollaryname{Korollar}%
+%\def\definitionname{Definition}%
+ \def\examplename{Beispiel}%
+ \def\exercisename{\"Ubung}%
+ \def\figurename{Abb.}%
+ \def\keywordname{{\bf Schl\"usselw\"orter:}}
+ \def\indexname{Index}
+%\def\lemmaname{Lemma}%
+ \def\contriblistname{Mitarbeiter}
+ \def\listfigurename{Abbildungsverzeichnis}%
+ \def\listtablename{Tabellenverzeichnis}%
+ \def\mailname{{\it Correspondence to\/}:}
+ \def\noteaddname{Nachtrag}%
+ \def\notename{Anmerkung}%
+ \def\partname{Teil}%
+%\def\problemname{Problem}%
+ \def\proofname{Beweis}%
+ \def\propertyname{Eigenschaft}%
+%\def\propositionname{Proposition}%
+ \def\questionname{Frage}%
+ \def\remarkname{Anmerkung}%
+ \def\seename{siehe}
+ \def\solutionname{L\"osung}%
+ \def\subclassname{{\it Subject Classifications\/}:}
+ \def\tablename{Tabelle}%
+%\def\theoremname{Theorem}%
+}
+
+% Ragged bottom for the actual page
+\def\thisbottomragged{\def\@textbottom{\vskip\z@ plus.0001fil
+\global\let\@textbottom\relax}}
+
+\renewcommand\small{%
+   \@setfontsize\small\@ixpt{11}%
+   \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@
+   \abovedisplayshortskip \z@ \@plus2\p@
+   \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@
+   \def\@listi{\leftmargin\leftmargini
+               \parsep 0\p@ \@plus1\p@ \@minus\p@
+               \topsep 8\p@ \@plus2\p@ \@minus4\p@
+               \itemsep0\p@}%
+   \belowdisplayskip \abovedisplayskip
+}
+
+\frenchspacing
+\widowpenalty=10000
+\clubpenalty=10000
+
+\setlength\oddsidemargin   {63\p@}
+\setlength\evensidemargin  {63\p@}
+\setlength\marginparwidth  {90\p@}
+
+\setlength\headsep   {16\p@}
+
+\setlength\footnotesep{7.7\p@}
+\setlength\textfloatsep{8mm\@plus 2\p@ \@minus 4\p@}
+\setlength\intextsep   {8mm\@plus 2\p@ \@minus 2\p@}
+
+\setcounter{secnumdepth}{2}
+
+\newcounter {chapter}
+\renewcommand\thechapter      {\@arabic\c@chapter}
+
+\newif\if@mainmatter \@mainmattertrue
+\newcommand\frontmatter{\cleardoublepage
+            \@mainmatterfalse\pagenumbering{Roman}}
+\newcommand\mainmatter{\cleardoublepage
+       \@mainmattertrue\pagenumbering{arabic}}
+\newcommand\backmatter{\if@openright\cleardoublepage\else\clearpage\fi
+      \@mainmatterfalse}
+
+\renewcommand\part{\cleardoublepage
+                 \thispagestyle{empty}%
+                 \if@twocolumn
+                     \onecolumn
+                     \@tempswatrue
+                   \else
+                     \@tempswafalse
+                 \fi
+                 \null\vfil
+                 \secdef\@part\@spart}
+
+\def\@part[#1]#2{%
+    \ifnum \c@secnumdepth >-2\relax
+      \refstepcounter{part}%
+      \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
+    \else
+      \addcontentsline{toc}{part}{#1}%
+    \fi
+    \markboth{}{}%
+    {\centering
+     \interlinepenalty \@M
+     \normalfont
+     \ifnum \c@secnumdepth >-2\relax
+       \huge\bfseries \partname~\thepart
+       \par
+       \vskip 20\p@
+     \fi
+     \Huge \bfseries #2\par}%
+    \@endpart}
+\def\@spart#1{%
+    {\centering
+     \interlinepenalty \@M
+     \normalfont
+     \Huge \bfseries #1\par}%
+    \@endpart}
+\def\@endpart{\vfil\newpage
+              \if@twoside
+                \null
+                \thispagestyle{empty}%
+                \newpage
+              \fi
+              \if@tempswa
+                \twocolumn
+              \fi}
+
+\newcommand\chapter{\clearpage
+                    \thispagestyle{empty}%
+                    \global\@topnum\z@
+                    \@afterindentfalse
+                    \secdef\@chapter\@schapter}
+\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
+                       \if@mainmatter
+                         \refstepcounter{chapter}%
+                         \typeout{\@chapapp\space\thechapter.}%
+                         \addcontentsline{toc}{chapter}%
+                                  {\protect\numberline{\thechapter}#1}%
+                       \else
+                         \addcontentsline{toc}{chapter}{#1}%
+                       \fi
+                    \else
+                      \addcontentsline{toc}{chapter}{#1}%
+                    \fi
+                    \chaptermark{#1}%
+                    \addtocontents{lof}{\protect\addvspace{10\p@}}%
+                    \addtocontents{lot}{\protect\addvspace{10\p@}}%
+                    \if@twocolumn
+                      \@topnewpage[\@makechapterhead{#2}]%
+                    \else
+                      \@makechapterhead{#2}%
+                      \@afterheading
+                    \fi}
+\def\@makechapterhead#1{%
+% \vspace*{50\p@}%
+  {\centering
+    \ifnum \c@secnumdepth >\m@ne
+      \if@mainmatter
+        \large\bfseries \@chapapp{} \thechapter
+        \par\nobreak
+        \vskip 20\p@
+      \fi
+    \fi
+    \interlinepenalty\@M
+    \Large \bfseries #1\par\nobreak
+    \vskip 40\p@
+  }}
+\def\@schapter#1{\if@twocolumn
+                   \@topnewpage[\@makeschapterhead{#1}]%
+                 \else
+                   \@makeschapterhead{#1}%
+                   \@afterheading
+                 \fi}
+\def\@makeschapterhead#1{%
+% \vspace*{50\p@}%
+  {\centering
+    \normalfont
+    \interlinepenalty\@M
+    \Large \bfseries  #1\par\nobreak
+    \vskip 40\p@
+  }}
+
+\renewcommand\section{\@startsection{section}{1}{\z@}%
+                       {-18\p@ \@plus -4\p@ \@minus -4\p@}%
+                       {12\p@ \@plus 4\p@ \@minus 4\p@}%
+                       {\normalfont\large\bfseries\boldmath
+                        \rightskip=\z@ \@plus 8em\pretolerance=10000 }}
+\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
+                       {-18\p@ \@plus -4\p@ \@minus -4\p@}%
+                       {8\p@ \@plus 4\p@ \@minus 4\p@}%
+                       {\normalfont\normalsize\bfseries\boldmath
+                        \rightskip=\z@ \@plus 8em\pretolerance=10000 }}
+\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
+                       {-18\p@ \@plus -4\p@ \@minus -4\p@}%
+                       {-0.5em \@plus -0.22em \@minus -0.1em}%
+                       {\normalfont\normalsize\bfseries\boldmath}}
+\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
+                       {-12\p@ \@plus -4\p@ \@minus -4\p@}%
+                       {-0.5em \@plus -0.22em \@minus -0.1em}%
+                       {\normalfont\normalsize\itshape}}
+\renewcommand\subparagraph[1]{\typeout{LLNCS warning: You should not use
+                  \string\subparagraph\space with this class}\vskip0.5cm
+You should not use \verb|\subparagraph| with this class.\vskip0.5cm}
+
+\DeclareMathSymbol{\Gamma}{\mathalpha}{letters}{"00}
+\DeclareMathSymbol{\Delta}{\mathalpha}{letters}{"01}
+\DeclareMathSymbol{\Theta}{\mathalpha}{letters}{"02}
+\DeclareMathSymbol{\Lambda}{\mathalpha}{letters}{"03}
+\DeclareMathSymbol{\Xi}{\mathalpha}{letters}{"04}
+\DeclareMathSymbol{\Pi}{\mathalpha}{letters}{"05}
+\DeclareMathSymbol{\Sigma}{\mathalpha}{letters}{"06}
+\DeclareMathSymbol{\Upsilon}{\mathalpha}{letters}{"07}
+\DeclareMathSymbol{\Phi}{\mathalpha}{letters}{"08}
+\DeclareMathSymbol{\Psi}{\mathalpha}{letters}{"09}
+\DeclareMathSymbol{\Omega}{\mathalpha}{letters}{"0A}
+
+\let\footnotesize\small
+
+\if@custvec
+\def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle#1$}}
+{\mbox{\boldmath$\textstyle#1$}}
+{\mbox{\boldmath$\scriptstyle#1$}}
+{\mbox{\boldmath$\scriptscriptstyle#1$}}}
+\fi
+
+\def\squareforqed{\hbox{\rlap{$\sqcap$}$\sqcup$}}
+\def\qed{\ifmmode\squareforqed\else{\unskip\nobreak\hfil
+\penalty50\hskip1em\null\nobreak\hfil\squareforqed
+\parfillskip=0pt\finalhyphendemerits=0\endgraf}\fi}
+
+\def\getsto{\mathrel{\mathchoice {\vcenter{\offinterlineskip
+\halign{\hfil
+$\displaystyle##$\hfil\cr\gets\cr\to\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr\gets
+\cr\to\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr\gets
+\cr\to\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
+\gets\cr\to\cr}}}}}
+\def\lid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil
+$\displaystyle##$\hfil\cr<\cr\noalign{\vskip1.2pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr<\cr
+\noalign{\vskip1.2pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr<\cr
+\noalign{\vskip1pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
+<\cr
+\noalign{\vskip0.9pt}=\cr}}}}}
+\def\gid{\mathrel{\mathchoice {\vcenter{\offinterlineskip\halign{\hfil
+$\displaystyle##$\hfil\cr>\cr\noalign{\vskip1.2pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr>\cr
+\noalign{\vskip1.2pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr>\cr
+\noalign{\vskip1pt}=\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
+>\cr
+\noalign{\vskip0.9pt}=\cr}}}}}
+\def\grole{\mathrel{\mathchoice {\vcenter{\offinterlineskip
+\halign{\hfil
+$\displaystyle##$\hfil\cr>\cr\noalign{\vskip-1pt}<\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\textstyle##$\hfil\cr
+>\cr\noalign{\vskip-1pt}<\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptstyle##$\hfil\cr
+>\cr\noalign{\vskip-0.8pt}<\cr}}}
+{\vcenter{\offinterlineskip\halign{\hfil$\scriptscriptstyle##$\hfil\cr
+>\cr\noalign{\vskip-0.3pt}<\cr}}}}}
+\def\bbbr{{\rm I\!R}} %reelle Zahlen
+\def\bbbm{{\rm I\!M}}
+\def\bbbn{{\rm I\!N}} %natuerliche Zahlen
+\def\bbbf{{\rm I\!F}}
+\def\bbbh{{\rm I\!H}}
+\def\bbbk{{\rm I\!K}}
+\def\bbbp{{\rm I\!P}}
+\def\bbbone{{\mathchoice {\rm 1\mskip-4mu l} {\rm 1\mskip-4mu l}
+{\rm 1\mskip-4.5mu l} {\rm 1\mskip-5mu l}}}
+\def\bbbc{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm C$}\hbox{\hbox
+to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\textstyle\rm C$}\hbox{\hbox
+to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptstyle\rm C$}\hbox{\hbox
+to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptscriptstyle\rm C$}\hbox{\hbox
+to0pt{\kern0.4\wd0\vrule height0.9\ht0\hss}\box0}}}}
+\def\bbbq{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm
+Q$}\hbox{\raise
+0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}}
+{\setbox0=\hbox{$\textstyle\rm Q$}\hbox{\raise
+0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.8\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptstyle\rm Q$}\hbox{\raise
+0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptscriptstyle\rm Q$}\hbox{\raise
+0.15\ht0\hbox to0pt{\kern0.4\wd0\vrule height0.7\ht0\hss}\box0}}}}
+\def\bbbt{{\mathchoice {\setbox0=\hbox{$\displaystyle\rm
+T$}\hbox{\hbox to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\textstyle\rm T$}\hbox{\hbox
+to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptstyle\rm T$}\hbox{\hbox
+to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptscriptstyle\rm T$}\hbox{\hbox
+to0pt{\kern0.3\wd0\vrule height0.9\ht0\hss}\box0}}}}
+\def\bbbs{{\mathchoice
+{\setbox0=\hbox{$\displaystyle     \rm S$}\hbox{\raise0.5\ht0\hbox
+to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox
+to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}}
+{\setbox0=\hbox{$\textstyle        \rm S$}\hbox{\raise0.5\ht0\hbox
+to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\hbox
+to0pt{\kern0.55\wd0\vrule height0.5\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptstyle      \rm S$}\hbox{\raise0.5\ht0\hbox
+to0pt{\kern0.35\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox
+to0pt{\kern0.5\wd0\vrule height0.45\ht0\hss}\box0}}
+{\setbox0=\hbox{$\scriptscriptstyle\rm S$}\hbox{\raise0.5\ht0\hbox
+to0pt{\kern0.4\wd0\vrule height0.45\ht0\hss}\raise0.05\ht0\hbox
+to0pt{\kern0.55\wd0\vrule height0.45\ht0\hss}\box0}}}}
+\def\bbbz{{\mathchoice {\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}}
+{\hbox{$\mathsf\textstyle Z\kern-0.4em Z$}}
+{\hbox{$\mathsf\scriptstyle Z\kern-0.3em Z$}}
+{\hbox{$\mathsf\scriptscriptstyle Z\kern-0.2em Z$}}}}
+
+\let\ts\,
+
+\setlength\leftmargini  {17\p@}
+\setlength\leftmargin    {\leftmargini}
+\setlength\leftmarginii  {\leftmargini}
+\setlength\leftmarginiii {\leftmargini}
+\setlength\leftmarginiv  {\leftmargini}
+\setlength  \labelsep  {.5em}
+\setlength  \labelwidth{\leftmargini}
+\addtolength\labelwidth{-\labelsep}
+
+\def\@listI{\leftmargin\leftmargini
+            \parsep 0\p@ \@plus1\p@ \@minus\p@
+            \topsep 8\p@ \@plus2\p@ \@minus4\p@
+            \itemsep0\p@}
+\let\@listi\@listI
+\@listi
+\def\@listii {\leftmargin\leftmarginii
+              \labelwidth\leftmarginii
+              \advance\labelwidth-\labelsep
+              \topsep    0\p@ \@plus2\p@ \@minus\p@}
+\def\@listiii{\leftmargin\leftmarginiii
+              \labelwidth\leftmarginiii
+              \advance\labelwidth-\labelsep
+              \topsep    0\p@ \@plus\p@\@minus\p@
+              \parsep    \z@
+              \partopsep \p@ \@plus\z@ \@minus\p@}
+
+\renewcommand\labelitemi{\normalfont\bfseries --}
+\renewcommand\labelitemii{$\m@th\bullet$}
+
+\setlength\arraycolsep{1.4\p@}
+\setlength\tabcolsep{1.4\p@}
+
+\def\tableofcontents{\chapter*{\contentsname\@mkboth{{\contentsname}}%
+                                                    {{\contentsname}}}
+ \def\authcount##1{\setcounter{auco}{##1}\setcounter{@auth}{1}}
+ \def\lastand{\ifnum\value{auco}=2\relax
+                 \unskip{} \andname\
+              \else
+                 \unskip \lastandname\
+              \fi}%
+ \def\and{\stepcounter{@auth}\relax
+          \ifnum\value{@auth}=\value{auco}%
+             \lastand
+          \else
+             \unskip,
+          \fi}%
+ \@starttoc{toc}\if@restonecol\twocolumn\fi}
+
+\def\l@part#1#2{\addpenalty{\@secpenalty}%
+   \addvspace{2em plus\p@}%  % space above part line
+   \begingroup
+     \parindent \z@
+     \rightskip \z@ plus 5em
+     \hrule\vskip5pt
+     \large               % same size as for a contribution heading
+     \bfseries\boldmath   % set line in boldface
+     \leavevmode          % TeX command to enter horizontal mode.
+     #1\par
+     \vskip5pt
+     \hrule
+     \vskip1pt
+     \nobreak             % Never break after part entry
+   \endgroup}
+
+\def\@dotsep{2}
+
+\def\hyperhrefextend{\ifx\hyper@anchor\@undefined\else
+{chapter.\thechapter}\fi}
+
+\def\addnumcontentsmark#1#2#3{%
+\addtocontents{#1}{\protect\contentsline{#2}{\protect\numberline
+                     {\thechapter}#3}{\thepage}\hyperhrefextend}}
+\def\addcontentsmark#1#2#3{%
+\addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}\hyperhrefextend}}
+\def\addcontentsmarkwop#1#2#3{%
+\addtocontents{#1}{\protect\contentsline{#2}{#3}{0}\hyperhrefextend}}
+
+\def\@adcmk[#1]{\ifcase #1 \or
+\def\@gtempa{\addnumcontentsmark}%
+  \or    \def\@gtempa{\addcontentsmark}%
+  \or    \def\@gtempa{\addcontentsmarkwop}%
+  \fi\@gtempa{toc}{chapter}}
+\def\addtocmark{\@ifnextchar[{\@adcmk}{\@adcmk[3]}}
+
+\def\l@chapter#1#2{\addpenalty{-\@highpenalty}
+ \vskip 1.0em plus 1pt \@tempdima 1.5em \begingroup
+ \parindent \z@ \rightskip \@tocrmarg
+ \advance\rightskip by 0pt plus 2cm
+ \parfillskip -\rightskip \pretolerance=10000
+ \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip
+ {\large\bfseries\boldmath#1}\ifx0#2\hfil\null
+ \else
+      \nobreak
+      \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern
+      \@dotsep mu$}\hfill
+      \nobreak\hbox to\@pnumwidth{\hss #2}%
+ \fi\par
+ \penalty\@highpenalty \endgroup}
+
+\def\l@title#1#2{\addpenalty{-\@highpenalty}
+ \addvspace{8pt plus 1pt}
+ \@tempdima \z@
+ \begingroup
+ \parindent \z@ \rightskip \@tocrmarg
+ \advance\rightskip by 0pt plus 2cm
+ \parfillskip -\rightskip \pretolerance=10000
+ \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip
+ #1\nobreak
+ \leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern
+ \@dotsep mu$}\hfill
+ \nobreak\hbox to\@pnumwidth{\hss #2}\par
+ \penalty\@highpenalty \endgroup}
+
+\def\l@author#1#2{\addpenalty{\@highpenalty}
+ \@tempdima=15\p@ %\z@
+ \begingroup
+ \parindent \z@ \rightskip \@tocrmarg
+ \advance\rightskip by 0pt plus 2cm
+ \pretolerance=10000
+ \leavevmode \advance\leftskip\@tempdima %\hskip -\leftskip
+ \textit{#1}\par
+ \penalty\@highpenalty \endgroup}
+
+\setcounter{tocdepth}{0}
+\newdimen\tocchpnum
+\newdimen\tocsecnum
+\newdimen\tocsectotal
+\newdimen\tocsubsecnum
+\newdimen\tocsubsectotal
+\newdimen\tocsubsubsecnum
+\newdimen\tocsubsubsectotal
+\newdimen\tocparanum
+\newdimen\tocparatotal
+\newdimen\tocsubparanum
+\tocchpnum=\z@            % no chapter numbers
+\tocsecnum=15\p@          % section 88. plus 2.222pt
+\tocsubsecnum=23\p@       % subsection 88.8 plus 2.222pt
+\tocsubsubsecnum=27\p@    % subsubsection 88.8.8 plus 1.444pt
+\tocparanum=35\p@         % paragraph 88.8.8.8 plus 1.666pt
+\tocsubparanum=43\p@      % subparagraph 88.8.8.8.8 plus 1.888pt
+\def\calctocindent{%
+\tocsectotal=\tocchpnum
+\advance\tocsectotal by\tocsecnum
+\tocsubsectotal=\tocsectotal
+\advance\tocsubsectotal by\tocsubsecnum
+\tocsubsubsectotal=\tocsubsectotal
+\advance\tocsubsubsectotal by\tocsubsubsecnum
+\tocparatotal=\tocsubsubsectotal
+\advance\tocparatotal by\tocparanum}
+\calctocindent
+
+\def\l@section{\@dottedtocline{1}{\tocchpnum}{\tocsecnum}}
+\def\l@subsection{\@dottedtocline{2}{\tocsectotal}{\tocsubsecnum}}
+\def\l@subsubsection{\@dottedtocline{3}{\tocsubsectotal}{\tocsubsubsecnum}}
+\def\l@paragraph{\@dottedtocline{4}{\tocsubsubsectotal}{\tocparanum}}
+\def\l@subparagraph{\@dottedtocline{5}{\tocparatotal}{\tocsubparanum}}
+
+\def\listoffigures{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
+ \fi\section*{\listfigurename\@mkboth{{\listfigurename}}{{\listfigurename}}}
+ \@starttoc{lof}\if@restonecol\twocolumn\fi}
+\def\l@figure{\@dottedtocline{1}{0em}{1.5em}}
+
+\def\listoftables{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
+ \fi\section*{\listtablename\@mkboth{{\listtablename}}{{\listtablename}}}
+ \@starttoc{lot}\if@restonecol\twocolumn\fi}
+\let\l@table\l@figure
+
+\renewcommand\listoffigures{%
+    \section*{\listfigurename
+      \@mkboth{\listfigurename}{\listfigurename}}%
+    \@starttoc{lof}%
+    }
+
+\renewcommand\listoftables{%
+    \section*{\listtablename
+      \@mkboth{\listtablename}{\listtablename}}%
+    \@starttoc{lot}%
+    }
+
+\ifx\oribibl\undefined
+\ifx\citeauthoryear\undefined
+\renewenvironment{thebibliography}[1]
+     {\section*{\refname}
+      \def\@biblabel##1{##1.}
+      \small
+      \list{\@biblabel{\@arabic\c@enumiv}}%
+           {\settowidth\labelwidth{\@biblabel{#1}}%
+            \leftmargin\labelwidth
+            \advance\leftmargin\labelsep
+            \if@openbib
+              \advance\leftmargin\bibindent
+              \itemindent -\bibindent
+              \listparindent \itemindent
+              \parsep \z@
+            \fi
+            \usecounter{enumiv}%
+            \let\p@enumiv\@empty
+            \renewcommand\theenumiv{\@arabic\c@enumiv}}%
+      \if@openbib
+        \renewcommand\newblock{\par}%
+      \else
+        \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
+      \fi
+      \sloppy\clubpenalty4000\widowpenalty4000%
+      \sfcode`\.=\@m}
+     {\def\@noitemerr
+       {\@latex@warning{Empty `thebibliography' environment}}%
+      \endlist}
+\def\@lbibitem[#1]#2{\item[{[#1]}\hfill]\if@filesw
+     {\let\protect\noexpand\immediate
+     \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
+\newcount\@tempcntc
+\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi
+  \@tempcnta\z@\@tempcntb\m@ne\def\@citea{}\@cite{\@for\@citeb:=#2\do
+    {\@ifundefined
+       {b@\@citeb}{\@citeo\@tempcntb\m@ne\@citea\def\@citea{,}{\bfseries
+        ?}\@warning
+       {Citation `\@citeb' on page \thepage \space undefined}}%
+    {\setbox\z@\hbox{\global\@tempcntc0\csname b@\@citeb\endcsname\relax}%
+     \ifnum\@tempcntc=\z@ \@citeo\@tempcntb\m@ne
+       \@citea\def\@citea{,}\hbox{\csname b@\@citeb\endcsname}%
+     \else
+      \advance\@tempcntb\@ne
+      \ifnum\@tempcntb=\@tempcntc
+      \else\advance\@tempcntb\m@ne\@citeo
+      \@tempcnta\@tempcntc\@tempcntb\@tempcntc\fi\fi}}\@citeo}{#1}}
+\def\@citeo{\ifnum\@tempcnta>\@tempcntb\else
+               \@citea\def\@citea{,\,\hskip\z@skip}%
+               \ifnum\@tempcnta=\@tempcntb\the\@tempcnta\else
+               {\advance\@tempcnta\@ne\ifnum\@tempcnta=\@tempcntb \else
+                \def\@citea{--}\fi
+      \advance\@tempcnta\m@ne\the\@tempcnta\@citea\the\@tempcntb}\fi\fi}
+\else
+\renewenvironment{thebibliography}[1]
+     {\section*{\refname}
+      \small
+      \list{}%
+           {\settowidth\labelwidth{}%
+            \leftmargin\parindent
+            \itemindent=-\parindent
+            \labelsep=\z@
+            \if@openbib
+              \advance\leftmargin\bibindent
+              \itemindent -\bibindent
+              \listparindent \itemindent
+              \parsep \z@
+            \fi
+            \usecounter{enumiv}%
+            \let\p@enumiv\@empty
+            \renewcommand\theenumiv{}}%
+      \if@openbib
+        \renewcommand\newblock{\par}%
+      \else
+        \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
+      \fi
+      \sloppy\clubpenalty4000\widowpenalty4000%
+      \sfcode`\.=\@m}
+     {\def\@noitemerr
+       {\@latex@warning{Empty `thebibliography' environment}}%
+      \endlist}
+      \def\@cite#1{#1}%
+      \def\@lbibitem[#1]#2{\item[]\if@filesw
+        {\def\protect##1{\string ##1\space}\immediate
+      \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
+   \fi
+\else
+\@cons\@openbib@code{\noexpand\small}
+\fi
+
+\def\idxquad{\hskip 10\p@}% space that divides entry from number
+
+\def\@idxitem{\par\hangindent 10\p@}
+
+\def\subitem{\par\setbox0=\hbox{--\enspace}% second order
+                \noindent\hangindent\wd0\box0}% index entry
+
+\def\subsubitem{\par\setbox0=\hbox{--\,--\enspace}% third
+                \noindent\hangindent\wd0\box0}% order index entry
+
+\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax}
+
+\renewenvironment{theindex}
+               {\@mkboth{\indexname}{\indexname}%
+                \thispagestyle{empty}\parindent\z@
+                \parskip\z@ \@plus .3\p@\relax
+                \let\item\par
+                \def\,{\relax\ifmmode\mskip\thinmuskip
+                             \else\hskip0.2em\ignorespaces\fi}%
+                \normalfont\small
+                \begin{multicols}{2}[\@makeschapterhead{\indexname}]%
+                }
+                {\end{multicols}}
+
+\renewcommand\footnoterule{%
+  \kern-3\p@
+  \hrule\@width 2truecm
+  \kern2.6\p@}
+  \newdimen\fnindent
+  \fnindent1em
+\long\def\@makefntext#1{%
+    \parindent \fnindent%
+    \leftskip \fnindent%
+    \noindent
+    \llap{\hb@xt@1em{\hss\@makefnmark\ }}\ignorespaces#1}
+
+\long\def\@makecaption#1#2{%
+  \vskip\abovecaptionskip
+  \sbox\@tempboxa{{\bfseries #1.} #2}%
+  \ifdim \wd\@tempboxa >\hsize
+    {\bfseries #1.} #2\par
+  \else
+    \global \@minipagefalse
+    \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+  \fi
+  \vskip\belowcaptionskip}
+
+\def\fps@figure{htbp}
+\def\fnum@figure{\figurename\thinspace\thefigure}
+\def \@floatboxreset {%
+        \reset@font
+        \small
+        \@setnobreak
+        \@setminipage
+}
+\def\fps@table{htbp}
+\def\fnum@table{\tablename~\thetable}
+\renewenvironment{table}
+               {\setlength\abovecaptionskip{0\p@}%
+                \setlength\belowcaptionskip{10\p@}%
+                \@float{table}}
+               {\end@float}
+\renewenvironment{table*}
+               {\setlength\abovecaptionskip{0\p@}%
+                \setlength\belowcaptionskip{10\p@}%
+                \@dblfloat{table}}
+               {\end@dblfloat}
+
+\long\def\@caption#1[#2]#3{\par\addcontentsline{\csname
+  ext@#1\endcsname}{#1}{\protect\numberline{\csname
+  the#1\endcsname}{\ignorespaces #2}}\begingroup
+    \@parboxrestore
+    \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
+  \endgroup}
+
+% LaTeX does not provide a command to enter the authors institute
+% addresses. The \institute command is defined here.
+
+\newcounter{@inst}
+\newcounter{@auth}
+\newcounter{auco}
+\newdimen\instindent
+\newbox\authrun
+\newtoks\authorrunning
+\newtoks\tocauthor
+\newbox\titrun
+\newtoks\titlerunning
+\newtoks\toctitle
+
+\def\clearheadinfo{\gdef\@author{No Author Given}%
+                   \gdef\@title{No Title Given}%
+                   \gdef\@subtitle{}%
+                   \gdef\@institute{No Institute Given}%
+                   \gdef\@thanks{}%
+                   \global\titlerunning={}\global\authorrunning={}%
+                   \global\toctitle={}\global\tocauthor={}}
+
+\def\institute#1{\gdef\@institute{#1}}
+
+\def\institutename{\par
+ \begingroup
+ \parskip=\z@
+ \parindent=\z@
+ \setcounter{@inst}{1}%
+ \def\and{\par\stepcounter{@inst}%
+ \noindent$^{\the@inst}$\enspace\ignorespaces}%
+ \setbox0=\vbox{\def\thanks##1{}\@institute}%
+ \ifnum\c@@inst=1\relax
+   \gdef\fnnstart{0}%
+ \else
+   \xdef\fnnstart{\c@@inst}%
+   \setcounter{@inst}{1}%
+   \noindent$^{\the@inst}$\enspace
+ \fi
+ \ignorespaces
+ \@institute\par
+ \endgroup}
+
+\def\@fnsymbol#1{\ensuremath{\ifcase#1\or\star\or{\star\star}\or
+   {\star\star\star}\or \dagger\or \ddagger\or
+   \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger
+   \or \ddagger\ddagger \else\@ctrerr\fi}}
+
+\def\inst#1{\unskip$^{#1}$}
+\def\fnmsep{\unskip$^,$}
+\def\email#1{{\tt#1}}
+\AtBeginDocument{\@ifundefined{url}{\def\url#1{#1}}{}%
+\@ifpackageloaded{babel}{%
+\@ifundefined{extrasenglish}{}{\addto\extrasenglish{\switcht@albion}}%
+\@ifundefined{extrasfrenchb}{}{\addto\extrasfrenchb{\switcht@francais}}%
+\@ifundefined{extrasgerman}{}{\addto\extrasgerman{\switcht@deutsch}}%
+}{\switcht@@therlang}%
+}
+\def\homedir{\~{ }}
+
+\def\subtitle#1{\gdef\@subtitle{#1}}
+\clearheadinfo
+%
+\renewcommand\maketitle{\newpage
+  \refstepcounter{chapter}%
+  \stepcounter{section}%
+  \setcounter{section}{0}%
+  \setcounter{subsection}{0}%
+  \setcounter{figure}{0}
+  \setcounter{table}{0}
+  \setcounter{equation}{0}
+  \setcounter{footnote}{0}%
+  \begingroup
+    \parindent=\z@
+    \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
+    \if@twocolumn
+      \ifnum \col@number=\@ne
+        \@maketitle
+      \else
+        \twocolumn[\@maketitle]%
+      \fi
+    \else
+      \newpage
+      \global\@topnum\z@   % Prevents figures from going at top of page.
+      \@maketitle
+    \fi
+    \thispagestyle{empty}\@thanks
+%
+    \def\\{\unskip\ \ignorespaces}\def\inst##1{\unskip{}}%
+    \def\thanks##1{\unskip{}}\def\fnmsep{\unskip}%
+    \instindent=\hsize
+    \advance\instindent by-\headlineindent
+    \if!\the\toctitle!\addcontentsline{toc}{title}{\@title}\else
+       \addcontentsline{toc}{title}{\the\toctitle}\fi
+    \if@runhead
+       \if!\the\titlerunning!\else
+         \edef\@title{\the\titlerunning}%
+       \fi
+       \global\setbox\titrun=\hbox{\small\rm\unboldmath\ignorespaces\@title}%
+       \ifdim\wd\titrun>\instindent
+          \typeout{Title too long for running head. Please supply}%
+          \typeout{a shorter form with \string\titlerunning\space prior to
+                   \string\maketitle}%
+          \global\setbox\titrun=\hbox{\small\rm
+          Title Suppressed Due to Excessive Length}%
+       \fi
+       \xdef\@title{\copy\titrun}%
+    \fi
+%
+    \if!\the\tocauthor!\relax
+      {\def\and{\noexpand\protect\noexpand\and}%
+      \protected@xdef\toc@uthor{\@author}}%
+    \else
+      \def\\{\noexpand\protect\noexpand\newline}%
+      \protected@xdef\scratch{\the\tocauthor}%
+      \protected@xdef\toc@uthor{\scratch}%
+    \fi
+    \addtocontents{toc}{\noexpand\protect\noexpand\authcount{\the\c@auco}}%
+    \addcontentsline{toc}{author}{\toc@uthor}%
+    \if@runhead
+       \if!\the\authorrunning!
+         \value{@inst}=\value{@auth}%
+         \setcounter{@auth}{1}%
+       \else
+         \edef\@author{\the\authorrunning}%
+       \fi
+       \global\setbox\authrun=\hbox{\small\unboldmath\@author\unskip}%
+       \ifdim\wd\authrun>\instindent
+          \typeout{Names of authors too long for running head. Please supply}%
+          \typeout{a shorter form with \string\authorrunning\space prior to
+                   \string\maketitle}%
+          \global\setbox\authrun=\hbox{\small\rm
+          Authors Suppressed Due to Excessive Length}%
+       \fi
+       \xdef\@author{\copy\authrun}%
+       \markboth{\@author}{\@title}%
+     \fi
+  \endgroup
+  \setcounter{footnote}{\fnnstart}%
+  \clearheadinfo}
+%
+\def\@maketitle{\newpage
+ \markboth{}{}%
+ \def\lastand{\ifnum\value{@inst}=2\relax
+                 \unskip{} \andname\
+              \else
+                 \unskip \lastandname\
+              \fi}%
+ \def\and{\stepcounter{@auth}\relax
+          \ifnum\value{@auth}=\value{@inst}%
+             \lastand
+          \else
+             \unskip,
+          \fi}%
+ \begin{center}%
+ \let\newline\\
+ {\Large \bfseries\boldmath
+  \pretolerance=10000
+  \@title \par}\vskip .8cm
+\if!\@subtitle!\else {\large \bfseries\boldmath
+  \vskip -.65cm
+  \pretolerance=10000
+  \@subtitle \par}\vskip .8cm\fi
+ \setbox0=\vbox{\setcounter{@auth}{1}\def\and{\stepcounter{@auth}}%
+ \def\thanks##1{}\@author}%
+ \global\value{@inst}=\value{@auth}%
+ \global\value{auco}=\value{@auth}%
+ \setcounter{@auth}{1}%
+{\lineskip .5em
+\noindent\ignorespaces
+\@author\vskip.35cm}
+ {\small\institutename}
+ \end{center}%
+ }
+
+% definition of the "\spnewtheorem" command.
+%
+% Usage:
+%
+%     \spnewtheorem{env_nam}{caption}[within]{cap_font}{body_font}
+% or  \spnewtheorem{env_nam}[numbered_like]{caption}{cap_font}{body_font}
+% or  \spnewtheorem*{env_nam}{caption}{cap_font}{body_font}
+%
+% New is "cap_font" and "body_font". It stands for
+% fontdefinition of the caption and the text itself.
+%
+% "\spnewtheorem*" gives a theorem without number.
+%
+% A defined spnewthoerem environment is used as described
+% by Lamport.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\@thmcountersep{}
+\def\@thmcounterend{.}
+
+\def\spnewtheorem{\@ifstar{\@sthm}{\@Sthm}}
+
+% definition of \spnewtheorem with number
+
+\def\@spnthm#1#2{%
+  \@ifnextchar[{\@spxnthm{#1}{#2}}{\@spynthm{#1}{#2}}}
+\def\@Sthm#1{\@ifnextchar[{\@spothm{#1}}{\@spnthm{#1}}}
+
+\def\@spxnthm#1#2[#3]#4#5{\expandafter\@ifdefinable\csname #1\endcsname
+   {\@definecounter{#1}\@addtoreset{#1}{#3}%
+   \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand
+     \csname the#3\endcsname \noexpand\@thmcountersep \@thmcounter{#1}}%
+   \expandafter\xdef\csname #1name\endcsname{#2}%
+   \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#4}{#5}}%
+                              \global\@namedef{end#1}{\@endtheorem}}}
+
+\def\@spynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname
+   {\@definecounter{#1}%
+   \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}%
+   \expandafter\xdef\csname #1name\endcsname{#2}%
+   \global\@namedef{#1}{\@spthm{#1}{\csname #1name\endcsname}{#3}{#4}}%
+                               \global\@namedef{end#1}{\@endtheorem}}}
+
+\def\@spothm#1[#2]#3#4#5{%
+  \@ifundefined{c@#2}{\@latexerr{No theorem environment `#2' defined}\@eha}%
+  {\expandafter\@ifdefinable\csname #1\endcsname
+  {\global\@namedef{the#1}{\@nameuse{the#2}}%
+  \expandafter\xdef\csname #1name\endcsname{#3}%
+  \global\@namedef{#1}{\@spthm{#2}{\csname #1name\endcsname}{#4}{#5}}%
+  \global\@namedef{end#1}{\@endtheorem}}}}
+
+\def\@spthm#1#2#3#4{\topsep 7\p@ \@plus2\p@ \@minus4\p@
+\refstepcounter{#1}%
+\@ifnextchar[{\@spythm{#1}{#2}{#3}{#4}}{\@spxthm{#1}{#2}{#3}{#4}}}
+
+\def\@spxthm#1#2#3#4{\@spbegintheorem{#2}{\csname the#1\endcsname}{#3}{#4}%
+                    \ignorespaces}
+
+\def\@spythm#1#2#3#4[#5]{\@spopargbegintheorem{#2}{\csname
+       the#1\endcsname}{#5}{#3}{#4}\ignorespaces}
+
+\def\@spbegintheorem#1#2#3#4{\trivlist
+                 \item[\hskip\labelsep{#3#1\ #2\@thmcounterend}]#4}
+
+\def\@spopargbegintheorem#1#2#3#4#5{\trivlist
+      \item[\hskip\labelsep{#4#1\ #2}]{#4(#3)\@thmcounterend\ }#5}
+
+% definition of \spnewtheorem* without number
+
+\def\@sthm#1#2{\@Ynthm{#1}{#2}}
+
+\def\@Ynthm#1#2#3#4{\expandafter\@ifdefinable\csname #1\endcsname
+   {\global\@namedef{#1}{\@Thm{\csname #1name\endcsname}{#3}{#4}}%
+    \expandafter\xdef\csname #1name\endcsname{#2}%
+    \global\@namedef{end#1}{\@endtheorem}}}
+
+\def\@Thm#1#2#3{\topsep 7\p@ \@plus2\p@ \@minus4\p@
+\@ifnextchar[{\@Ythm{#1}{#2}{#3}}{\@Xthm{#1}{#2}{#3}}}
+
+\def\@Xthm#1#2#3{\@Begintheorem{#1}{#2}{#3}\ignorespaces}
+
+\def\@Ythm#1#2#3[#4]{\@Opargbegintheorem{#1}
+       {#4}{#2}{#3}\ignorespaces}
+
+\def\@Begintheorem#1#2#3{#3\trivlist
+                           \item[\hskip\labelsep{#2#1\@thmcounterend}]}
+
+\def\@Opargbegintheorem#1#2#3#4{#4\trivlist
+      \item[\hskip\labelsep{#3#1}]{#3(#2)\@thmcounterend\ }}
+
+\if@envcntsect
+   \def\@thmcountersep{.}
+   \spnewtheorem{theorem}{Theorem}[section]{\bfseries}{\itshape}
+\else
+   \spnewtheorem{theorem}{Theorem}{\bfseries}{\itshape}
+   \if@envcntreset
+      \@addtoreset{theorem}{section}
+   \else
+      \@addtoreset{theorem}{chapter}
+   \fi
+\fi
+
+%definition of divers theorem environments
+\spnewtheorem*{claim}{Claim}{\itshape}{\rmfamily}
+\spnewtheorem*{proof}{Proof}{\itshape}{\rmfamily}
+\if@envcntsame % alle Umgebungen wie Theorem.
+   \def\spn@wtheorem#1#2#3#4{\@spothm{#1}[theorem]{#2}{#3}{#4}}
+\else % alle Umgebungen mit eigenem Zaehler
+   \if@envcntsect % mit section numeriert
+      \def\spn@wtheorem#1#2#3#4{\@spxnthm{#1}{#2}[section]{#3}{#4}}
+   \else % nicht mit section numeriert
+      \if@envcntreset
+         \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4}
+                                   \@addtoreset{#1}{section}}
+      \else
+         \def\spn@wtheorem#1#2#3#4{\@spynthm{#1}{#2}{#3}{#4}
+                                   \@addtoreset{#1}{chapter}}%
+      \fi
+   \fi
+\fi
+\spn@wtheorem{case}{Case}{\itshape}{\rmfamily}
+\spn@wtheorem{conjecture}{Conjecture}{\itshape}{\rmfamily}
+\spn@wtheorem{corollary}{Corollary}{\bfseries}{\itshape}
+\spn@wtheorem{definition}{Definition}{\bfseries}{\itshape}
+\spn@wtheorem{example}{Example}{\itshape}{\rmfamily}
+\spn@wtheorem{exercise}{Exercise}{\itshape}{\rmfamily}
+\spn@wtheorem{lemma}{Lemma}{\bfseries}{\itshape}
+\spn@wtheorem{note}{Note}{\itshape}{\rmfamily}
+\spn@wtheorem{problem}{Problem}{\itshape}{\rmfamily}
+\spn@wtheorem{property}{Property}{\itshape}{\rmfamily}
+\spn@wtheorem{proposition}{Proposition}{\bfseries}{\itshape}
+\spn@wtheorem{question}{Question}{\itshape}{\rmfamily}
+\spn@wtheorem{solution}{Solution}{\itshape}{\rmfamily}
+\spn@wtheorem{remark}{Remark}{\itshape}{\rmfamily}
+
+\def\@takefromreset#1#2{%
+    \def\@tempa{#1}%
+    \let\@tempd\@elt
+    \def\@elt##1{%
+        \def\@tempb{##1}%
+        \ifx\@tempa\@tempb\else
+            \@addtoreset{##1}{#2}%
+        \fi}%
+    \expandafter\expandafter\let\expandafter\@tempc\csname cl@#2\endcsname
+    \expandafter\def\csname cl@#2\endcsname{}%
+    \@tempc
+    \let\@elt\@tempd}
+
+\def\theopargself{\def\@spopargbegintheorem##1##2##3##4##5{\trivlist
+      \item[\hskip\labelsep{##4##1\ ##2}]{##4##3\@thmcounterend\ }##5}
+                  \def\@Opargbegintheorem##1##2##3##4{##4\trivlist
+      \item[\hskip\labelsep{##3##1}]{##3##2\@thmcounterend\ }}
+      }
+
+\renewenvironment{abstract}{%
+      \list{}{\advance\topsep by0.35cm\relax\small
+      \leftmargin=1cm
+      \labelwidth=\z@
+      \listparindent=\z@
+      \itemindent\listparindent
+      \rightmargin\leftmargin}\item[\hskip\labelsep
+                                    \bfseries\abstractname]}
+    {\endlist}
+
+\newdimen\headlineindent             % dimension for space between
+\headlineindent=1.166cm              % number and text of headings.
+
+\def\ps@headings{\let\@mkboth\@gobbletwo
+   \let\@oddfoot\@empty\let\@evenfoot\@empty
+   \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}%
+                  \leftmark\hfil}
+   \def\@oddhead{\normalfont\small\hfil\rightmark\hspace{\headlineindent}%
+                 \llap{\thepage}}
+   \def\chaptermark##1{}%
+   \def\sectionmark##1{}%
+   \def\subsectionmark##1{}}
+
+\def\ps@titlepage{\let\@mkboth\@gobbletwo
+   \let\@oddfoot\@empty\let\@evenfoot\@empty
+   \def\@evenhead{\normalfont\small\rlap{\thepage}\hspace{\headlineindent}%
+                  \hfil}
+   \def\@oddhead{\normalfont\small\hfil\hspace{\headlineindent}%
+                 \llap{\thepage}}
+   \def\chaptermark##1{}%
+   \def\sectionmark##1{}%
+   \def\subsectionmark##1{}}
+
+\if@runhead\ps@headings\else
+\ps@empty\fi
+
+\setlength\arraycolsep{1.4\p@}
+\setlength\tabcolsep{1.4\p@}
+
+\endinput
+%end of file llncs.cls
+ papers/ivor/macros.ltx view
@@ -0,0 +1,954 @@+%\usepackage{amstex}+\usepackage{amssymb}+\usepackage{latexsym}+\usepackage{eepic}+++%%%%%%%%% INFERENCE RULES++\newlength{\rulevgap}+\setlength{\rulevgap}{0.05in}+\newlength{\ruleheight}+\newlength{\ruledepth}+\newsavebox{\rulebox}+\newlength{\GapLength}+\newcommand{\gap}[1]{\settowidth{\GapLength}{#1} \hspace*{\GapLength}}+\newcommand{\dotstep}[2]{\begin{tabular}[b]{@{}c@{}}+                         #1\\$\vdots$\\#2+                         \end{tabular}}+\newlength{\fracwid}+\newcommand{\dotfrac}[2]{\settowidth{\fracwid}{$\frac{#1}{#2}$}+                         \addtolength{\fracwid}{0.1in}+                         \begin{tabular}[b]{@{}c@{}}+                         $#1$\\+                         \parbox[c][0.02in][t]{\fracwid}{\dotfill} \\+                         $#2$\\+                         \end{tabular}}+\newcommand{\Rule}[2]{\savebox{\rulebox}[\width][b]                         %+                              {\( \frac{\raisebox{0in} {\( #1 \)}}       %+                                       {\raisebox{-0.03in}{\( #2 \)}} \)}   %+                      \settoheight{\ruleheight}{\usebox{\rulebox}}          %+                      \addtolength{\ruleheight}{\rulevgap}                  %+                      \settodepth{\ruledepth}{\usebox{\rulebox}}            %+                      \addtolength{\ruledepth}{\rulevgap}                   %+                      \raisebox{0in}[\ruleheight][\ruledepth]               %+                               {\usebox{\rulebox}}}+\newcommand{\Case}[2]{\savebox{\rulebox}[\width][b]                         %+                              {\( \dotfrac{\raisebox{0in} {\( #1 \)}}       %+                                       {\raisebox{-0.03in}{\( #2 \)}} \)}   %+                      \settoheight{\ruleheight}{\usebox{\rulebox}}          %+                      \addtolength{\ruleheight}{\rulevgap}                  %+                      \settodepth{\ruledepth}{\usebox{\rulebox}}            %+                      \addtolength{\ruledepth}{\rulevgap}                   %+                      \raisebox{0in}[\ruleheight][\ruledepth]               %+                               {\usebox{\rulebox}}}+\newcommand{\Axiom}[1]{\savebox{\rulebox}[\width][b]                        %+                               {$\frac{}{\raisebox{-0.03in}{$#1$}}$}        %+                      \settoheight{\ruleheight}{\usebox{\rulebox}}          %+                      \addtolength{\ruleheight}{\rulevgap}                  %+                      \settodepth{\ruledepth}{\usebox{\rulebox}}            %+                      \addtolength{\ruledepth}{\rulevgap}                   %+                      \raisebox{0in}[\ruleheight][\ruledepth]               %+                               {\usebox{\rulebox}}}+\newcommand{\RuleSide}[3]{\gap{$#2$} \hspace*{0.1in}               %+                            \Rule{#1}{#3}                          %+                          \hspace*{0.1in}$#2$}+\newcommand{\AxiomSide}[2]{\gap{$#1$} \hspace*{0.1in}              %+                             \Axiom{#2}                            %+                           \hspace*{0.1in}$#1$}+\newcommand{\RULE}[1]{\textbf{#1}}+\newcommand{\hg}{\hspace{0.2in}}++\newcommand{\ProofState}+                      [2]{\parbox{10cm}{\AR{\hg\AR{#1}\\\Axiom{\hg#2\hg}}}}++%%%%%%%%%%%% TRISTUFF++\newcommand{\btr}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+\blacken\path(57,192)(57,12)(12,102)+	(57,192)(57,192)+\path(57,192)(57,12)(12,102)+	(57,192)(57,192)+\end{picture}+}++\newcommand{\btl}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+\blacken\path(12,192)(12,12)(57,102)+	(12,192)(12,192)+\path(12,192)(12,12)(57,102)+	(12,192)(12,192)+\end{picture}+}++\newcommand{\wtr}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+%\blacken\path(57,192)(57,12)(12,102)+%	(57,192)(57,192)+\path(57,192)(57,12)(12,102)+	(57,192)(57,192)+\end{picture}+}++\newcommand{\wtl}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+%\blacken\path(12,192)(12,12)(57,102)+%	(12,192)(12,192)+\path(12,192)(12,12)(57,102)+	(12,192)(12,192)+\end{picture}+}++++%%%%%%%%%%%% FONTS++\newcommand{\TC}[1]{\mathsf{#1}}+\newcommand{\DC}[1]{\mathsf{#1}}+\newcommand{\VV}[1]{\mathit{#1}}+\newcommand{\FN}[1]{\mathbf{#1}}+\newcommand{\HFN}[1]{\mathtt{#1}}+\newcommand{\RW}[1]{\underline{\textrm{#1}}}+\newcommand{\MO}[1]{\mbox{\textsc{#1}}}++\newcommand{\HF}[1]{\mathtt{#1}}++\newcommand{\MV}[1]{\nhole\mathit{#1}}+\newcommand{\Lang}[1]{\mathsf{#1}}+\newcommand{\Name}[1]{\mathit{#1}}++\newcommand{\demph}[1]{\textbf{#1}}+\newcommand{\remph}[1]{\emph{#1}}++%%%% Keywords for meta operations+\newcommand{\IF}{\;\RW{if}\;\;}+\newcommand{\THEN}{\RW{then}}+\newcommand{\ELSE}{\RW{else}}+\newcommand{\AND}{\RW{and}}+\newcommand{\Otherwise}{\RW{otherwise}}+\newcommand{\Do}{\RW{do}}+\newcommand{\Return}{\RW{return}}++\newcommand{\CASE}{\RW{case}}+\newcommand{\LET}{\RW{let}}+\newcommand{\IN}{\RW{in}}+\newcommand{\of}{\RW{of}}++\newcommand{\CLASS}{\mathtt{class}}+\newcommand{\INSTANCE}{\mathtt{instance}}++%%%%%%%%%%%% GROUPING++\newcommand{\G}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(2,10)(2,-10)+\end{picture}+}++\newcommand{\E}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(2,10)(2,-2)(4,-2)+\end{picture}+}++%\newcommand{\C}{+%\setlength{\unitlength}{1pt}+%\begin{picture}(4,10)(0,0)+%\path(4,8)(2,8)(2,-2)(4,-2)+%\end{picture}+%}++\newcommand{\M}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(2,10)(2,-2)(6,-2)+\end{picture}+}++\newcommand{\F}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(4,8)(2,8)(2,-6)+\end{picture}+}++\newcommand{\K}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(0,8)(4,8)+\end{picture}+}++\newcommand{\J}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(0,-2)(4,-2)+\end{picture}+}++\newcommand{\W}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\end{picture}+}++++%%%%%%%%%%%% GUBBINS++\newcommand{\mathskip}{\medskip}++\newcommand{\fbx}[1]{\fbox{$#1$}}+\newcommand{\stk}[1]{\begin{array}{c}#1\end{array}}+%\newcommand{\DM}[1]{\hg\mbox{$#1$}}+\newcommand{\DM}[1]{\mathskip\par\(#1\)\mathskip}+\newcommand{\mbx}[1]{\mathskip\par\noindent\(#1\)\mathskip}+\newcommand{\AR}[1]{\begin{array}[t]{@{}l}#1\end{array}}+\newcommand{\ARt}[1]{\begin{array}[t]{@{}l@{}cl}#1\end{array}}+\newcommand{\ARc}[1]{\begin{array}{@{}l}#1\end{array}}+\newcommand{\ARd}[1]{\begin{array}[t]{cl}#1\end{array}}+\newcommand{\EA}[1]{\begin{array}[t]{r@{}c@{}l}#1\end{array}}+\newcommand{\A}{@{\:}c}+%\newcommand{\R}{@{\:}r}+\newcommand{\CA}{c}+\newcommand{\LA}{l}+\newcommand{\PAc}[2]{\begin{array}{l#1@{}r@{}l}#2\end{array}}+\newcommand{\PA}[2]{\begin{array}[t]{l@{\:}l#1@{}r@{\:}l}#2\end{array}}+\newcommand{\DTREE}[3]{\begin{array}[t]{l#1@{}r@{\:}l#2}#3\end{array}}+\newcommand{\IDTREE}[2]{%+  \begin{array}[t]{l@{\:}c@{\:}l@{\:}r@{\:}l#1}#2\end{array}}+\newcommand{\IA}[2]+   {\begin{array}[t]{l@{\:}r@{\:}c@{\:}l@{\:}#1@{\:}r@{\:}l}#2\end{array}}+\newcommand{\IAc}[2]+   {\begin{array}[c]{r@{\:}c@{\:}l@{\:}#1@{}r@{}l}#2\end{array}}+\newcommand{\CS}[1]{\left\lfloor\begin{array}{@{}l}#1\end{array}\right.}+\newcommand{\BY}[3]{\multicolumn{2}{l}{\;\RW{by}\; #1} \\ %+    \multicolumn{#2}{l}{\CS{#3}} }+\newcommand{\WITH}[3]{\multicolumn{2}{l}{\;\RW{with}\; #1} \\ %+    \multicolumn{#2}{l}{\CS{#3}} }+\newcommand{\WithBy}{\RW{with-by}}+\newcommand{\Wb}[1]{\WithBy& #1}+\newcommand{\By}[1]{\multicolumn{2}{l}{\Leftarrow #1}}+\newcommand{\andby}{\Leftarrow}+\newcommand{\MyWith}[1]{\multicolumn{2}{l}{|\;#1}}+\newcommand{\Byr}[1]{\;\RW{by}\; #1}++\renewcommand{\Bar}{|}+\newcommand{\Bart}{\settowidth{\GapLength}{$\Bar$}%+                   \raisebox{6pt}[0pt][0pt]{$\Bar$}%+                   \hspace*{-1\GapLength}%+                   \Bar}+\newcommand{\With}[1]{\Bar & #1}+\newcommand{\Witt}[1]{\Bart & #1}++\newcommand{\B}{@{\:}r@{\:}c}+\newcommand{\Ret}[1]{\multicolumn{2}{l}{\cq #1}}+\newcommand{\MRet}[2]{\multicolumn{#1}{l}{\cq #2}}+\newcommand{\HRet}[1]{\multicolumn{2}{l}{\hq #1}}+\newcommand{\MHRet}[2]{\multicolumn{#1}{l}{\hq #2}}+\newcommand{\IRet}[1]{\multicolumn{2}{l}{\iq #1}}+\newcommand{\IMRet}[2]{\multicolumn{#1}{l}{\iq #2}}+\newcommand{\MoRet}[1]{\multicolumn{2}{l}{\mq #1}}+\newcommand{\MMoRet}[2]{\multicolumn{#1}{l}{\mq #2}}+\newcommand{\Data}{\RW{data}}+\newcommand{\Where}{\RW{where}}+\newcommand{\Let}{\RW{let}}+\newcommand{\Fact}{\RW{fact}}+\newcommand{\Rec}[1]{#1\textbf{-Rec}}+\newcommand{\Memo}[1]{#1\textbf{-Memo}}+\newcommand{\Elim}[1]{#1\textbf{-Elim}}+\newcommand{\Cases}[1]{#1\textbf{-Case}}+\newcommand{\View}[1]{#1\textbf{-View}}+\newcommand{\As}[2]{#1 \:\RW{as}\: #2}+\newcommand{\nhole}{\Box}+\newcommand{\turq}{\:\vdash_?\:}+\renewcommand{\split}{\;\lhd\;}+\newcommand{\CType}[2]{\{#1 \split\; #2\}}+\newcommand{\CC}[2]{(#1)\:#2}+\newcommand{\UP}[2]{#1 | \{#2\}}+\newcommand{\Ured}{\:\Downarrow\:}+\newcommand{\gdd}{\prec}+\newcommand{\HC}[1]{\left<#1\right>}+\newcommand{\HT}[2]{\left<#1 \hab #2\right>}++\newcommand{\view}{\RW{view}}+\newcommand{\ecase}{\RW{case}}+\newcommand{\rec}{\RW{rec}}++\newcommand{\If}{\mathsf{if}}+\newcommand{\Then}{\mathsf{then}}+\newcommand{\Else}{\mathsf{else}}+\newcommand{\elim}{\RW{elim}}++\newcommand{\Payload}{\mathsf{type}}+\newcommand{\Any}{\mathsf{Some}}++\newcommand{\lbl}[2]{\langle #1 \Hab #2 \rangle}+\newcommand{\call}[2]{\RW{call}\:\langle#1\rangle\:#2}+\newcommand{\return}[1]{\RW{return}\:#1}++\newcommand{\Remark}[1]{\noindent\textbf{Remark:} #1}++\newcommand{\DBOX}[2]{\fbox{\parbox{#1}{\textbf{Definition:}#2}}}++\newcommand{\FIG}[3]{\begin{figure}[h]\DM{#1}\caption{#2}\label{#3}\end{figure}}+\newcommand{\FFIG}[3]{\begin{figure}[h]\begin{center}\DM{#1}\end{center}\caption{#2}\label{#3}\end{figure}}+\newcommand{\FFIGTC}[3]{\begin{figure*}[t]\begin{center}\DM{#1}\end{center}\caption{#2}\label{#3}\end{figure*}}+\newcommand{\VFIG}[3]{\begin{figure}[h]\begin{boxedverbatim}#1\end{boxedverbatim}\caption{#2}\label{#3}\end{figure}}+\newcommand{\PFIG}[3]{\begin{figure}[p]\begin{center}\fbox{\DM{#1}}\end{center}\caption{#2}\label{#3}\end{figure}}+\newcommand{\CFIG}[3]{\begin{figure}[h]\begin{center}\DM{#1}\end{center}\caption{#2}\label{#3}\end{figure}}++\newcommand{\TFIG}[4]{\begin{figure}[h]\begin{center}\begin{tabular}{#1}#2\end{tabular}\end{center}\caption{#3}\label{#4}\end{figure}}+\newcommand{\TFIGTC}[4]{\begin{figure*}[t]\begin{center}\begin{tabular}{#1}#2\end{tabular}\end{center}\caption{#3}\label{#4}\end{figure*}}++\newcommand{\RESFIG}[3]{+\TFIG{|l|c|c|c|c|c|c|c|c|}{+\hline+    & \multicolumn{4}{c|}{\Naive{} compilation} &+          \multicolumn{4}{|c|}{Optimised compilation} \\+\cline{2-9}+\raisebox{1.5ex}[0pt]{Program} & Instrs & Thunks & Cells &+Accesses & Instructions & Thunks & Cells & Accesses \\+%\raisebox{1.5ex}[0pt]{Program} & I & T & C & M & I & T & C & M \\+\hline+#1+\hline+}{#2}{#3}}++\newcommand{\NEWRESFIG}[3]{+\TFIG{|l|l|c|c|c|c|}{+\hline+%    & \multicolumn{4}{c|}{\Naive{} compilation} &+%          \multicolumn{4}{|c|}{Optimised compilation} \\+%\cline{2-9}+Program & Version & Instructions & Thunks & Memory Accesses & Cells \\+%\raisebox{1.5ex}[0pt]{Program} & I & T & C & M & I & T & C & M \\+\hline+#1+}{#2}{#3}}++\newcommand{\NEWRESFIGTC}[3]{+\TFIGTC{|l|l|c|c|c|c|}{+\hline+%    & \multicolumn{4}{c|}{\Naive{} compilation} &+%          \multicolumn{4}{|c|}{Optimised compilation} \\+%\cline{2-9}+Program & Version & Instructions & Thunks & Memory Accesses & Cells \\+%\raisebox{1.5ex}[0pt]{Program} & I & T & C & M & I & T & C & M \\+\hline+#1+}{#2}{#3}}++\newcommand{\RESLINE}[9]{+& \Naive{} & #2 & #3 & #5 & #4 \\+#1+& Optimised & #6 & #7 & #9 & #8 \\+}+\newcommand{\RESCHANGE}[4]{+& Change & \textbf{#1} & \textbf{#2} & \textbf{#4} & \textbf{#3} \\+\hline+}+\newcommand{\RESCHANGEa}[5]{+#5 & Change & \textbf{#1} & \textbf{#2} & \textbf{#4} & \textbf{#3} \\+\hline+}++%%%%%%%%%%%% PUNCTUATION++\newcommand{\pad}[2]{#1#2#1}++\newcommand{\hab}{\pad{\,}{:}}+\newcommand{\Hab}{\pad{\;}{:}}+\newcommand{\HHab}{\pad{\;}{::}}++%%%%%%%%%%%% TYPE++\newcommand{\Type}{\star}+++%%%%%%%%%%%%% ARROWS++\newcommand{\To}{\pad{\:}{\rightarrow}}+%\newcommand{\car}{\vartriangleright}++%%%%%%%%%%%%% QUANTIFIERS++\newcommand{\lam}[2]{\lambda#1\pad{\!}{:}#2}+\newcommand{\fbind}[3]{(#1\Hab#2)\to#3}+\newcommand{\all}[2]{\forall#1\pad{\!}{:}#2}+\newcommand{\hole}[2]{?#1\pad{\!}{:}#2}+\newcommand{\guess}[3]{?#1\pad{\!}{:}#2\approx#3}+\newcommand{\remlam}[2]{\lambda\{#1\pad{\!}{:}#2\}}+\newcommand{\remall}[2]{\forall\{#1\pad{\!}{:}#2\}}+\newcommand{\allpi}[2]{\Pi#1\pad{\!}{:}#2}+\newcommand{\ali}[2]{\forall#1|#2}+\newcommand{\exi}[2]{\exists#1\pad{\!}{:}#2}+\newcommand{\wit}[2]{\ang{#1,#2}}+\newcommand{\X}{\times}+\newcommand{\sig}[2]{\Sigma#1\pad{\!}{:}#2}++\newcommand{\SC}{.\:}++\newcommand{\letbind}[3]{\mathsf{let}\:#1{:}#2\:=\:#3\:\mathsf{in}}+\newcommand{\ifthen}[3]{\mathsf{if}\:#1\:\mathsf{then}\:#2\:\mathsf{else}\:#3}++%%%%%%%%%%%%% EQUALITIES++\newcommand{\cq}{\pad{\:}{\mapsto}}+\newcommand{\xq}{\pad{}{\doteq}}+\newcommand{\pq}{\pad{\:}{=}}+\newcommand{\dq}{\pad{\:}{:=}}+\newcommand{\iq}{\pad{\:}{\leadsto}}+\newcommand{\mq}{\Longrightarrow}+\newcommand{\retq}{\Rightarrow}+\newcommand{\hq}{\pad{\:}{=}}+\newcommand{\defq}{\mapsto}++\newcommand{\refl}{\TC{refl}}+++++%%%%%%%%%%%%% CATSTUFF++\newlength{\Lwibrs}+\newlength{\Lwobrs}+\newsavebox{\Bwibrs}+\newsavebox{\Bwobrs}+\newcommand{\Db}[5]{%+  \savebox{\Bwobrs}[\width][b]{$#5$}%+  \savebox{\Bwibrs}[\width][b]{$\left#2\usebox{\Bwobrs}\right#3$}%+  \settowidth{\Lwobrs}{\usebox{\Bwobrs}}%+  \settowidth{\Lwibrs}{\usebox{\Bwibrs}}%+  \addtolength{\Lwibrs}{-\Lwobrs}%+  \left#1\pad{\hspace*{-0.25\Lwibrs}}{\usebox{\Bwibrs}}\right#4}+\newcommand{\LDb}[3]{%+  \savebox{\Bwobrs}[\width][b]{$#3$}%+  \savebox{\Bwibrs}[\width][b]{$\left#2\usebox{\Bwobrs}\right.$}%+  \settowidth{\Lwobrs}{\usebox{\Bwobrs}}%+  \settowidth{\Lwibrs}{\usebox{\Bwibrs}}%+  \addtolength{\Lwibrs}{-\Lwobrs}%+  \left#1\hspace*{-0.4\Lwibrs}\usebox{\Bwibrs}\right.}+\newcommand{\RDb}[3]{%+  \savebox{\Bwobrs}[\width][b]{$#3$}%+  \savebox{\Bwibrs}[\width][b]{$\left.\usebox{\Bwobrs}\right#1$}%+  \settowidth{\Lwobrs}{\usebox{\Bwobrs}}%+  \settowidth{\Lwibrs}{\usebox{\Bwibrs}}%+  \addtolength{\Lwibrs}{-\Lwobrs}%+  \left.\usebox{\Bwibrs}\hspace*{-0.4\Lwibrs}\right#2}+\newcommand{\Sc}{\Db{[}{[}{]}{]}}+\newcommand{\Mo}{\Db{|}{>}{<}{|}}+\newcommand{\MoL}{\LDb{|}{>}}+\newcommand{\MoR}{\RDb{<}{|}}++\newcommand{\car}{\mbox{$-\!\triangleright$}}+\newcommand{\io}[1]{\iota_{#1}}+\newcommand{\cc}{\diamond}+++%%%%%%%%%%%%% FNS++\newcommand{\Wk}{\Uparrow}++%%%%%%%%%%%%% Transformation++\newcommand{\Transform}[3]{\textsc{Trans}\:_{\Name{#1}}+   \interp{#2}\:\mq\:#3}+%\:[\:#2\:\Longrightarrow\:#3\:]}+\newcommand{\Morphism}[2]{\textsc{Morphism}\:#1\:\Longrightarrow\:#2}+\newcommand{\MI}[1]{\begin{array}{ll} #1 \end{array}\\}+\newcommand{\MorphItem}[2]{& #1 \:\Longrightarrow\: #2}++%%%%%%%%%%%%% Stuff++% Motive and methods++\newcommand{\motive}{\vP}+\newcommand{\meth}[1]{\vm_{#1}}++% Tuples+\newcommand{\tuple}[1]{\langle#1\rangle}+\newcommand{\Tuple}[1]{\mathsf{Tuple}}+\newcommand{\proj}{\mathsf{proj}}+\newcommand{\app}{\mathrm{+\!+}}++% Commenting out+\newcommand{\ig}[1]{[#1]}+\newcommand{\rem}[1]{\{\!#1\!\}}+\newcommand{\igc}[1]{[#1]}+\newcommand{\remc}[1]{\{\!#1\!\}}+++\newcommand{\ind}{\hspace*{0.1cm}}++% Content free type+\newcommand{\CF}{\TC{CF}}+\newcommand{\cf}{\DC{cf}}++% Error token+\newcommand{\error}{\DC{error}}+\newcommand{\fail}{\perp}++% Constructor stripping+\newcommand{\conarg}[2]{#1!#2}++\newcommand{\Vect}{\TC{Vect}}+\newcommand{\VectM}{\TC{Vect^-}}+\newcommand{\Vnil}{\DC{\epsilon}}+\newcommand{\Vcons}{\DC{::}}++\newcommand{\Vsnoc}{\DC{::}}++\newcommand{\VnilM}{\DC{\epsilon^-}}+\newcommand{\VconsM}{\DC{::^-}}++\newcommand{\Vnilcase}{\VV{vNilCase}}+\newcommand{\Vconscase}{\VV{vConsCase}}++\newcommand{\DSigma}{\TC{Sigma}}+\newcommand{\Exists}{\DC{Exists}}++\newcommand{\ListPair}[2]{\sig{#1}{\List\:\vA}.#2 = \FN{length}\:#1}+\newcommand{\lpNilDef}{\lpNil{\FN{refl}\:\Z}}+\newcommand{\lpNil}[1]{(\nil\:\vA,#1)}+\newcommand{\lpConsDef}[3]{\lpCons{#1}{(\FN{fst\:#2})}{\FN{resp}\:(\FN{snd}\:#2)}}+\newcommand{\lpCons}[3]{(\cons\:#1\:#2,#3)}+\newcommand{\lp}[2]{(#1, #2)}++\newcommand{\VnilTop}{\DC{vNil}^\ast}+\newcommand{\VconsTop}{\DC{vCons}^\ast}++\newcommand{\VnilBot}{\DC{\epsilon}^-}+\newcommand{\VconsBot}{\DC{::}^-}++\newcommand{\VectTop}{\TC{Vect}^\ast}+\newcommand{\VectBot}{\TC{Vect}^-}++\newcommand{\VectDrop}{\FN{vectDropIdx}}+\newcommand{\VectRebuild}{\FN{vectRebuild}}++\newcommand{\Prop}{\TC{Prop}}+\newcommand{\Set}{\TC{Set}}+\newcommand{\CoqType}{\TC{Type}}++\newcommand{\List}{\TC{List}}+\newcommand{\nil}{\DC{nil}}+\newcommand{\cons}{\DC{cons}}++\newcommand{\Zip}{\TC{Tsil}}+\newcommand{\zip}{\FN{tsil}}+\newcommand{\zipcons}{\FN{tsilcons}}+\newcommand{\snoc}{\DC{Snoc}}+\newcommand{\lin}{\DC{Empty}}++\newcommand{\BigInt}{\TC{BigInt}}+\newcommand{\False}{\TC{False}}+\newcommand{\Unit}{\TC{True}}+\newcommand{\UnitI}{\DC{()}}++\newcommand{\genType}{\TC{X}}+\newcommand{\genIndicesDec}{\tb\Hab\tB}+\newcommand{\genIndices}{\tb}+\newcommand{\genConArgsDec}[1]{\vec{\VV{a_#1}}\Hab\vec{\VV{A_#1}}}+\newcommand{\genConArgs}[1]{\vec{\VV{a_#1}}}+\newcommand{\genConIndicesDec}[1]{\vec{\VV{b_#1}}\Hab\vec{\VV{B_#1}}}+\newcommand{\genConIndices}[1]{\vec{\VV{b_#1}}}+\newcommand{\genCon}[1]{\DC{x}_#1}++\newcommand{\genTypeTop}{\TC{X^\ast}}+\newcommand{\genTypeBot}{\TC{X^-}}++\newcommand{\genTypeDrop}{\FN{XDropIdx}}+\newcommand{\genTypeRebuild}{\FN{XRebuild}}++\newcommand{\HTerm}{\texttt{Term}}+\newcommand{\Term}{\TC{Term}}+\newcommand{\Var}{\DC{var}}+\newcommand{\Lam}{\DC{lam}}+\newcommand{\App}{\DC{app}}+\newcommand{\TermM}{\TC{Term^-}}+\newcommand{\VarM}{\DC{var^-}}+\newcommand{\LamM}{\DC{lam^-}}+\newcommand{\AppM}{\DC{app^-}}+\newcommand{\Env}{\TC{Env}}+\newcommand{\SType}{\TC{STy}}+\newcommand{\farrow}{\Rightarrow}+\newcommand{\lookup}{\FN{lookup}}++\newcommand{\source}{\Lang{TT}}+\newcommand{\target}{\Lang{ExTT}}+\newcommand{\runtime}{\Lang{RunTT}}++\newcommand{\lt}{\TC{<}}+\newcommand{\ltO}{\DC{ltO}}+\newcommand{\ltS}{\DC{ltS}}++\newcommand{\interp}[1]{\llbracket #1 \rrbracket}+\newcommand{\inferrable}[2]{\FN{inferrable}(#1,#2)}+\newcommand{\mkPat}{\FN{mkPat}}++\newcommand{\FinM}{\TC{Fin^-}}+\newcommand{\fzM}{\DC{f0^-}}+\newcommand{\fsM}{\DC{fs^-}}++\newcommand{\concat}{\mathrm{++}}++%\newcommand{\bottom}{\perp}++% Reductions++\newcommand{\reduces}{\rhd}+\newcommand{\translation}{\Rightarrow}+%\newcommand{\reducesn}[1]{\reduces\hspace*{-0.15cm}_{#1}}+%\newcommand{\reducesto}{\reduces\hspace*{-0.15cm}^{*}}+\newcommand{\reducesn}[1]{\reduces_{#1}}+\newcommand{\reducesto}{\reduces^{*}}++% Equality++\newcommand{\Refl}{\DC{refl}}+\newcommand{\leZ}{\DC{O_{\le}}}+\newcommand{\leS}{\DC{S_{\le}}}++% Random elimination things++\newcommand{\lte}{\TC{\leq}}+\newcommand{\lten}{\DC{leN}}+\newcommand{\lteO}{\DC{leO}}+\newcommand{\lteS}{\DC{leS}}++\newcommand{\ltelim}{\Elim{\lt}}+\newcommand{\leelim}{\Elim{\lte}}++\newcommand{\dD}{\TC{D}}+\newcommand{\delim}{\Elim{\TC{D}}}+\newcommand{\drec}{\Rec{\TC{D}}}+\newcommand{\dcase}{\Cases{\TC{D}}}+\newcommand{\dview}{\View{\TC{D}}}+\newcommand{\dmemo}{\Memo{\TC{D}}}+\newcommand{\natrec}{\Rec{\Nat}}+\newcommand{\natmemo}{\Memo{\Nat}}+\newcommand{\natmemogen}{\Nat\textbf{-MemoGen}}+\newcommand{\natelim}{\Elim{\Nat}}+\newcommand{\boolcase}{\Cases{\Bool}}+\newcommand{\vectrec}{\Rec{\Vect}}+\newcommand{\vectelim}{\Elim{\Vect}}+\newcommand{\listrec}{\Rec{\List}}+\newcommand{\listelim}{\Elim{\List}}+\newcommand{\finrec}{\Rec{\Fin}}+\newcommand{\finelim}{\Elim{\Fin}}+\newcommand{\natcase}{\Cases{\Nat}}+\newcommand{\vectcase}{\Cases{\Vect}}+\newcommand{\natdoublerec}{\Nat\textbf{-double-elim}}+\newcommand{\eqelim}{=\textbf{-elim}}+\newcommand{\falsecase}{\Cases{\False}}++% Code+\newcommand{\Haskell}[1]{\begin{quotation}\begin{verbatim}#1\end{verbatim}\end{quotation}}++% Quicksort++\newcommand{\QSView}{\TC{QuickSort}}+\newcommand{\qsempty}{\DC{empty}}+\newcommand{\partition}{\DC{partition}}+\newcommand{\qsview}{\FN{mkQuickSort}}++% More gubbins++\newcommand{\converts}{\simeq}+\newcommand{\cumul}{\preceq}+\newcommand{\whnf}{\Downarrow}+\newcommand{\elem}{\in}+\newcommand{\proves}{\vdash}+\newcommand{\biimplies}{\Longleftrightarrow}++\newcommand{\lc}{\lambda_{\mathsf{AC}}}+\newcommand{\zed}{\mathbb{Z}}++% Haskell keywords++\newcommand{\hdata}{\mathtt{data}}+\newcommand{\newtype}{\mathtt{newtype}}+%\newcommand{\htype}{\mathtt{type}}++\newcommand{\HTC}[1]{\mathtt{#1}}+\newcommand{\HDC}[1]{\mathtt{#1}}++% Nobby++\newcommand{\Value}{\HTC{Value}}+\newcommand{\VGamma}{\HTC{Env}}+\newcommand{\Ctxt}{\HTC{Ctxt}}+\newcommand{\Defs}{\HTC{Defs}}+\newcommand{\ECtxt}{\HTC{ECtxt}}+\newcommand{\TCtxt}{\HTC{TCtxt}}+\newcommand{\VG}{\HDC{Env}}+\newcommand{\Model}{\HTC{Model}}+\newcommand{\Const}{\HTC{Const}}+\newcommand{\Normal}{\HTC{Normal}}+\newcommand{\Scope}{\HTC{Scope}}+\newcommand{\Kripke}{\HTC{Kripke}}+\newcommand{\Weakening}{\HTC{Weakening}}+\newcommand{\Ready}{\HTC{Ready}}+\newcommand{\Blocked}{\HTC{Blocked}}+\newcommand{\Spine}{\HTC{Spine}}++\newcommand{\BV}{\HDC{BV}}+\newcommand{\BCon}{\HDC{BCon}}+\newcommand{\BTyCon}{\HDC{BTyCon}}+\newcommand{\RCon}{\HDC{RCon}}+\newcommand{\RTyCon}{\HDC{RTyCon}}+\newcommand{\BElim}{\HDC{BElim}}+\newcommand{\DV}{\HDC{V}}+\newcommand{\DP}{\HDC{P}}++\newcommand{\MR}{\HDC{R}}+\newcommand{\MB}{\HDC{B}}+\newcommand{\DSc}{\HDC{Sc}}+\newcommand{\DKr}{\HDC{Kr}}+\newcommand{\DWk}{\HDC{Wk}}+\newcommand{\DSnoc}{\HDC{;}}+\newcommand{\DType}{\HDC{Type}}+\newcommand{\DName}{\HDC{Name}}+\newcommand{\DInt}{\HDC{Int}}+\newcommand{\DString}{\HDC{String}}+\newcommand{\DElim}{\HDC{Elim}}+\newcommand{\Empty}{\HDC{\emptyset}}++\newcommand{\ConCode}{\HTC{ConCode}}+\newcommand{\ElimRule}{\HTC{ElimRule}}++\newcommand{\DConst}{\HDC{Const}}+\newcommand{\DCon}{\HDC{Con}}+\newcommand{\DTyCon}{\HDC{TyCon}}+\newcommand{\RConst}{\HDC{RConst}}+\newcommand{\RLam}{\HDC{RLam}}+\newcommand{\RPi}{\HDC{RPi}}+\newcommand{\DLam}{\HDC{Lam}}+\newcommand{\DLet}{\HDC{Let}}+\newcommand{\DPi}{\HDC{Pi}}+\newcommand{\DApp}{\HDC{App}}++\newcommand{\TMaybe}{\HTC{Maybe}}+\newcommand{\DNothing}{\HDC{Nothing}}+\newcommand{\DJust}{\HDC{Just}}+++% G-machine and heap++\newcommand{\PUSH}{\mathsf{PUSH}}+\newcommand{\PUSHNAME}{\mathsf{PUSHNAME}}+\newcommand{\POP}{\mathsf{DISCARD}}+\newcommand{\PUSHFUN}{\mathsf{PUSHFUN}}+\newcommand{\APPLY}{\mathsf{MKAP}}+\newcommand{\EVAL}{\mathsf{EVAL}}+\newcommand{\GCON}{\mathsf{MKCON}}+\newcommand{\GTUP}{\mathsf{MKTUP}}+\newcommand{\GTYPE}{\mathsf{MKTYPE}}+\newcommand{\UPDATE}{\mathsf{UPDATE}}+\newcommand{\RET}{\mathsf{RET}}+\newcommand{\UNWIND}{\mathsf{UNWIND}}+\newcommand{\CASEJUMP}{\mathsf{CASEJUMP}}+\newcommand{\LABEL}{\mathsf{LABEL}}+\newcommand{\MOVE}{\mathsf{MOVE}}+\newcommand{\JUMP}{\mathsf{JUMP}}+\newcommand{\SPLIT}{\mathsf{SPLIT}}+\newcommand{\SQUEEZE}{\mathsf{SQUEEZE}}+\newcommand{\JFUN}{\mathsf{JFUN}}+\newcommand{\PROJ}{\mathsf{PROJ}}+\newcommand{\ERROR}{\mathsf{ERROR}}+\newcommand{\SLIDE}{\mathsf{SLIDE}}+\newcommand{\ALLOC}{\mathsf{ALLOC}}++\newcommand{\PUSHBIG}{\mathsf{PUSHBIG}}+\newcommand{\PUSHBASIC}{\mathsf{PUSHBASIC}}+\newcommand{\PUSHINT}{\mathsf{PUSHINT}}+\newcommand{\PUSHBOOL}{\mathsf{PUSHBOOL}}+\newcommand{\GET}{\mathsf{GET}}+\newcommand{\MKINT}{\mathsf{MKINT}}+\newcommand{\MKBOOL}{\mathsf{MKBOOL}}+\newcommand{\ADD}{\mathsf{ADD}}+\newcommand{\SUB}{\mathsf{SUB}}+\newcommand{\MULT}{\mathsf{MULT}}+\newcommand{\LT}{\mathsf{LT}}+\newcommand{\EQ}{\mathsf{EQ}}+\newcommand{\GT}{\mathsf{GT}}+\newcommand{\JTRUE}{\mathsf{JTRUE}}++\newcommand{\APP}{\mathsf{APP}}+\newcommand{\FUN}{\mathsf{FUN}}+\newcommand{\CON}{\mathsf{CON}}+\newcommand{\TYCON}{\mathsf{TYCON}}+\newcommand{\TUP}{\mathsf{TUP}}+\newcommand{\TYPE}{\mathsf{TYPE}}+\newcommand{\INT}{\mathsf{INT}}+\newcommand{\BIGINT}{\mathsf{BIGINT}}+\newcommand{\BOOL}{\mathsf{BOOL}}+\newcommand{\HOLE}{\mathsf{HOLE}}++% G machine translation scheme++\newcommand{\sinterp}[1]{\mathcal{S}\interp{#1}}+\newcommand{\sinterpm}[1]{\mathcal{S}\AR{\interp{#1}}}+\newcommand{\einterp}[3]{\mathcal{E}\interp{#1}\:#2\:#3}+\newcommand{\cinterp}[3]{\mathcal{C}\interp{#1}\:#2\:#3}+\newcommand{\binterp}[3]{\mathcal{B}\interp{#1}\:#2\:#3}+\newcommand{\rinterp}[3]{\mathcal{R}\interp{#1}\:#2\:#3}+\newcommand{\iinterp}[3]{\mathcal{I}\interp{#1}\:#2\:#3}+\newcommand{\len}[1]{\MO{length}(#1)}++\newcommand{\casecomp}[2]{\mathcal{I}(#1,\left\{\ARc{#2}\right\})}+\newcommand{\casecompA}[3]{\mathcal{I}(#1,\left\{\ARc{#2}\right\}[#3])}+\newcommand{\ischeme}{\mathcal{I}}++% tail call markup++\newcommand{\tailcall}{\mathsf{tail}}++% Trees++\newcommand{\Tree}{\TC{Tree}}+\newcommand{\Leaf}{\DC{Leaf}}+\newcommand{\Node}{\DC{Node}}+\newcommand{\treecase}{\Cases{\Tree}}++% Languages++\newcommand{\Coq}{\textsc{Coq}}+\newcommand{\Lego}{\textsc{Lego}}+\newcommand{\Oleg}{\textsc{Oleg}}+\newcommand{\Alf}{\textsc{Alf}}+\newcommand{\Epigram}{\textsc{Epigram}}+\newcommand{\SystemF}{System $\mathcal{F}$}+\newcommand{\Iswim}{\textsc{Iswim}}+\newcommand{\Cynthia}{\textit{C$^Y$\hspace*{-0.1cm}NTHIA}}++% Accessibility++\newcommand{\Acc}{\TC{Acc}}+\newcommand{\acc}{\DC{acc}}+\newcommand{\qsAcc}{\TC{qsAcc}}+\newcommand{\qsNil}{\DC{qsNil}}+\newcommand{\qsCons}{\DC{qsCons}}+\newcommand{\allQsAcc}{\FN{allQsAcc}}++% Lazy shortcuts++\newcommand{\naive}{na\"{\i}ve}+\newcommand{\Naive}{Na\"{\i}ve}++% Conor's bits++\newcommand{\remem}[1]{\left|#1\right|}+\newcommand{\idsb}{\MO{id}}+\newcommand{\ang}[1]{\langle#1\rangle}++\newcommand{\vePm}[1]{\vP #1 \vm_{\Vnil} #1 \vm_{\Vcons}}%+\newcommand{\vcrhs}{\vm_{\Vcons}\:\vk\:\va\:\vv\:%+                     (\vectelim\:\vA\:\vk\:\vv\:\vePm{\:})}%++\newcommand{\igV}[2]{#1^{\ig{#2}}}+\newcommand{\remV}[2]{#1^{\rem{#2}}}++\newcommand{\FIXME}[1]{[\textbf{FIXME}: #1]}+%\newcommand{\FIXME}[1]{\wibble}++% More gubbins++\newcommand{\Between}{\TC{between}}+\newcommand{\bZ}{\DC{bO}}+\newcommand{\bZZS}{\DC{bOOs}}+\newcommand{\bZSS}{\DC{b0ss}}+\newcommand{\bSSS}{\DC{bsss}}+\newcommand{\betelim}{\Elim{\Between}}+\newcommand{\betrhs}[1]{\motive#1\meth{\bZ}#1\meth{\bZZS}#1\meth{\bZSS}#1\meth{\bSSS}}+++\newcommand{\valenv}{\TC{ValEnv}}+\newcommand{\vempty}{\DC{empty}}+\newcommand{\vextend}{\DC{extend}}++\newcommand{\EpiVal}{\TC{Epigram}}+\newcommand{\unsafeCoerce}{\HF{unsafeCoerce\mbox{\texttt{\#}}}}++\newcommand{\qq}{\mbox{\texttt{"}}}+\newcommand{\impossible}{\RW{Impossible}}++\newcommand{\Real}{\mathbb{R}}++\newcommand{\DoubleRec}{\TC{DoubleElim}}+\newcommand{\DoubleOn}{\DC{Double_{\Z\vn}}}+\newcommand{\DoubleSO}{\DC{Double_{\suc\Z}}}+\newcommand{\DoubleSS}{\DC{Double_{\suc\suc}}}++\newcommand{\doublerec}{\textbf{double-elim}}++\newcommand{\set}{\TC{DList}}+\newcommand{\setuser}{\TC{DListTop}}+\newcommand{\setempty}{\emptyset}+\newcommand{\setinsert}{\DC{insert}}+++%%%% Type systems++\newcommand{\stlc}{\lambda\hspace*{-0.15cm}\to}+\newcommand{\plc}{\lambda2}+\newcommand{\dlc}{\lambda{}P}++\newcommand{\EC}{\mathcal{E}}++%%%% reductions++\newcommand{\betared}{\iq\hspace*{-0.15cm}_{\beta}}+\newcommand{\deltared}{\iq\hspace*{-0.15cm}_{\delta}}+\newcommand{\gammared}{\iq\hspace*{-0.15cm}_{\gamma}}+\newcommand{\etared}{\iq\hspace*{-0.15cm}_{\eta}}+\newcommand{\iotared}{\iq\hspace*{-0.15cm}_{\iota}}+\newcommand{\rhored}{\iq\hspace*{-0.15cm}_{\rho}}++%%%% ExTT rules++\newcommand{\exconverts}{\stackrel{\mathsf{Ex}}{\converts}}+\newcommand{\excumul}{\stackrel{\mathsf{Ex}}{\cumul}}+\newcommand{\exequiv}{\stackrel{\mathsf{Ex}}{\equiv}}+\newcommand{\exreduces}{\stackrel{\mathsf{Ex}}\reduces}+\newcommand{\exreducesto}{\stackrel{\mathsf{Ex}}{\reducesto}}+\newcommand{\exreducesn}[1]{\exreduces_{#1}}++\newcommand{\ttequiv}{\stackrel{\mathsf{TT}}{\equiv}}+\newcommand{\ttreduces}{\stackrel{\mathsf{TT}}\reduces}+\newcommand{\ttreducesn}[1]{\ttreduces_{#1}}++%%% Type synthesis++\newcommand{\hastype}{\Longrightarrow}+\newcommand{\whnfs}{\twoheadrightarrow}+\newcommand{\conv}{\converts}++\newcommand{\exhastype}{\stackrel{\mathsf{Ex}}{\hastype}}+\newcommand{\exwhnfs}{\stackrel{\mathsf{Ex}}{\whnfs}}+\newcommand{\exconv}{\stackrel{\mathsf{Ex}}{\conv}}+\newcommand{\exproves}{\stackrel{\mathsf{Ex}}{\proves}}++\newcommand{\tthastype}{\stackrel{\mathsf{TT}}{\hastype}}+\newcommand{\ttwhnfs}{\stackrel{\mathsf{TT}}{\whnfs}}+\newcommand{\ttconv}{\stackrel{\mathsf{TT}}{\conv}}+\newcommand{\ttproves}{\stackrel{\mathsf{TT}}{\proves}}++%%% Lightning++\newcommand{\light}[1]{\lightning^{#1}}+\newcommand{\LHab}[1]{\pad{\;}{:^{#1}}}+\newcommand{\llam}[3]{\lambda#1\pad{\!}{:}^{#2}#3}+\newcommand{\lall}[3]{\forall#1\pad{\!}{:}^{#2}#3}+\newcommand{\lapp}[3]{#1(#2)^{#3}}+\newcommand{\larg}[2]{(#1)^{#2}}++\newcommand{\RName}[1]{\hspace*{0.1in}\mathsf{#1}}
+ papers/ivor/tactics.tex view
@@ -0,0 +1,489 @@+\section{The \Ivor{} Library}++%Given the basic operations defined in section \ref{holeops}, we can+%create a library of tactics. ++The \Ivor{} library allows the incremental, type directed development+of $\source$ terms.  In this section, I will introduce the basic+tactics available to the library user, along with the Haskell+interface for constructing and manipulating $\source$ terms. This+section includes only the most basic operations; the API is however+fully documented on the+web\footnote{\url{http://www.cs.st-andrews.ac.uk/~eb/Ivor/doc/}}.++\subsection{Definitions and Context}++The central data type is \hdecl{Context} (representing $\Gamma$ in the+typing rules), which is an abstract type holding information about+inductive types and function definitions as well as the current proof+state. All operations are defined with respect to the context. An+empty context is contructed with \hdecl{emptyContext :: Context}.++Terms may be represented several ways; either as concrete syntax (a+\texttt{String}), an abstract internal representation (\texttt{Term})+or as a Haskell data structure (\texttt{ViewTerm}). A typeclass+\hdecl{IsTerm} is defined, which allows each of these to be converted+into the internal representation. This typeclass has one method:++\begin{verbatim}+class IsTerm a where+    check :: Monad m => Context -> a -> m Term+\end{verbatim}++The \texttt{check} method parses and typechecks the given term, as+appropriate, and if successful returns the internal representation. +Constructing a term in this way may fail (e.g. due to a syntax or+type error) so \texttt{check} is generalised over a monad+\hdecl{m} --- it may help to read \hdecl{m} as \hdecl{Maybe}.+In this paper, for the sake of readability we will use the syntax+described in section \ref{corett}, and assume an instance of+\hdecl{IsTerm} for this syntax.++Similarly, there is a typeclass for inductive families,+which may be represented either as concrete syntax or a Haskell data+structure.++\begin{verbatim}+class IsData a where+    addData :: Monad m => Context -> a -> m Context+\end{verbatim}++The \hdecl{addData} method adds the constructors and elimination+rules for the data type to the context. Again, we assume an instance+for the syntax presented in section \ref{indfamilies}.++The simplest way to add new function definitions to the context is+with the \hdecl{addDef} function. Such definitions may not be recursive,+other than via the automatically generated elimination rules, ensuring+termination:++\begin{verbatim}+addDef :: (IsTerm a, Monad m) => Context -> Name -> a -> m Context+\end{verbatim}++However, \Ivor{} is primarily a library for constructing proofs; the+Curry-Howard correspondence~\cite{curry-feys,howard} identifies+programs and proofs, and therefore such definitions can be viewed as+proofs; to prove a theorem is to add a well-typed definition to the+context.  We would like to be able to construct more complex proofs+(and indeed programs) interactively --- and so at the heart of \Ivor{}+is a theorem proving engine.++\subsection{Theorems}++In the \hdecl{emptyContext}, there is no proof in progress, so no+proof state --- the \hdecl{theorem} function creates a proof state in+a context. This will fail if there is already a proof in progress, or+the goal is not well typed.++\begin{verbatim}+theorem :: (IsTerm a, Monad m) => Context -> Name -> a -> m Context+\end{verbatim}++A proof state can be thought of as an incomplete term, i.e. a+term in the development calculus. +For example, calling \hdecl{theorem}+with the name $\FN{plus}$ and type $\Nat\to\Nat\to\Nat$, an initial+proof state would be:++\DM{+\FN{plus}\:=\:\hole{\VV{plus}}{\Nat\to\Nat\to\Nat}+}++This theorem is, in fact, a specification (albeit imprecise) of a+program for adding two unary natural numbers, exploiting the+Curry-Howard isomorphism.  Proving a theorem (i.e. also writing a+program interactively) proceeds by applying tactics to each unsolved+hole in the proof state. The system keeps track of which subgoals are+still to be solved, and a default subgoal, which is the next subgoal+to be solved. I will write proof states in the following form:++\DM{+\Rule{+\AR{+\mbox{\textit{bindings in the context of the subgoal $\vx_0$}} \\+\ldots\\+}+}+{+\AR{+\hole{\vx_0}{\mbox{\textit{default subgoal type}}} \\+\ldots \\+\hole{\vx_i}{\mbox{\textit{other subgoal types}}} \\+\ldots+}+}+}++Functions are available for querying the bindings in the context of+any subgoal. A tactic typically works on the bindings in scope and the+type of the subgoal it is solving.++When there are no remaining subgoals, a proof can be lifted into the+context, to be used as a complete definition, with the \texttt{qed}+function:++\begin{verbatim}+qed :: Monad m => Context -> m Context+\end{verbatim}++This function typechecks the entire proof. In practice, this check+should never fail --- the development calculus itself ensures that+partial constructions as well as complete terms are well-typed, so it+is impossible to build ill-typed partial constructions. However, doing+a final typecheck of a complete term means that the soundness of the+system relies only on the soundness of the typechecker for the core+language, e.g.~\cite{coq-in-coq}.  We are free to implement tactics in+any way we like, knowing that any ill-typed constructions will be+caught by the typechecker.++%% but if the tactics are correctly implemented this check will always succeed.++\subsection{Basic Tactics}++A tactic is an operation on a goal in the current system state; we+define a type synonym \hdecl{Tactic} for functions which operate as+tactics. Tactics modify system state and may fail, hence a tactic+function returns a monad:+%+\begin{verbatim}+type Tactic = forall m . Monad m => Goal -> Context -> m Context+\end{verbatim}+%+A tactic operates on a hole binding, specified by the \texttt{Goal}+argument. This can be a named binding, \texttt{goal :: Name -> Goal},+or the default goal \texttt{defaultGoal :: Goal}. The default goal is+the first goal generated by the most recent tactic application.++\subsubsection{Hole Manipulations}+There are three basic operations on holes, \demph{claim}, \demph{fill},+and \demph{abandon}; these are given the following types:+%+\begin{verbatim}+claim :: IsTerm a => Name -> a -> Tactic+fill :: IsTerm a => a -> Tactic+abandon :: Tactic+\end{verbatim}+%+The \hdecl{claim} function takes a name and a type and creates a new+hole. The \hdecl{fill} function takes a guess to attach to the current+goal. In addition, \hdecl{fill} attempts to solve other goals by+unification. Attaching a guess does not necessarily solve the goal+completely; if the guess contains further hole bindings, it cannot yet+have any computational force. +%% The \hdecl{solve} tactic is provided to+%% check whether a guess is \demph{pure} (i.e. does not contain any hole+%% bindings or guesses itself) and converts it to a $\RW{let}$ binding if+%% so.  +A guess can be removed from a goal with the \hdecl{abandon}+tactic.++%% It can be inconvenient to have to \texttt{solve} every goal after a+%% \texttt{fill} (although sometimes this level of control is+%% useful). For this reason, \texttt{fill} and other tactics will+%% automatically solve all goals with hole-free guesses attached. More+%% fine-grained tactics are available, but are beyond the scope of this paper.++\subsubsection{Introductions}+A basic operation on terms is to introduce $\lambda$ bindings into the+context. The \texttt{intro} and \texttt{introName} tactics operate on+a goal of the form $\fbind{\vx}{\vS}{\vT}$, introducing+$\lam{\vx}{\vS}$ into the context and updating the goal to+$\vT$. That is, a goal of this form is solved by a $\lambda$-binding.+\texttt{introName} allows a user specified name choice,+otherwise \Ivor{} chooses the name.+%+\begin{verbatim}+intro :: Tactic+introName :: Name -> Tactic+\end{verbatim}+%+For example, to define our addition function, we might begin with++\DM{+\Axiom{+\hole{\VV{plus}}{\Nat\to\Nat\to\Nat}+}+}++Applying \texttt{introName} twice with the names $\vx$ and $\vy$ gives+the following proof state, with $\vx$ and $\vy$ introduced into the+local context:+\DM{+\Rule{+\AR{+\lam{\vx}{\Nat}\\+\lam{\vy}{\Nat}+}+}+{\hole{\VV{plus\_H}}{\Nat}}+}++\subsubsection{Refinement}+The \texttt{refine} tactic solves a goal by an application of a+function to arguments. Refining attempts to solve a goal of type+$\vT$, when given a term of the form $\vt\Hab\fbind{\tx}{\tS}{\vT}$. The tactic+creates a subgoal for each argument $\vx_i$, attempting to solve it by+unification.+%+\begin{verbatim}+refine :: IsTerm a => a -> Tactic+\end{verbatim}+%+For example, given a goal+\DM{+\Axiom{+\hole{\vv}{\Vect\:\Nat\:(\suc\:\vn)}}+}++\noindent+Refining by $\Vcons$ creates subgoals for each argument, attaching+a guess to $\vv$:+\DM{+\Axiom{+\AR{+\hole{\vA}{\Type}\\+\hole{\vk}{\Nat}\\+\hole{\vx}{\vA}\\+\hole{\vxs}{\Vect\:\vA\:\vk}\\+\guess{\vv}{\Vect\:\Nat\:(\suc\:\vn)}{\Vcons\:\vA\:\vk\:\vx\:\vxs}+}+}+}++\noindent+However, for $\Vcons\:\vA\:\vk\:\vx\:\vxs$ to have type+$\Vect\:\Nat\:(\suc\:\vn)$ requires that $\vA=\Nat$ and $\vk=\vn$.+Refinement unifies these, leaving the+following goals:+\DM{+\Axiom{+\AR{+\hole{\vx}{\Nat}\\+\hole{\vxs}{\Vect\:\Nat\:\vn}\\+\guess{\vv}{\Vect\:\Nat\:(\suc\:\vn)}{\Vcons\:\Nat\:\vn\:\vx\:\vxs}+}+}+}+++\subsubsection{Elimination}+Refinement solves goals by constructing new values; we may also solve+goals by deconstructing values in the context, using an elimination+operator as described in section \ref{elimops}. The \texttt{induction}+and \texttt{cases} tactics apply the $\delim$ and $\dcase$ operators+respectively to the given target:+%+\begin{verbatim}+induction, cases :: IsTerm a => a -> Tactic+\end{verbatim}+%+These tactics proceed by refinement by the appropriate elimination+operator. The motive for the elimination is calculated automatically+from the goal to be solved. Each tactic generates subgoals for each+method of the appropriate elimination rule.++%% A more general elimination tactic is \texttt{by}, which takes an+%% application of an elimination operator to a target.++%% \begin{verbatim}+%% by :: IsTerm a => a -> Tactic+%% \end{verbatim}++%% The type of the term given to \texttt{by} must be a function expecting+%% a motive and methods.++An example of \texttt{induction} is in continuing the definition of+our addition function. This can be defined by induction over the first+argument. We have the proof state++\DM{+\Rule{+\AR{+\lam{\vx}{\Nat}\\+\lam{\vy}{\Nat}+}+}+{\hole{\VV{plus\_H}}{\Nat}}+}++Applying \texttt{induction} to $\vx$ leaves two subgoals, one for the+case where $\vx$ is zero, and one for the inductive+case\footnote{c.f. the Haskell function \texttt{natElim+    :: Nat -> a -> (Nat -> a -> a) -> a)}}:++\DM{+\Rule{+\AR{+\lam{\vx}{\Nat}\\+\lam{\vy}{\Nat}+}+}+{+\AR{+\hole{\VV{plus\_O}}{\Nat}\\+\hole{\VV{plus\_S}}{\fbind{\vk}{\Nat}{\fbind{\VV{k\_H}}{\Nat}{\Nat}}}+}+}+}++By default, the next goal to solve is $\VV{plus\_O}$. However, the+\hdecl{focus} tactic can be used to change the default goal.+The $\VV{k\_H}$ argument to the $\VV{plus\_S}$ goal is the result of a+recursive call on $\vk$.++\subsubsection{Rewriting}+It is often desirable to rewrite a goal given an equality proof, to+perform equational reasoning. The \texttt{replace} tactic replaces+occurrences of the left hand side of an equality with the right hand+side. To do this, it requires:++\begin{enumerate}+\item The equality type; for example+  $\TC{Eq}\Hab\fbind{\vA}{\Type}{\vA\to\vA\to\Type}$.+\item A replacement lemma, which explains how to substitute one term+  for another; for example\\+  $\FN{repl}\Hab\fbind{\vA}{\Type}{+    \fbind{\va,\vb}{\vA}{+	\TC{Eq}\:\_\:\va\:\vb\to\fbind{\vP}{\vA\to\Type}{+	  \vP\:\va\to\vP\:\vb}}}$+\item A symmetry lemma, proving that equality is symmetric; for+  example\\+  $\FN{sym}\Hab\fbind{\vA}{\Type}{+      \fbind{\va,\vb}{\vA}{\TC{Eq}\:\_\:\va\:\vb\to\TC{Eq}\:\_\:\vb\:\va}}$+\item An equality proof.+\end{enumerate}++The \Ivor{} distribution contains a library of $\source$ code with the+appropriate definitions and lemmas. Requiring the lemmas to be+supplied as arguments makes the library more flexible --- for example,+heterogeneous equality~\cite{mcbride-thesis} may be preferred. The+tactic will fail if terms of inappropriate types are given; recall+from sec. \ref{sec:devcalc} that the development calculus requires+that incomplete terms are also well-typed, so that all tactic+applications can be typechecked. The type is:+\begin{verbatim}+replace :: (IsTerm a, IsTerm b, IsTerm c, IsTerm d) =>+               a -> b -> c -> d -> Bool -> Tactic+\end{verbatim}+The \texttt{Bool} argument determines whether to apply the symmetry+lemma to the equality proof first, which allows rewriting from right+to left.+This \hdecl{replace} tactic is+similar to \Lego{}'s \texttt{Qrepl} tactic \cite{lego-manual}.++For example, consider the following fragment of proof state:++\DM{+\Rule{+\AR{+\ldots\\+\lam{\vx}{\Vect\:\vA\:(\FN{plus}\:\vx\:\vy)}+}+}+{+\hole{\VV{vect\_H}}{\Vect\:\vA\:(\FN{plus}\:\vy\:\vx)}+}+}++Since $\FN{plus}$ is commutative, $\vx$ ought to be a vector of the+correct length. However, the type of $\vx$ is not convertible to the+type of $\VV{vect\_H}$. Given a lemma $\FN{plus\_commutes}\Hab+\fbind{\vn,\vm}{\Nat}{\TC{Eq}\:\_\:(\FN{plus}\:\vn\:\vm)\:(\FN{plus}\:\vm\:\vn)}$,+we can use the \texttt{replace} tactic to rewrite the goal to the+correct form. Applying \texttt{replace} to $\TC{Eq}$, $\FN{repl}$,+$\FN{sym}$ and $\FN{plus\_commutes}\:\vy\:\vx$ yields the following+proof state, which is easy to solve using the \texttt{fill} tactic+with $\vx$.++++\DM{+\Rule{+\AR{+\ldots\\+\lam{\vx}{\Vect\:\vA\:(\FN{plus}\:\vx\:\vy)}+}+}+{+\hole{\VV{vect\_H}}{\Vect\:\vA\:(\FN{plus}\:\vx\:\vy)}+}+}++\subsection{Tactic Combinators}++\label{combinators}++\Ivor{} provides an embedded domain specific language for+building tactics, in the form of a number of+combinators for building more complex tactics from the basic tactics+previously described. By providing an API for basic tactics and a+collection of combinators, it becomes easy to extend the library with+more complex domain specific tactics. We will see examples in+sections \ref{example1} and \ref{example2}.++\subsubsection{Sequencing Tactics}+There are three basic operators for combining two tactics to create a +new tactic:++\begin{verbatim}+(>->), (>+>), (>=>) :: Tactic -> Tactic -> Tactic+\end{verbatim}++\begin{enumerate}+\item The \hdecl{>->} operator constructs a new tactic by sequencing two+tactic applications to the \remph{same} goal.++\item The \hdecl{>+>} operator constructs a new tactic by applying the+  first, then applying the second to the next \remph{default} goal.++\item The \hdecl{>=>} operator constructs a new tactic by applying the first+tactic, then applying the second to every subgoal generated by the first.++\end{enumerate}++\noindent+Finally, \hdecl{tacs} takes a list of tactics and applies+them in turn to the default goal:++\begin{verbatim}+tacs :: Monad m => [Goal -> Context -> m Context] ->+                   Goal -> Context -> m Context+\end{verbatim}++Note that the type of this is better understood as \hdecl{[Tactic] ->+  Tactic}, but the Haskell typechecker requires that the same monad be+abstracted over all of the combined tactics.++\subsubsection{Handling Failure}+Tactics may fail (for example a refinement may be ill-typed). +Recovering gracefully from a failure may be needed, for+example to try a number of possible ways of rewriting a term.+The \hdecl{try} combinator is an exception handling combinator.+The identity tactic, \hdecl{idTac}, is often appropriate on success.++% which+%tries a tactic, and chooses a second tactic to apply to the same goal+%if the first tactic succeeds, or an alternative tactic if the first+%tactic fails.++\begin{verbatim}+try :: Tactic -> -- apply this tactic+       Tactic -> -- apply if the tactic succeeds+       Tactic -> -- apply if the tactic fails+       Tactic+\end{verbatim}++%% \subsection{The Shell}++%% The \texttt{Ivor.Shell} module provides a command driven interface to+%% the library, which can be used for experimental purposes or for+%% developing a library of core lemmas for a domain specific task. It is+%% written entirely with the \texttt{Ivor.TT} interface but provides a+%% textual interface to the tactics. This gives, among other things, a+%% convenient method for loading proof scripts or libraries, or allowing+%% user directed proofs in the style of other proof assistants such as+%% \Coq{}.++%% A small driver program is provided (\texttt{jones}), which gives a+%% simple interface to the \Ivor{} shell.
+ papers/tutorial/Makefile view
@@ -0,0 +1,20 @@+all: tutorial.pdf++SOURCES = tutorial.tex introduction.tex programming.tex theoremproving.tex \+          hslibrary.tex++tutorial.pdf: $(SOURCES)+	pdflatex tutorial+	-bibtex tutorial+	-pdflatex tutorial++tutorial.ps: tutorial.dvi+	dvips -o tutorial.ps tutorial++tutorial.dvi: $(SOURCES)+	-latex tutorial+	-bibtex tutorial+	-latex tutorial+	-latex tutorial++.PHONY:
+ papers/tutorial/hslibrary.tex view
@@ -0,0 +1,8 @@+\section{Haskell Library}++% Shell, loading files+% Terms, types and data structures+% Adding definitions, pattern matching+% Theorem proving+% Defining tactics+
+ papers/tutorial/introduction.tex view
@@ -0,0 +1,4 @@+\section{Introduction}++\Ivor{}~\cite{ivor} is a dependently typed theorem proving library for+Haskell. 
+ papers/tutorial/library.ltx view
@@ -0,0 +1,325 @@+%%%%%%%%%%%%%%% library file for datatypes etc.++%%% Identifiers++\newcommand{\va}{\VV{a}}+\newcommand{\vb}{\VV{b}}+\newcommand{\vc}{\VV{c}}+\newcommand{\vd}{\VV{d}}+\newcommand{\ve}{\VV{e}}+\newcommand{\vf}{\VV{f}}+\newcommand{\vg}{\VV{g}}+\newcommand{\vh}{\VV{h}}+\newcommand{\vi}{\VV{i}}+\newcommand{\vj}{\VV{j}}+\newcommand{\vk}{\VV{k}}+\newcommand{\vl}{\VV{l}}+\newcommand{\vm}{\VV{m}}+\newcommand{\vn}{\VV{n}}+\newcommand{\vo}{\VV{o}}+\newcommand{\vp}{\VV{p}}+\newcommand{\vq}{\VV{q}}+\newcommand{\vr}{\VV{r}}+\newcommand{\vs}{\VV{s}}+\newcommand{\vt}{\VV{t}}+\newcommand{\vu}{\VV{u}}+\newcommand{\vv}{\VV{v}}+\newcommand{\vw}{\VV{w}}+\newcommand{\vx}{\VV{x}}+\newcommand{\vy}{\VV{y}}+\newcommand{\vz}{\VV{z}}+\newcommand{\vA}{\VV{A}}+\newcommand{\vB}{\VV{B}}+\newcommand{\vC}{\VV{C}}+\newcommand{\vD}{\VV{D}}+\newcommand{\vE}{\VV{E}}+\newcommand{\vF}{\VV{F}}+\newcommand{\vG}{\VV{G}}+\newcommand{\vH}{\VV{H}}+\newcommand{\vI}{\VV{I}}+\newcommand{\vJ}{\VV{J}}+\newcommand{\vK}{\VV{K}}+\newcommand{\vL}{\VV{L}}+\newcommand{\vM}{\VV{M}}+\newcommand{\vN}{\VV{N}}+\newcommand{\vO}{\VV{O}}+\newcommand{\vP}{\VV{P}}+\newcommand{\vQ}{\VV{Q}}+\newcommand{\vR}{\VV{R}}+\newcommand{\vS}{\VV{S}}+\newcommand{\vT}{\VV{T}}+\newcommand{\vU}{\VV{U}}+\newcommand{\vV}{\VV{V}}+\newcommand{\vW}{\VV{W}}+\newcommand{\vX}{\VV{X}}+\newcommand{\vY}{\VV{Y}}+\newcommand{\vZ}{\VV{Z}}+\newcommand{\vas}{\VV{as}}+\newcommand{\vbs}{\VV{bs}}+\newcommand{\vcs}{\VV{cs}}+\newcommand{\vds}{\VV{ds}}+\newcommand{\ves}{\VV{es}}+\newcommand{\vfs}{\VV{fs}}+\newcommand{\vgs}{\VV{gs}}+\newcommand{\vhs}{\VV{hs}}+\newcommand{\vis}{\VV{is}}+\newcommand{\vjs}{\VV{js}}+\newcommand{\vks}{\VV{ks}}+\newcommand{\vls}{\VV{ls}}+\newcommand{\vms}{\VV{ms}}+\newcommand{\vns}{\VV{ns}}+\newcommand{\vos}{\VV{os}}+\newcommand{\vps}{\VV{ps}}+\newcommand{\vqs}{\VV{qs}}+\newcommand{\vrs}{\VV{rs}}+%\newcommand{\vss}{\VV{ss}}+\newcommand{\vts}{\VV{ts}}+\newcommand{\vus}{\VV{us}}+\newcommand{\vvs}{\VV{vs}}+\newcommand{\vws}{\VV{ws}}+\newcommand{\vxs}{\VV{xs}}+\newcommand{\vys}{\VV{ys}}+\newcommand{\vzs}{\VV{zs}}++%%% Telescope Identifiers++\newcommand{\ta}{\vec{\VV{a}}}+\newcommand{\tb}{\vec{\VV{b}}}+\newcommand{\tc}{\vec{\VV{c}}}+\newcommand{\td}{\vec{\VV{d}}}+\newcommand{\te}{\vec{\VV{e}}}+\newcommand{\tf}{\vec{\VV{f}}}+\newcommand{\tg}{\vec{\VV{g}}}+%\newcommand{\th}{\vec{\VV{h}}}+\newcommand{\ti}{\vec{\VV{i}}}+\newcommand{\tj}{\vec{\VV{j}}}+\newcommand{\tk}{\vec{\VV{k}}}+\newcommand{\tl}{\vec{\VV{l}}}+\newcommand{\tm}{\vec{\VV{m}}}+\newcommand{\tn}{\vec{\VV{n}}}+%\newcommand{\to}{\vec{\VV{o}}}+\newcommand{\tp}{\vec{\VV{p}}}+\newcommand{\tq}{\vec{\VV{q}}}+\newcommand{\tr}{\vec{\VV{r}}}+\newcommand{\tts}{\vec{\VV{s}}}+\newcommand{\ttt}{\vec{\VV{t}}}+\newcommand{\tu}{\vec{\VV{u}}}+%\newcommand{\tv}{\vec{\VV{v}}}+\newcommand{\tw}{\vec{\VV{w}}}+\newcommand{\tx}{\vec{\VV{x}}}+\newcommand{\ty}{\vec{\VV{y}}}+\newcommand{\tz}{\vec{\VV{z}}}+\newcommand{\tA}{\vec{\VV{A}}}+\newcommand{\tB}{\vec{\VV{B}}}+\newcommand{\tC}{\vec{\VV{C}}}+\newcommand{\tD}{\vec{\VV{D}}}+\newcommand{\tE}{\vec{\VV{E}}}+\newcommand{\tF}{\vec{\VV{F}}}+\newcommand{\tG}{\vec{\VV{G}}}+\newcommand{\tH}{\vec{\VV{H}}}+\newcommand{\tI}{\vec{\VV{I}}}+\newcommand{\tJ}{\vec{\VV{J}}}+\newcommand{\tK}{\vec{\VV{K}}}+\newcommand{\tL}{\vec{\VV{L}}}+\newcommand{\tM}{\vec{\VV{M}}}+\newcommand{\tN}{\vec{\VV{N}}}+\newcommand{\tO}{\vec{\VV{O}}}+\newcommand{\tP}{\vec{\VV{P}}}+\newcommand{\tQ}{\vec{\VV{Q}}}+\newcommand{\tR}{\vec{\VV{R}}}+\newcommand{\tS}{\vec{\VV{S}}}+\newcommand{\tT}{\vec{\VV{T}}}+\newcommand{\tU}{\vec{\VV{U}}}+\newcommand{\tV}{\vec{\VV{V}}}+\newcommand{\tW}{\vec{\VV{W}}}+\newcommand{\tX}{\vec{\VV{X}}}+\newcommand{\tY}{\vec{\VV{Y}}}+\newcommand{\tZ}{\vec{\VV{Z}}}++++%%% Nat++\newcommand{\NatPackage}{+  \newcommand{\Nat}{\TC{\mathbb{N}}}+  \newcommand{\Z}{\DC{0}}+  \newcommand{\suc}{\DC{s}}+  \newcommand{\NatDecl}{+    \Data \hg+    \Axiom{\Nat\Hab\Type} \hg+    \Where \hg+    \Axiom{\Z\Hab\Nat} \hg+    \Rule{\vn\Hab\Nat}+         {\suc\:\vn\Hab\Nat}+}}++%%% Bool++\newcommand{\BoolPackage}{+  \newcommand{\Bool}{\TC{Bool}}+  \newcommand{\true}{\DC{true}}+  \newcommand{\false}{\DC{false}}+  \newcommand{\BoolDecl}{+    \Data \hg+    \Axiom{\Bool\Hab\Type} \hg+    \Where \hg+    \Axiom{\true\Hab\Bool} \hg+    \Axiom{\false\Hab\Bool}+}}++%%% So++\newcommand{\SoPackage}{+  \newcommand{\So}{\TC{So}}+  \newcommand{\oh}{\DC{oh}}+  \newcommand{\SoDecl}{+    \Data \hg+    \Rule{\vb\Hab\Bool}+         {\So\:\vb\Hab\Type} \hg+    \Where \hg+    \Axiom{\oh\Hab\So\:\true}+}}++%%% Unit++\newcommand{\UnitPackage}{+  \newcommand{\Unit}{\TC{Unit}}+  \newcommand{\void}{\DC{void}}+  \newcommand{\UnitDecl}{+    \Data \hg+    \Axiom{\Unit\Hab\Type} \hg+    \Where \hg+    \Axiom{\void\Hab\Unit}+}}++%%% Maybe++\newcommand{\MaybePackage}{+  \newcommand{\Maybe}{\TC{Maybe}}+  \newcommand{\yes}{\DC{yes}}+  \newcommand{\no}{\DC{no}}+  \newcommand{\MaybeDecl}{+    \Data \hg+    \Rule{\vA\Hab\Type}+         {\Maybe\:\vA\Hab\Type} \hg+    \Where \hg+    \Rule{\va \Hab \vA}+         {\yes\:\va\Hab\Maybe\:\vA} \hg+    \Axiom{\no\Hab\Maybe\:\vA}+}}++%%% Cross++\newcommand{\pr}[2]{(#1\DC{,}#2)}  %grrrr+\newcommand{\CrossPackage}{+  \newcommand{\Cross}{\times}+  \newcommand{\CrossDecl}{+    \Data \hg+    \Rule{\vA,\vB\Hab\Type}+         {\vA\Cross\vB\Hab\Type} \hg+    \Where \hg+    \Rule{\va \Hab \vA \hg \vb\Hab\vB}+         {\pr{\va}{\vb}\Hab\vA\Cross\vB}+}}++%%% Fin++\newcommand{\FinPackage}{+  \newcommand{\Fin}{\TC{Fin}}+  \newcommand{\fz}{\DC{f0}}+  \newcommand{\fs}{\DC{fs}}+  \newcommand{\FinDecl}{+    \AR{+    \Data \hg+    \Rule{\vn\Hab\Nat}+         {\Fin\:\vn\Hab\Type} \hg \\+    \Where \hg+    \begin{array}[t]{c}+    \Axiom{\fz\Hab\Fin\:(\suc\:\vn)} \hg+    \Rule{\vi\Hab\Fin\:\vn}+         {\fs\:\vi\Hab\Fin\:(\suc\:\vn)}+    \end{array}+    }+}}++%%% Vect++\newcommand{\VectPackage}{+  \newcommand{\Vect}{\TC{Vect}}+  \newcommand{\vnil}{\varepsilon}+  \newcommand{\vcons}{\,\dcolon\,}+  \newcommand{\vsnoc}{\,\dcolon\,}+  \newcommand{\VectConsDecl}{+    \Data \hg+    \Rule{\vA \Hab \Type \hg \vn\Hab\Nat}+         {\Vect\:\vA\:\vn\Hab\Type} \hg+    \Where \hg \begin{array}[t]{c}+    \Axiom{\vnil \Hab \Vect\:\vA\:\Z} \\+    \Rule{\vx\Hab\vA \hg \vxs\Hab \Vect\:\vA\:\vn }+         {\vx\vcons\vxs\Hab\Vect\:\vA\:(\suc\vn)}+    \end{array}+}+  \newcommand{\VectSnocDecl}{+    \Data \hg+    \Rule{\vA \Hab \Type \hg \vn\Hab\Nat}+         {\Vect\:\vA\:\vn\Hab\Type} \hg+    \Where \hg \begin{array}[t]{c}+    \Axiom{\vnil \Hab \Vect\:\vA\:\Z} \\+    \Rule{\vxs\Hab \Vect\:\vA\:\vn \hg \vx\Hab\vA}+         {\vxs\vsnoc\vx\Hab\Vect\:\vA\:(\suc\vn)}+    \end{array}+}+}++%%% Compare++%Data Compare : (x:nat)(y:nat)Type+%  = lt : (x:nat)(y:nat)(Compare x (plus (S y) x))+%  | eq : (x:nat)(Compare x x)+%  | gt : (x:nat)(y:nat)(Compare (plus (S x) y) y);+++\newcommand{\ComparePackage}{+  \newcommand{\Compare}{\TC{Compare}}+  \newcommand{\ltComp}{\DC{lt}}+  \newcommand{\eqComp}{\DC{eq}}+  \newcommand{\gtComp}{\DC{gt}}+  \newcommand{\CompareDecl}{+    \Data \hg+    \Rule{\vm\Hab\Nat\hg\vn\Hab\Nat}+         {\Compare\:\vm\:\vn\Hab\Type} \\+    \Where \hg\begin{array}[t]{c}+    \Rule{\vx\Hab\Nat\hg\vy\Hab\Nat}+         {\ltComp_{\vx}\:\vy\Hab\Compare\:\vx\:(\FN{plus}\:\vx\:(\suc\:\vy))} \\+    \Rule{\vx\Hab\Nat}+         {\eqComp_{\vx}\Hab\Compare\:\vx\:\vx}\\+    \Rule{\vx\Hab\Nat\hg\vy\Hab\Nat}+         {\gtComp_{\vy}\:\vx\Hab\Compare\:(\FN{plus}\:\vy\:(\suc\:\vx))\:\vy} \\+    \end{array}	 +  }++%Data CompareM : Type+%  = ltM : (ydiff:nat)CompareM+%  | eqM : CompareM+%  | gtM : (xdiff:nat)CompareM;++  \newcommand{\CompareM}{\TC{Compare^-}}+  \newcommand{\ltCompM}{\DC{lt^-}}+  \newcommand{\eqCompM}{\DC{eq^-}}+  \newcommand{\gtCompM}{\DC{gt^-}}+  \newcommand{\CompareMDecl}{++     \Data \hg+     \Axiom{\CompareM\Hab\Type} \\+     \Where \hg\begin{array}[t]{c}+     \Rule{\vy\Hab\Nat}+          {\ltCompM\:\vy\Hab\CompareM} \\+     \Axiom{\eqCompM\Hab\CompareM}\\+     \Rule{\vx\Hab\Nat}+          {\gtCompM\:\vx\Hab\CompareM} \\+     \end{array}	+  }+  \newcommand{\CompareRec}{\FN{CompareRec}}+  \newcommand{\CompareRecM}{\FN{CompareRec^-}}++}
+ papers/tutorial/macros.ltx view
@@ -0,0 +1,954 @@+%\usepackage{amstex}+\usepackage{amssymb}+\usepackage{latexsym}+\usepackage{eepic}+++%%%%%%%%% INFERENCE RULES++\newlength{\rulevgap}+\setlength{\rulevgap}{0.05in}+\newlength{\ruleheight}+\newlength{\ruledepth}+\newsavebox{\rulebox}+\newlength{\GapLength}+\newcommand{\gap}[1]{\settowidth{\GapLength}{#1} \hspace*{\GapLength}}+\newcommand{\dotstep}[2]{\begin{tabular}[b]{@{}c@{}}+                         #1\\$\vdots$\\#2+                         \end{tabular}}+\newlength{\fracwid}+\newcommand{\dotfrac}[2]{\settowidth{\fracwid}{$\frac{#1}{#2}$}+                         \addtolength{\fracwid}{0.1in}+                         \begin{tabular}[b]{@{}c@{}}+                         $#1$\\+                         \parbox[c][0.02in][t]{\fracwid}{\dotfill} \\+                         $#2$\\+                         \end{tabular}}+\newcommand{\Rule}[2]{\savebox{\rulebox}[\width][b]                         %+                              {\( \frac{\raisebox{0in} {\( #1 \)}}       %+                                       {\raisebox{-0.03in}{\( #2 \)}} \)}   %+                      \settoheight{\ruleheight}{\usebox{\rulebox}}          %+                      \addtolength{\ruleheight}{\rulevgap}                  %+                      \settodepth{\ruledepth}{\usebox{\rulebox}}            %+                      \addtolength{\ruledepth}{\rulevgap}                   %+                      \raisebox{0in}[\ruleheight][\ruledepth]               %+                               {\usebox{\rulebox}}}+\newcommand{\Case}[2]{\savebox{\rulebox}[\width][b]                         %+                              {\( \dotfrac{\raisebox{0in} {\( #1 \)}}       %+                                       {\raisebox{-0.03in}{\( #2 \)}} \)}   %+                      \settoheight{\ruleheight}{\usebox{\rulebox}}          %+                      \addtolength{\ruleheight}{\rulevgap}                  %+                      \settodepth{\ruledepth}{\usebox{\rulebox}}            %+                      \addtolength{\ruledepth}{\rulevgap}                   %+                      \raisebox{0in}[\ruleheight][\ruledepth]               %+                               {\usebox{\rulebox}}}+\newcommand{\Axiom}[1]{\savebox{\rulebox}[\width][b]                        %+                               {$\frac{}{\raisebox{-0.03in}{$#1$}}$}        %+                      \settoheight{\ruleheight}{\usebox{\rulebox}}          %+                      \addtolength{\ruleheight}{\rulevgap}                  %+                      \settodepth{\ruledepth}{\usebox{\rulebox}}            %+                      \addtolength{\ruledepth}{\rulevgap}                   %+                      \raisebox{0in}[\ruleheight][\ruledepth]               %+                               {\usebox{\rulebox}}}+\newcommand{\RuleSide}[3]{\gap{$#2$} \hspace*{0.1in}               %+                            \Rule{#1}{#3}                          %+                          \hspace*{0.1in}$#2$}+\newcommand{\AxiomSide}[2]{\gap{$#1$} \hspace*{0.1in}              %+                             \Axiom{#2}                            %+                           \hspace*{0.1in}$#1$}+\newcommand{\RULE}[1]{\textbf{#1}}+\newcommand{\hg}{\hspace{0.2in}}++\newcommand{\ProofState}+                      [2]{\parbox{10cm}{\AR{\hg\AR{#1}\\\Axiom{\hg#2\hg}}}}++%%%%%%%%%%%% TRISTUFF++\newcommand{\btr}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+\blacken\path(57,192)(57,12)(12,102)+	(57,192)(57,192)+\path(57,192)(57,12)(12,102)+	(57,192)(57,192)+\end{picture}+}++\newcommand{\btl}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+\blacken\path(12,192)(12,12)(57,102)+	(12,192)(12,192)+\path(12,192)(12,12)(57,102)+	(12,192)(12,192)+\end{picture}+}++\newcommand{\wtr}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+%\blacken\path(57,192)(57,12)(12,102)+%	(57,192)(57,192)+\path(57,192)(57,12)(12,102)+	(57,192)(57,192)+\end{picture}+}++\newcommand{\wtl}{+\setlength{\unitlength}{0.0005in}+\begin{picture}(69,180)(0,12)+%\blacken\path(12,192)(12,12)(57,102)+%	(12,192)(12,192)+\path(12,192)(12,12)(57,102)+	(12,192)(12,192)+\end{picture}+}++++%%%%%%%%%%%% FONTS++\newcommand{\TC}[1]{\mathsf{#1}}+\newcommand{\DC}[1]{\mathsf{#1}}+\newcommand{\VV}[1]{\mathit{#1}}+\newcommand{\FN}[1]{\mathbf{#1}}+\newcommand{\HFN}[1]{\mathtt{#1}}+\newcommand{\RW}[1]{\underline{\textrm{#1}}}+\newcommand{\MO}[1]{\mbox{\textsc{#1}}}++\newcommand{\HF}[1]{\mathtt{#1}}++\newcommand{\MV}[1]{\nhole\mathit{#1}}+\newcommand{\Lang}[1]{\mathsf{#1}}+\newcommand{\Name}[1]{\mathit{#1}}++\newcommand{\demph}[1]{\textbf{#1}}+\newcommand{\remph}[1]{\emph{#1}}++%%%% Keywords for meta operations+\newcommand{\IF}{\;\RW{if}\;\;}+\newcommand{\THEN}{\RW{then}}+\newcommand{\ELSE}{\RW{else}}+\newcommand{\AND}{\RW{and}}+\newcommand{\Otherwise}{\RW{otherwise}}+\newcommand{\Do}{\RW{do}}+\newcommand{\Return}{\RW{return}}++\newcommand{\CASE}{\RW{case}}+\newcommand{\LET}{\RW{let}}+\newcommand{\IN}{\RW{in}}+\newcommand{\of}{\RW{of}}++\newcommand{\CLASS}{\mathtt{class}}+\newcommand{\INSTANCE}{\mathtt{instance}}++%%%%%%%%%%%% GROUPING++\newcommand{\G}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(2,10)(2,-10)+\end{picture}+}++\newcommand{\E}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(2,10)(2,-2)(4,-2)+\end{picture}+}++%\newcommand{\C}{+%\setlength{\unitlength}{1pt}+%\begin{picture}(4,10)(0,0)+%\path(4,8)(2,8)(2,-2)(4,-2)+%\end{picture}+%}++\newcommand{\M}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(2,10)(2,-2)(6,-2)+\end{picture}+}++\newcommand{\F}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(4,8)(2,8)(2,-6)+\end{picture}+}++\newcommand{\K}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(0,8)(4,8)+\end{picture}+}++\newcommand{\J}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\path(0,-2)(4,-2)+\end{picture}+}++\newcommand{\W}{+\setlength{\unitlength}{1pt}+\begin{picture}(4,10)(0,0)+\end{picture}+}++++%%%%%%%%%%%% GUBBINS++\newcommand{\mathskip}{\medskip}++\newcommand{\fbx}[1]{\fbox{$#1$}}+\newcommand{\stk}[1]{\begin{array}{c}#1\end{array}}+%\newcommand{\DM}[1]{\hg\mbox{$#1$}}+\newcommand{\DM}[1]{\mathskip\par\(#1\)\mathskip}+\newcommand{\mbx}[1]{\mathskip\par\noindent\(#1\)\mathskip}+\newcommand{\AR}[1]{\begin{array}[t]{@{}l}#1\end{array}}+\newcommand{\ARt}[1]{\begin{array}[t]{@{}l@{}cl}#1\end{array}}+\newcommand{\ARc}[1]{\begin{array}{@{}l}#1\end{array}}+\newcommand{\ARd}[1]{\begin{array}[t]{cl}#1\end{array}}+\newcommand{\EA}[1]{\begin{array}[t]{r@{}c@{}l}#1\end{array}}+\newcommand{\A}{@{\:}c}+%\newcommand{\R}{@{\:}r}+\newcommand{\CA}{c}+\newcommand{\LA}{l}+\newcommand{\PAc}[2]{\begin{array}{l#1@{}r@{}l}#2\end{array}}+\newcommand{\PA}[2]{\begin{array}[t]{l@{\:}l#1@{}r@{\:}l}#2\end{array}}+\newcommand{\DTREE}[3]{\begin{array}[t]{l#1@{}r@{\:}l#2}#3\end{array}}+\newcommand{\IDTREE}[2]{%+  \begin{array}[t]{l@{\:}c@{\:}l@{\:}r@{\:}l#1}#2\end{array}}+\newcommand{\IA}[2]+   {\begin{array}[t]{l@{\:}r@{\:}c@{\:}l@{\:}#1@{\:}r@{\:}l}#2\end{array}}+\newcommand{\IAc}[2]+   {\begin{array}[c]{r@{\:}c@{\:}l@{\:}#1@{}r@{}l}#2\end{array}}+\newcommand{\CS}[1]{\left\lfloor\begin{array}{@{}l}#1\end{array}\right.}+\newcommand{\BY}[3]{\multicolumn{2}{l}{\;\RW{by}\; #1} \\ %+    \multicolumn{#2}{l}{\CS{#3}} }+\newcommand{\WITH}[3]{\multicolumn{2}{l}{\;\RW{with}\; #1} \\ %+    \multicolumn{#2}{l}{\CS{#3}} }+\newcommand{\WithBy}{\RW{with-by}}+\newcommand{\Wb}[1]{\WithBy& #1}+\newcommand{\By}[1]{\multicolumn{2}{l}{\Leftarrow #1}}+\newcommand{\andby}{\Leftarrow}+\newcommand{\MyWith}[1]{\multicolumn{2}{l}{|\;#1}}+\newcommand{\Byr}[1]{\;\RW{by}\; #1}++\renewcommand{\Bar}{|}+\newcommand{\Bart}{\settowidth{\GapLength}{$\Bar$}%+                   \raisebox{6pt}[0pt][0pt]{$\Bar$}%+                   \hspace*{-1\GapLength}%+                   \Bar}+\newcommand{\With}[1]{\Bar & #1}+\newcommand{\Witt}[1]{\Bart & #1}++\newcommand{\B}{@{\:}r@{\:}c}+\newcommand{\Ret}[1]{\multicolumn{2}{l}{\cq #1}}+\newcommand{\MRet}[2]{\multicolumn{#1}{l}{\cq #2}}+\newcommand{\HRet}[1]{\multicolumn{2}{l}{\hq #1}}+\newcommand{\MHRet}[2]{\multicolumn{#1}{l}{\hq #2}}+\newcommand{\IRet}[1]{\multicolumn{2}{l}{\iq #1}}+\newcommand{\IMRet}[2]{\multicolumn{#1}{l}{\iq #2}}+\newcommand{\MoRet}[1]{\multicolumn{2}{l}{\mq #1}}+\newcommand{\MMoRet}[2]{\multicolumn{#1}{l}{\mq #2}}+\newcommand{\Data}{\RW{data}}+\newcommand{\Where}{\RW{where}}+\newcommand{\Let}{\RW{let}}+\newcommand{\Fact}{\RW{fact}}+\newcommand{\Rec}[1]{#1\textbf{-Rec}}+\newcommand{\Memo}[1]{#1\textbf{-Memo}}+\newcommand{\Elim}[1]{#1\textbf{-Elim}}+\newcommand{\Cases}[1]{#1\textbf{-Case}}+\newcommand{\View}[1]{#1\textbf{-View}}+\newcommand{\As}[2]{#1 \:\RW{as}\: #2}+\newcommand{\nhole}{\Box}+\newcommand{\turq}{\:\vdash_?\:}+\renewcommand{\split}{\;\lhd\;}+\newcommand{\CType}[2]{\{#1 \split\; #2\}}+\newcommand{\CC}[2]{(#1)\:#2}+\newcommand{\UP}[2]{#1 | \{#2\}}+\newcommand{\Ured}{\:\Downarrow\:}+\newcommand{\gdd}{\prec}+\newcommand{\HC}[1]{\left<#1\right>}+\newcommand{\HT}[2]{\left<#1 \hab #2\right>}++\newcommand{\view}{\RW{view}}+\newcommand{\ecase}{\RW{case}}+\newcommand{\rec}{\RW{rec}}++\newcommand{\If}{\mathsf{if}}+\newcommand{\Then}{\mathsf{then}}+\newcommand{\Else}{\mathsf{else}}+\newcommand{\elim}{\RW{elim}}++\newcommand{\Payload}{\mathsf{type}}+\newcommand{\Any}{\mathsf{Some}}++\newcommand{\lbl}[2]{\langle #1 \Hab #2 \rangle}+\newcommand{\call}[2]{\RW{call}\:\langle#1\rangle\:#2}+\newcommand{\return}[1]{\RW{return}\:#1}++\newcommand{\Remark}[1]{\noindent\textbf{Remark:} #1}++\newcommand{\DBOX}[2]{\fbox{\parbox{#1}{\textbf{Definition:}#2}}}++\newcommand{\FIG}[3]{\begin{figure}[h]\DM{#1}\caption{#2}\label{#3}\end{figure}}+\newcommand{\FFIG}[3]{\begin{figure}[h]\begin{center}\DM{#1}\end{center}\caption{#2}\label{#3}\end{figure}}+\newcommand{\FFIGTC}[3]{\begin{figure*}[t]\begin{center}\DM{#1}\end{center}\caption{#2}\label{#3}\end{figure*}}+\newcommand{\VFIG}[3]{\begin{figure}[h]\begin{boxedverbatim}#1\end{boxedverbatim}\caption{#2}\label{#3}\end{figure}}+\newcommand{\PFIG}[3]{\begin{figure}[p]\begin{center}\fbox{\DM{#1}}\end{center}\caption{#2}\label{#3}\end{figure}}+\newcommand{\CFIG}[3]{\begin{figure}[h]\begin{center}\DM{#1}\end{center}\caption{#2}\label{#3}\end{figure}}++\newcommand{\TFIG}[4]{\begin{figure}[h]\begin{center}\begin{tabular}{#1}#2\end{tabular}\end{center}\caption{#3}\label{#4}\end{figure}}+\newcommand{\TFIGTC}[4]{\begin{figure*}[t]\begin{center}\begin{tabular}{#1}#2\end{tabular}\end{center}\caption{#3}\label{#4}\end{figure*}}++\newcommand{\RESFIG}[3]{+\TFIG{|l|c|c|c|c|c|c|c|c|}{+\hline+    & \multicolumn{4}{c|}{\Naive{} compilation} &+          \multicolumn{4}{|c|}{Optimised compilation} \\+\cline{2-9}+\raisebox{1.5ex}[0pt]{Program} & Instrs & Thunks & Cells &+Accesses & Instructions & Thunks & Cells & Accesses \\+%\raisebox{1.5ex}[0pt]{Program} & I & T & C & M & I & T & C & M \\+\hline+#1+\hline+}{#2}{#3}}++\newcommand{\NEWRESFIG}[3]{+\TFIG{|l|l|c|c|c|c|}{+\hline+%    & \multicolumn{4}{c|}{\Naive{} compilation} &+%          \multicolumn{4}{|c|}{Optimised compilation} \\+%\cline{2-9}+Program & Version & Instructions & Thunks & Memory Accesses & Cells \\+%\raisebox{1.5ex}[0pt]{Program} & I & T & C & M & I & T & C & M \\+\hline+#1+}{#2}{#3}}++\newcommand{\NEWRESFIGTC}[3]{+\TFIGTC{|l|l|c|c|c|c|}{+\hline+%    & \multicolumn{4}{c|}{\Naive{} compilation} &+%          \multicolumn{4}{|c|}{Optimised compilation} \\+%\cline{2-9}+Program & Version & Instructions & Thunks & Memory Accesses & Cells \\+%\raisebox{1.5ex}[0pt]{Program} & I & T & C & M & I & T & C & M \\+\hline+#1+}{#2}{#3}}++\newcommand{\RESLINE}[9]{+& \Naive{} & #2 & #3 & #5 & #4 \\+#1+& Optimised & #6 & #7 & #9 & #8 \\+}+\newcommand{\RESCHANGE}[4]{+& Change & \textbf{#1} & \textbf{#2} & \textbf{#4} & \textbf{#3} \\+\hline+}+\newcommand{\RESCHANGEa}[5]{+#5 & Change & \textbf{#1} & \textbf{#2} & \textbf{#4} & \textbf{#3} \\+\hline+}++%%%%%%%%%%%% PUNCTUATION++\newcommand{\pad}[2]{#1#2#1}++\newcommand{\hab}{\pad{\,}{:}}+\newcommand{\Hab}{\pad{\;}{:}}+\newcommand{\HHab}{\pad{\;}{::}}++%%%%%%%%%%%% TYPE++\newcommand{\Type}{\star}+++%%%%%%%%%%%%% ARROWS++\newcommand{\To}{\pad{\:}{\rightarrow}}+%\newcommand{\car}{\vartriangleright}++%%%%%%%%%%%%% QUANTIFIERS++\newcommand{\lam}[2]{\lambda#1\pad{\!}{:}#2}+\newcommand{\fbind}[3]{(#1\Hab#2)\to#3}+\newcommand{\all}[2]{\forall#1\pad{\!}{:}#2}+\newcommand{\hole}[2]{?#1\pad{\!}{:}#2}+\newcommand{\guess}[3]{?#1\pad{\!}{:}#2\approx#3}+\newcommand{\remlam}[2]{\lambda\{#1\pad{\!}{:}#2\}}+\newcommand{\remall}[2]{\forall\{#1\pad{\!}{:}#2\}}+\newcommand{\allpi}[2]{\Pi#1\pad{\!}{:}#2}+\newcommand{\ali}[2]{\forall#1|#2}+\newcommand{\exi}[2]{\exists#1\pad{\!}{:}#2}+\newcommand{\wit}[2]{\ang{#1,#2}}+\newcommand{\X}{\times}+\newcommand{\sig}[2]{\Sigma#1\pad{\!}{:}#2}++\newcommand{\SC}{.\:}++\newcommand{\letbind}[3]{\mathsf{let}\:#1{:}#2\:=\:#3\:\mathsf{in}}+\newcommand{\ifthen}[3]{\mathsf{if}\:#1\:\mathsf{then}\:#2\:\mathsf{else}\:#3}++%%%%%%%%%%%%% EQUALITIES++\newcommand{\cq}{\pad{\:}{\mapsto}}+\newcommand{\xq}{\pad{}{\doteq}}+\newcommand{\pq}{\pad{\:}{=}}+\newcommand{\dq}{\pad{\:}{:=}}+\newcommand{\iq}{\pad{\:}{\leadsto}}+\newcommand{\mq}{\Longrightarrow}+\newcommand{\retq}{\Rightarrow}+\newcommand{\hq}{\pad{\:}{=}}+\newcommand{\defq}{\mapsto}++\newcommand{\refl}{\TC{refl}}+++++%%%%%%%%%%%%% CATSTUFF++\newlength{\Lwibrs}+\newlength{\Lwobrs}+\newsavebox{\Bwibrs}+\newsavebox{\Bwobrs}+\newcommand{\Db}[5]{%+  \savebox{\Bwobrs}[\width][b]{$#5$}%+  \savebox{\Bwibrs}[\width][b]{$\left#2\usebox{\Bwobrs}\right#3$}%+  \settowidth{\Lwobrs}{\usebox{\Bwobrs}}%+  \settowidth{\Lwibrs}{\usebox{\Bwibrs}}%+  \addtolength{\Lwibrs}{-\Lwobrs}%+  \left#1\pad{\hspace*{-0.25\Lwibrs}}{\usebox{\Bwibrs}}\right#4}+\newcommand{\LDb}[3]{%+  \savebox{\Bwobrs}[\width][b]{$#3$}%+  \savebox{\Bwibrs}[\width][b]{$\left#2\usebox{\Bwobrs}\right.$}%+  \settowidth{\Lwobrs}{\usebox{\Bwobrs}}%+  \settowidth{\Lwibrs}{\usebox{\Bwibrs}}%+  \addtolength{\Lwibrs}{-\Lwobrs}%+  \left#1\hspace*{-0.4\Lwibrs}\usebox{\Bwibrs}\right.}+\newcommand{\RDb}[3]{%+  \savebox{\Bwobrs}[\width][b]{$#3$}%+  \savebox{\Bwibrs}[\width][b]{$\left.\usebox{\Bwobrs}\right#1$}%+  \settowidth{\Lwobrs}{\usebox{\Bwobrs}}%+  \settowidth{\Lwibrs}{\usebox{\Bwibrs}}%+  \addtolength{\Lwibrs}{-\Lwobrs}%+  \left.\usebox{\Bwibrs}\hspace*{-0.4\Lwibrs}\right#2}+\newcommand{\Sc}{\Db{[}{[}{]}{]}}+\newcommand{\Mo}{\Db{|}{>}{<}{|}}+\newcommand{\MoL}{\LDb{|}{>}}+\newcommand{\MoR}{\RDb{<}{|}}++\newcommand{\car}{\mbox{$-\!\triangleright$}}+\newcommand{\io}[1]{\iota_{#1}}+\newcommand{\cc}{\diamond}+++%%%%%%%%%%%%% FNS++\newcommand{\Wk}{\Uparrow}++%%%%%%%%%%%%% Transformation++\newcommand{\Transform}[3]{\textsc{Trans}\:_{\Name{#1}}+   \interp{#2}\:\mq\:#3}+%\:[\:#2\:\Longrightarrow\:#3\:]}+\newcommand{\Morphism}[2]{\textsc{Morphism}\:#1\:\Longrightarrow\:#2}+\newcommand{\MI}[1]{\begin{array}{ll} #1 \end{array}\\}+\newcommand{\MorphItem}[2]{& #1 \:\Longrightarrow\: #2}++%%%%%%%%%%%%% Stuff++% Motive and methods++\newcommand{\motive}{\vP}+\newcommand{\meth}[1]{\vm_{#1}}++% Tuples+\newcommand{\tuple}[1]{\langle#1\rangle}+\newcommand{\Tuple}[1]{\mathsf{Tuple}}+\newcommand{\proj}{\mathsf{proj}}+\newcommand{\app}{\mathrm{+\!+}}++% Commenting out+\newcommand{\ig}[1]{[#1]}+\newcommand{\rem}[1]{\{\!#1\!\}}+\newcommand{\igc}[1]{[#1]}+\newcommand{\remc}[1]{\{\!#1\!\}}+++\newcommand{\ind}{\hspace*{0.1cm}}++% Content free type+\newcommand{\CF}{\TC{CF}}+\newcommand{\cf}{\DC{cf}}++% Error token+\newcommand{\error}{\DC{error}}+\newcommand{\fail}{\perp}++% Constructor stripping+\newcommand{\conarg}[2]{#1!#2}++\newcommand{\Vect}{\TC{Vect}}+\newcommand{\VectM}{\TC{Vect^-}}+\newcommand{\Vnil}{\DC{\epsilon}}+\newcommand{\Vcons}{\DC{::}}++\newcommand{\Vsnoc}{\DC{::}}++\newcommand{\VnilM}{\DC{\epsilon^-}}+\newcommand{\VconsM}{\DC{::^-}}++\newcommand{\Vnilcase}{\VV{vNilCase}}+\newcommand{\Vconscase}{\VV{vConsCase}}++\newcommand{\DSigma}{\TC{Sigma}}+\newcommand{\Exists}{\DC{Exists}}++\newcommand{\ListPair}[2]{\sig{#1}{\List\:\vA}.#2 = \FN{length}\:#1}+\newcommand{\lpNilDef}{\lpNil{\FN{refl}\:\Z}}+\newcommand{\lpNil}[1]{(\nil\:\vA,#1)}+\newcommand{\lpConsDef}[3]{\lpCons{#1}{(\FN{fst\:#2})}{\FN{resp}\:(\FN{snd}\:#2)}}+\newcommand{\lpCons}[3]{(\cons\:#1\:#2,#3)}+\newcommand{\lp}[2]{(#1, #2)}++\newcommand{\VnilTop}{\DC{vNil}^\ast}+\newcommand{\VconsTop}{\DC{vCons}^\ast}++\newcommand{\VnilBot}{\DC{\epsilon}^-}+\newcommand{\VconsBot}{\DC{::}^-}++\newcommand{\VectTop}{\TC{Vect}^\ast}+\newcommand{\VectBot}{\TC{Vect}^-}++\newcommand{\VectDrop}{\FN{vectDropIdx}}+\newcommand{\VectRebuild}{\FN{vectRebuild}}++\newcommand{\Prop}{\TC{Prop}}+\newcommand{\Set}{\TC{Set}}+\newcommand{\CoqType}{\TC{Type}}++\newcommand{\List}{\TC{List}}+\newcommand{\nil}{\DC{nil}}+\newcommand{\cons}{\DC{cons}}++\newcommand{\Zip}{\TC{Tsil}}+\newcommand{\zip}{\FN{tsil}}+\newcommand{\zipcons}{\FN{tsilcons}}+\newcommand{\snoc}{\DC{Snoc}}+\newcommand{\lin}{\DC{Empty}}++\newcommand{\BigInt}{\TC{BigInt}}+\newcommand{\False}{\TC{False}}+\newcommand{\Unit}{\TC{True}}+\newcommand{\UnitI}{\DC{()}}++\newcommand{\genType}{\TC{X}}+\newcommand{\genIndicesDec}{\tb\Hab\tB}+\newcommand{\genIndices}{\tb}+\newcommand{\genConArgsDec}[1]{\vec{\VV{a_#1}}\Hab\vec{\VV{A_#1}}}+\newcommand{\genConArgs}[1]{\vec{\VV{a_#1}}}+\newcommand{\genConIndicesDec}[1]{\vec{\VV{b_#1}}\Hab\vec{\VV{B_#1}}}+\newcommand{\genConIndices}[1]{\vec{\VV{b_#1}}}+\newcommand{\genCon}[1]{\DC{x}_#1}++\newcommand{\genTypeTop}{\TC{X^\ast}}+\newcommand{\genTypeBot}{\TC{X^-}}++\newcommand{\genTypeDrop}{\FN{XDropIdx}}+\newcommand{\genTypeRebuild}{\FN{XRebuild}}++\newcommand{\HTerm}{\texttt{Term}}+\newcommand{\Term}{\TC{Term}}+\newcommand{\Var}{\DC{var}}+\newcommand{\Lam}{\DC{lam}}+\newcommand{\App}{\DC{app}}+\newcommand{\TermM}{\TC{Term^-}}+\newcommand{\VarM}{\DC{var^-}}+\newcommand{\LamM}{\DC{lam^-}}+\newcommand{\AppM}{\DC{app^-}}+\newcommand{\Env}{\TC{Env}}+\newcommand{\SType}{\TC{STy}}+\newcommand{\farrow}{\Rightarrow}+\newcommand{\lookup}{\FN{lookup}}++\newcommand{\source}{\Lang{TT}}+\newcommand{\target}{\Lang{ExTT}}+\newcommand{\runtime}{\Lang{RunTT}}++\newcommand{\lt}{\TC{<}}+\newcommand{\ltO}{\DC{ltO}}+\newcommand{\ltS}{\DC{ltS}}++\newcommand{\interp}[1]{\llbracket #1 \rrbracket}+\newcommand{\inferrable}[2]{\FN{inferrable}(#1,#2)}+\newcommand{\mkPat}{\FN{mkPat}}++\newcommand{\FinM}{\TC{Fin^-}}+\newcommand{\fzM}{\DC{f0^-}}+\newcommand{\fsM}{\DC{fs^-}}++\newcommand{\concat}{\mathrm{++}}++%\newcommand{\bottom}{\perp}++% Reductions++\newcommand{\reduces}{\rhd}+\newcommand{\translation}{\Rightarrow}+%\newcommand{\reducesn}[1]{\reduces\hspace*{-0.15cm}_{#1}}+%\newcommand{\reducesto}{\reduces\hspace*{-0.15cm}^{*}}+\newcommand{\reducesn}[1]{\reduces_{#1}}+\newcommand{\reducesto}{\reduces^{*}}++% Equality++\newcommand{\Refl}{\DC{refl}}+\newcommand{\leZ}{\DC{O_{\le}}}+\newcommand{\leS}{\DC{S_{\le}}}++% Random elimination things++\newcommand{\lte}{\TC{\leq}}+\newcommand{\lten}{\DC{leN}}+\newcommand{\lteO}{\DC{leO}}+\newcommand{\lteS}{\DC{leS}}++\newcommand{\ltelim}{\Elim{\lt}}+\newcommand{\leelim}{\Elim{\lte}}++\newcommand{\dD}{\TC{D}}+\newcommand{\delim}{\Elim{\TC{D}}}+\newcommand{\drec}{\Rec{\TC{D}}}+\newcommand{\dcase}{\Cases{\TC{D}}}+\newcommand{\dview}{\View{\TC{D}}}+\newcommand{\dmemo}{\Memo{\TC{D}}}+\newcommand{\natrec}{\Rec{\Nat}}+\newcommand{\natmemo}{\Memo{\Nat}}+\newcommand{\natmemogen}{\Nat\textbf{-MemoGen}}+\newcommand{\natelim}{\Elim{\Nat}}+\newcommand{\boolcase}{\Cases{\Bool}}+\newcommand{\vectrec}{\Rec{\Vect}}+\newcommand{\vectelim}{\Elim{\Vect}}+\newcommand{\listrec}{\Rec{\List}}+\newcommand{\listelim}{\Elim{\List}}+\newcommand{\finrec}{\Rec{\Fin}}+\newcommand{\finelim}{\Elim{\Fin}}+\newcommand{\natcase}{\Cases{\Nat}}+\newcommand{\vectcase}{\Cases{\Vect}}+\newcommand{\natdoublerec}{\Nat\textbf{-double-elim}}+\newcommand{\eqelim}{=\textbf{-elim}}+\newcommand{\falsecase}{\Cases{\False}}++% Code+\newcommand{\Haskell}[1]{\begin{quotation}\begin{verbatim}#1\end{verbatim}\end{quotation}}++% Quicksort++\newcommand{\QSView}{\TC{QuickSort}}+\newcommand{\qsempty}{\DC{empty}}+\newcommand{\partition}{\DC{partition}}+\newcommand{\qsview}{\FN{mkQuickSort}}++% More gubbins++\newcommand{\converts}{\simeq}+\newcommand{\cumul}{\preceq}+\newcommand{\whnf}{\Downarrow}+\newcommand{\elem}{\in}+\newcommand{\proves}{\vdash}+\newcommand{\biimplies}{\Longleftrightarrow}++\newcommand{\lc}{\lambda_{\mathsf{AC}}}+\newcommand{\zed}{\mathbb{Z}}++% Haskell keywords++\newcommand{\hdata}{\mathtt{data}}+\newcommand{\newtype}{\mathtt{newtype}}+%\newcommand{\htype}{\mathtt{type}}++\newcommand{\HTC}[1]{\mathtt{#1}}+\newcommand{\HDC}[1]{\mathtt{#1}}++% Nobby++\newcommand{\Value}{\HTC{Value}}+\newcommand{\VGamma}{\HTC{Env}}+\newcommand{\Ctxt}{\HTC{Ctxt}}+\newcommand{\Defs}{\HTC{Defs}}+\newcommand{\ECtxt}{\HTC{ECtxt}}+\newcommand{\TCtxt}{\HTC{TCtxt}}+\newcommand{\VG}{\HDC{Env}}+\newcommand{\Model}{\HTC{Model}}+\newcommand{\Const}{\HTC{Const}}+\newcommand{\Normal}{\HTC{Normal}}+\newcommand{\Scope}{\HTC{Scope}}+\newcommand{\Kripke}{\HTC{Kripke}}+\newcommand{\Weakening}{\HTC{Weakening}}+\newcommand{\Ready}{\HTC{Ready}}+\newcommand{\Blocked}{\HTC{Blocked}}+\newcommand{\Spine}{\HTC{Spine}}++\newcommand{\BV}{\HDC{BV}}+\newcommand{\BCon}{\HDC{BCon}}+\newcommand{\BTyCon}{\HDC{BTyCon}}+\newcommand{\RCon}{\HDC{RCon}}+\newcommand{\RTyCon}{\HDC{RTyCon}}+\newcommand{\BElim}{\HDC{BElim}}+\newcommand{\DV}{\HDC{V}}+\newcommand{\DP}{\HDC{P}}++\newcommand{\MR}{\HDC{R}}+\newcommand{\MB}{\HDC{B}}+\newcommand{\DSc}{\HDC{Sc}}+\newcommand{\DKr}{\HDC{Kr}}+\newcommand{\DWk}{\HDC{Wk}}+\newcommand{\DSnoc}{\HDC{;}}+\newcommand{\DType}{\HDC{Type}}+\newcommand{\DName}{\HDC{Name}}+\newcommand{\DInt}{\HDC{Int}}+\newcommand{\DString}{\HDC{String}}+\newcommand{\DElim}{\HDC{Elim}}+\newcommand{\Empty}{\HDC{\emptyset}}++\newcommand{\ConCode}{\HTC{ConCode}}+\newcommand{\ElimRule}{\HTC{ElimRule}}++\newcommand{\DConst}{\HDC{Const}}+\newcommand{\DCon}{\HDC{Con}}+\newcommand{\DTyCon}{\HDC{TyCon}}+\newcommand{\RConst}{\HDC{RConst}}+\newcommand{\RLam}{\HDC{RLam}}+\newcommand{\RPi}{\HDC{RPi}}+\newcommand{\DLam}{\HDC{Lam}}+\newcommand{\DLet}{\HDC{Let}}+\newcommand{\DPi}{\HDC{Pi}}+\newcommand{\DApp}{\HDC{App}}++\newcommand{\TMaybe}{\HTC{Maybe}}+\newcommand{\DNothing}{\HDC{Nothing}}+\newcommand{\DJust}{\HDC{Just}}+++% G-machine and heap++\newcommand{\PUSH}{\mathsf{PUSH}}+\newcommand{\PUSHNAME}{\mathsf{PUSHNAME}}+\newcommand{\POP}{\mathsf{DISCARD}}+\newcommand{\PUSHFUN}{\mathsf{PUSHFUN}}+\newcommand{\APPLY}{\mathsf{MKAP}}+\newcommand{\EVAL}{\mathsf{EVAL}}+\newcommand{\GCON}{\mathsf{MKCON}}+\newcommand{\GTUP}{\mathsf{MKTUP}}+\newcommand{\GTYPE}{\mathsf{MKTYPE}}+\newcommand{\UPDATE}{\mathsf{UPDATE}}+\newcommand{\RET}{\mathsf{RET}}+\newcommand{\UNWIND}{\mathsf{UNWIND}}+\newcommand{\CASEJUMP}{\mathsf{CASEJUMP}}+\newcommand{\LABEL}{\mathsf{LABEL}}+\newcommand{\MOVE}{\mathsf{MOVE}}+\newcommand{\JUMP}{\mathsf{JUMP}}+\newcommand{\SPLIT}{\mathsf{SPLIT}}+\newcommand{\SQUEEZE}{\mathsf{SQUEEZE}}+\newcommand{\JFUN}{\mathsf{JFUN}}+\newcommand{\PROJ}{\mathsf{PROJ}}+\newcommand{\ERROR}{\mathsf{ERROR}}+\newcommand{\SLIDE}{\mathsf{SLIDE}}+\newcommand{\ALLOC}{\mathsf{ALLOC}}++\newcommand{\PUSHBIG}{\mathsf{PUSHBIG}}+\newcommand{\PUSHBASIC}{\mathsf{PUSHBASIC}}+\newcommand{\PUSHINT}{\mathsf{PUSHINT}}+\newcommand{\PUSHBOOL}{\mathsf{PUSHBOOL}}+\newcommand{\GET}{\mathsf{GET}}+\newcommand{\MKINT}{\mathsf{MKINT}}+\newcommand{\MKBOOL}{\mathsf{MKBOOL}}+\newcommand{\ADD}{\mathsf{ADD}}+\newcommand{\SUB}{\mathsf{SUB}}+\newcommand{\MULT}{\mathsf{MULT}}+\newcommand{\LT}{\mathsf{LT}}+\newcommand{\EQ}{\mathsf{EQ}}+\newcommand{\GT}{\mathsf{GT}}+\newcommand{\JTRUE}{\mathsf{JTRUE}}++\newcommand{\APP}{\mathsf{APP}}+\newcommand{\FUN}{\mathsf{FUN}}+\newcommand{\CON}{\mathsf{CON}}+\newcommand{\TYCON}{\mathsf{TYCON}}+\newcommand{\TUP}{\mathsf{TUP}}+\newcommand{\TYPE}{\mathsf{TYPE}}+\newcommand{\INT}{\mathsf{INT}}+\newcommand{\BIGINT}{\mathsf{BIGINT}}+\newcommand{\BOOL}{\mathsf{BOOL}}+\newcommand{\HOLE}{\mathsf{HOLE}}++% G machine translation scheme++\newcommand{\sinterp}[1]{\mathcal{S}\interp{#1}}+\newcommand{\sinterpm}[1]{\mathcal{S}\AR{\interp{#1}}}+\newcommand{\einterp}[3]{\mathcal{E}\interp{#1}\:#2\:#3}+\newcommand{\cinterp}[3]{\mathcal{C}\interp{#1}\:#2\:#3}+\newcommand{\binterp}[3]{\mathcal{B}\interp{#1}\:#2\:#3}+\newcommand{\rinterp}[3]{\mathcal{R}\interp{#1}\:#2\:#3}+\newcommand{\iinterp}[3]{\mathcal{I}\interp{#1}\:#2\:#3}+\newcommand{\len}[1]{\MO{length}(#1)}++\newcommand{\casecomp}[2]{\mathcal{I}(#1,\left\{\ARc{#2}\right\})}+\newcommand{\casecompA}[3]{\mathcal{I}(#1,\left\{\ARc{#2}\right\}[#3])}+\newcommand{\ischeme}{\mathcal{I}}++% tail call markup++\newcommand{\tailcall}{\mathsf{tail}}++% Trees++\newcommand{\Tree}{\TC{Tree}}+\newcommand{\Leaf}{\DC{Leaf}}+\newcommand{\Node}{\DC{Node}}+\newcommand{\treecase}{\Cases{\Tree}}++% Languages++\newcommand{\Coq}{\textsc{Coq}}+\newcommand{\Lego}{\textsc{Lego}}+\newcommand{\Oleg}{\textsc{Oleg}}+\newcommand{\Alf}{\textsc{Alf}}+\newcommand{\Epigram}{\textsc{Epigram}}+\newcommand{\SystemF}{System $\mathcal{F}$}+\newcommand{\Iswim}{\textsc{Iswim}}+\newcommand{\Cynthia}{\textit{C$^Y$\hspace*{-0.1cm}NTHIA}}++% Accessibility++\newcommand{\Acc}{\TC{Acc}}+\newcommand{\acc}{\DC{acc}}+\newcommand{\qsAcc}{\TC{qsAcc}}+\newcommand{\qsNil}{\DC{qsNil}}+\newcommand{\qsCons}{\DC{qsCons}}+\newcommand{\allQsAcc}{\FN{allQsAcc}}++% Lazy shortcuts++\newcommand{\naive}{na\"{\i}ve}+\newcommand{\Naive}{Na\"{\i}ve}++% Conor's bits++\newcommand{\remem}[1]{\left|#1\right|}+\newcommand{\idsb}{\MO{id}}+\newcommand{\ang}[1]{\langle#1\rangle}++\newcommand{\vePm}[1]{\vP #1 \vm_{\Vnil} #1 \vm_{\Vcons}}%+\newcommand{\vcrhs}{\vm_{\Vcons}\:\vk\:\va\:\vv\:%+                     (\vectelim\:\vA\:\vk\:\vv\:\vePm{\:})}%++\newcommand{\igV}[2]{#1^{\ig{#2}}}+\newcommand{\remV}[2]{#1^{\rem{#2}}}++\newcommand{\FIXME}[1]{[\textbf{FIXME}: #1]}+%\newcommand{\FIXME}[1]{\wibble}++% More gubbins++\newcommand{\Between}{\TC{between}}+\newcommand{\bZ}{\DC{bO}}+\newcommand{\bZZS}{\DC{bOOs}}+\newcommand{\bZSS}{\DC{b0ss}}+\newcommand{\bSSS}{\DC{bsss}}+\newcommand{\betelim}{\Elim{\Between}}+\newcommand{\betrhs}[1]{\motive#1\meth{\bZ}#1\meth{\bZZS}#1\meth{\bZSS}#1\meth{\bSSS}}+++\newcommand{\valenv}{\TC{ValEnv}}+\newcommand{\vempty}{\DC{empty}}+\newcommand{\vextend}{\DC{extend}}++\newcommand{\EpiVal}{\TC{Epigram}}+\newcommand{\unsafeCoerce}{\HF{unsafeCoerce\mbox{\texttt{\#}}}}++\newcommand{\qq}{\mbox{\texttt{"}}}+\newcommand{\impossible}{\RW{Impossible}}++\newcommand{\Real}{\mathbb{R}}++\newcommand{\DoubleRec}{\TC{DoubleElim}}+\newcommand{\DoubleOn}{\DC{Double_{\Z\vn}}}+\newcommand{\DoubleSO}{\DC{Double_{\suc\Z}}}+\newcommand{\DoubleSS}{\DC{Double_{\suc\suc}}}++\newcommand{\doublerec}{\textbf{double-elim}}++\newcommand{\set}{\TC{DList}}+\newcommand{\setuser}{\TC{DListTop}}+\newcommand{\setempty}{\emptyset}+\newcommand{\setinsert}{\DC{insert}}+++%%%% Type systems++\newcommand{\stlc}{\lambda\hspace*{-0.15cm}\to}+\newcommand{\plc}{\lambda2}+\newcommand{\dlc}{\lambda{}P}++\newcommand{\EC}{\mathcal{E}}++%%%% reductions++\newcommand{\betared}{\iq\hspace*{-0.15cm}_{\beta}}+\newcommand{\deltared}{\iq\hspace*{-0.15cm}_{\delta}}+\newcommand{\gammared}{\iq\hspace*{-0.15cm}_{\gamma}}+\newcommand{\etared}{\iq\hspace*{-0.15cm}_{\eta}}+\newcommand{\iotared}{\iq\hspace*{-0.15cm}_{\iota}}+\newcommand{\rhored}{\iq\hspace*{-0.15cm}_{\rho}}++%%%% ExTT rules++\newcommand{\exconverts}{\stackrel{\mathsf{Ex}}{\converts}}+\newcommand{\excumul}{\stackrel{\mathsf{Ex}}{\cumul}}+\newcommand{\exequiv}{\stackrel{\mathsf{Ex}}{\equiv}}+\newcommand{\exreduces}{\stackrel{\mathsf{Ex}}\reduces}+\newcommand{\exreducesto}{\stackrel{\mathsf{Ex}}{\reducesto}}+\newcommand{\exreducesn}[1]{\exreduces_{#1}}++\newcommand{\ttequiv}{\stackrel{\mathsf{TT}}{\equiv}}+\newcommand{\ttreduces}{\stackrel{\mathsf{TT}}\reduces}+\newcommand{\ttreducesn}[1]{\ttreduces_{#1}}++%%% Type synthesis++\newcommand{\hastype}{\Longrightarrow}+\newcommand{\whnfs}{\twoheadrightarrow}+\newcommand{\conv}{\converts}++\newcommand{\exhastype}{\stackrel{\mathsf{Ex}}{\hastype}}+\newcommand{\exwhnfs}{\stackrel{\mathsf{Ex}}{\whnfs}}+\newcommand{\exconv}{\stackrel{\mathsf{Ex}}{\conv}}+\newcommand{\exproves}{\stackrel{\mathsf{Ex}}{\proves}}++\newcommand{\tthastype}{\stackrel{\mathsf{TT}}{\hastype}}+\newcommand{\ttwhnfs}{\stackrel{\mathsf{TT}}{\whnfs}}+\newcommand{\ttconv}{\stackrel{\mathsf{TT}}{\conv}}+\newcommand{\ttproves}{\stackrel{\mathsf{TT}}{\proves}}++%%% Lightning++\newcommand{\light}[1]{\lightning^{#1}}+\newcommand{\LHab}[1]{\pad{\;}{:^{#1}}}+\newcommand{\llam}[3]{\lambda#1\pad{\!}{:}^{#2}#3}+\newcommand{\lall}[3]{\forall#1\pad{\!}{:}^{#2}#3}+\newcommand{\lapp}[3]{#1(#2)^{#3}}+\newcommand{\larg}[2]{(#1)^{#2}}++\newcommand{\RName}[1]{\hspace*{0.1in}\mathsf{#1}}
+ papers/tutorial/programming.tex view
@@ -0,0 +1,6 @@+\section{Programming in $\source$}++% Types, definitions+% data structures, pattern matching, well founded definitions+% parameters, indices, inductive families+
+ papers/tutorial/theoremproving.tex view
@@ -0,0 +1,5 @@+\section{Theorem Proving}++% Elimination rules+% Basic tactics+
+ papers/tutorial/tutorial.tex view
@@ -0,0 +1,63 @@+\documentclass{article}+%\documentclass[orivec,dvips,10pt]{llncs}++\usepackage{epsfig}+\usepackage{path}+\usepackage{url}+\usepackage{amsmath,amssymb} ++\newenvironment{template}{\sffamily}++\usepackage{graphics,epsfig}+\usepackage{stmaryrd}++\input{macros.ltx}+\input{library.ltx}++\NatPackage++\newcommand{\Ivor}{\textsc{Ivor}}+\newcommand{\Funl}{\textsc{Funl}}+\newcommand{\Agda}{\textsc{Agda}}++\newcommand{\mysubsubsection}[1]{+\noindent+\textbf{#1}+}+\newcommand{\hdecl}[1]{\texttt{#1}}++\begin{document}++\title{\Ivor{}, a Tutorial}+\author{Edwin Brady}++%\institute{School of Computer Science, \\+% University of St Andrews, St Andrews, Scotland. \\ \texttt{Email: eb@cs.st-andrews.ac.uk}.\\+%\texttt{Tel: +44-1334-463253}, \texttt{Fax: +44-1334-463278} \vspace{0.1in}+%}+ +\maketitle++\input{introduction}++% Structure:++% Programming in TT+\input{programming}++% Theorem proving in TT+\input{theoremproving}++% Haskell library+\input{hslibrary}++\bibliographystyle{abbrv}+\begin{small}+\bibliography{../bib/literature.bib}++%\appendix++%\input{code}++\end{small}+\end{document}