packages feed

idris 0.1.7.1 → 0.9.0

raw patch · 99 files changed

+10926/−17174 lines, 99 filesdep +bytestringdep +filepathdep +haskelinedep −arraydep −haskell98dep −ivordep ~epicbuild-type:Customsetup-changed

Dependencies added: bytestring, filepath, haskeline, process, transformers

Dependencies removed: array, haskell98, ivor, old-locale, old-time, readline

Dependency ranges changed: epic

Files

− CHANGELOG
@@ -1,30 +0,0 @@-New in 0.1.6---------------* Changed dependent pair syntax to <| x, y |> so that << and >> can be-  integer shift operators.-* Removed '#' as type of types (must use 'Set' now).-* searchcontext tactic-* equalities.idr in the library-* codata keyword-* proof and tryproof keywords for invoking a decision procedure in a-  term-* Syntactic sugar for Cons lists-* Lots of smaller changes and bug fixes--New in 0.1.5---------------* Changed '#' to Set for the type of types-  - old syntax works, but is deprecated and will be removed soon.-* 'syntax' definitions-* %spec works in pattern clauses as well as CAFs-* Added 'Proof' type for marking computationally irrelevant terms.-* Added List permutation proofs to the library (perm.idr)-* Various new functions in the library.-* Lots of bug fixes--New in 0.1.4---------------* Namespaces
− Idris/AbsSyntax.lhs
@@ -1,1496 +0,0 @@-> {-# OPTIONS_GHC -fglasgow-exts #-}--> module Idris.AbsSyntax(module Idris.AbsSyntax, ->                        module Idris.Context) where--> import Control.Monad-> import Control.Monad.State-> import qualified Data.Map as Map-> import Debug.Trace-> import Data.Typeable-> import Data.Maybe-> import Data.List-> import Char--> import Ivor.TT-> import Ivor.Primitives--> import Idris.Context--> data Result r = Success r->               | Failure String String Int->     deriving (Show, Eq)-> -> instance Monad Result where->     (Success r)   >>= k = k r->     (Failure err fn line) >>= k = Failure err fn line->     return              = Success->     fail s              = Failure s "(no file)" 0-> -> instance MonadPlus Result where->     mzero = Failure "Error" "(no file)" 0->     mplus (Success x) _ = (Success x)->     mplus (Failure _ _ _) y = y-> --A program is a collection of datatype and function definitions.-We store everything directly as a 'ViewTerm' from Ivor.--> data Decl = DataDecl Datatype | Fwd Id RawTerm [CGFlag]->           | PInclude FilePath->           | Fun Function [CGFlag] | TermDef Id RawTerm [CGFlag] | Constructor->           | Prf Proof Bool -- 'True' means proof is allowed to fail->           | LatexDefs [(Id,String)]->           | Using [(Id, RawTerm)] [Decl] -- default implicit args->           | Params [(Id, RawTerm)] [Decl] -- default implicit args->           | DoUsing Id Id [Decl] -- bind and return names->           | Idiom Id Id [Decl] -- pure and ap names->           | Namespace Id [Decl] -- bind and return names->           | CLib String | CInclude String->           | Fixity String Fixity Int->           | Transform RawTerm RawTerm->           | SynDef Id [Id] RawTerm ->           | Freeze String Int [Id] Id->    deriving Show--Flags for controlling compilation. In particular, some functions exist only-run compile-time function generation, so we never want to generate code-(e.g. generating foreign functiond defs).-Also, some functions should be evaluated completely before code generation-(e.g. for statically knowing the C function to compile)-Functions may be exported to C, if they have a simple type (no polymorphism, no dependencies).--> data CGFlag = NoCG | CGEval | CExport String | Inline | CGSpec [(Id, Int)]->             | Vis Visibility->    deriving (Show, Eq)--Public: Name, type and definition visible globally-Abstract: Only name and type visible (i.e. no constructors, or definition)-  outside the namespace.-Private: Nothing visible outside the namespace.--> data Visibility = Public | Private | Abstract->    deriving (Show, Eq)--User defined operators have associativity and precedence--> data Fixity = LeftAssoc | RightAssoc | NonAssoc->    deriving (Show, Eq, Enum)--> type Fixities = [(String, (Fixity, Int))]--> data UserOps = UO { fixityDecls :: Fixities,->                     transforms :: [(ViewTerm, ViewTerm)],->                     frozen :: [Id],->                     syndefs :: Ctxt Syntax }->              deriving Show--Function types and clauses are given separately, so we'll parse them-separately then collect them together into a list of Decls--A FunClauseP is a clause which is probably the wrong type, but instructs-the system to insert a hole for a proof that turns it into the right type.--> data ParseDecl = RealDecl Decl->                | FunType Id RawTerm [CGFlag] String Int ->                | FunClause RawTerm [RawTerm] RawTerm [CGFlag]->                | FunClauseP RawTerm [RawTerm] RawTerm Id->                | WithClause RawTerm [RawTerm] Bool RawTerm [ParseDecl]->                | ProofScript Id [ITactic]->                | PUsing [(Id,RawTerm)] [ParseDecl]->                | PParams [(Id, RawTerm)] [ParseDecl]->                | PDoUsing (Id, Id) [ParseDecl]->                | PIdiom (Id, Id) [ParseDecl]->                | PNamespace Id [ParseDecl]->    deriving Show--> collectDecls :: [ParseDecl] -> Result [Decl]-> collectDecls pds = cds [] [] pds->   where cds rds fwds ((RealDecl d):ds) = cds (d:rds) fwds ds->         cds rds fwds ((FunType n t fl file line):ds) ->             = getClauses RPlaceholder rds fwds n (t, file, line) fl [] ds->         cds rds fwds ((FunClause (RVar f l n _) [] ret fl):ds) ->                 = cds ((TermDef n ret fl):rds) fwds ds->         cds rds fwds ds@((FunClause app [] ret fl):_) ->             = case getFnName app of->                 Just (n, file, line) -> ->                    case (lookup n fwds) of->                      Nothing -> fail $ "No type declaration for " ++ show n->                      Just (ty,fl) -> getClauses app rds fwds n (ty, file, line) fl [] ds->                 _ -> fail $ "Invalid pattern clause"->         cds rds fwds ((ProofScript n prf):ds)->             = case lookup n fwds of->                      Nothing ->->                          cds ((Prf (Proof n Nothing prf) False):rds) fwds ds->                      Just (ty, fl) -> ->                          cds ((Prf (Proof n (Just ty) prf) False):rds) fwds ds->         cds rds fwds ((PUsing uses pds):ds) = ->                case (cds [] [] pds) of->                   Success d ->->                       cds ((Using uses d):rds) fwds ds->                   failure -> failure->         cds rds fwds ((PParams params pds):ds) = ->                case (cds [] [] pds) of->                   Success d ->->                       cds ((Params params d):rds) fwds ds->                   failure -> failure->         cds rds fwds ((PDoUsing (ub,ur) pds):ds) = ->                case (cds [] [] pds) of->                   Success d ->->                       cds ((DoUsing ub ur d):rds) fwds ds->                   failure -> failure->         cds rds fwds ((PNamespace ns pds):ds) = ->                case (cds [] [] pds) of->                   Success d ->->                       cds ((Namespace ns d):rds) fwds ds->                   failure -> failure->         cds rds fwds ((PIdiom (up,ua) pds):ds) = ->                case (cds [] [] pds) of->                   Success d ->->                       cds ((Idiom up ua d):rds) fwds ds->                   failure -> failure->         cds rds fwds (d:ds) = fail $ "Invalid declaration: " ++ show d->         cds rds fwds [] = return (reverse rds)--->         getClauses parent rds fwds n t fl clauses ((FunClause RPlaceholder [with] ret fl'):ds)->             = getClauses parent rds fwds n t fl clauses ((FunClause parent [with] ret fl'):ds)->         getClauses parent rds fwds n t fl clauses ((FunClause pat withs ret fl'):ds)->             | Just (f,l) <- isnm n (getFn pat)->                = getClauses parent rds fwds n t fl ((n, RawClause (mkApp f l pat withs) ret):clauses) ds->         getClauses parent rds fwds n t fl clauses ((FunClauseP RPlaceholder [with] ret mv):ds)->             = getClauses parent rds fwds n t fl clauses ((FunClauseP parent [with] ret mv):ds)->         getClauses parent rds fwds n t fl clauses ((FunClauseP pat withs ret mv):ds)->             | Just (f,l) <- isnm n (getFn pat)->                 = getClauses parent rds fwds n t fl ->                       ((n, RawClause (mkApp f l pat withs) (mkhret mv ret)):clauses) ds->         getClauses parent rds fwds n t fl clauses ((WithClause RPlaceholder [with] prf ret fl'):ds)->             = getClauses parent rds fwds n t fl clauses ((WithClause parent [with] prf ret fl'):ds)->         getClauses parent rds fwds n t fl clauses ((WithClause pat withs prf scr defs):ds)->             | Just (f,l) <- isnm n (getFn pat)->                 = do wcl <- collectWiths (mkApp f l pat withs) rds fwds n t fl defs->                      getClauses parent rds fwds n t fl ->                          ((n, RawWithClause (mkApp f l pat withs) prf scr wcl):clauses) ds->         getClauses parent rds fwds n (t, _, _) fl [] ds ->                = cds ((Fwd n t fl):rds) ((n,(t,fl)):fwds) ds->         getClauses parent rds fwds n (t,file,line) fl clauses ds =->             cds ((Fun (Function n t (reverse clauses) file line) fl):rds) fwds ds-->         isnm n (RVar f l nm _) | nm == n = Just (f,l)->         isnm _ _ = Nothing-->         collectWiths parent rds fwds n t fl cs = ->              do cls <- getClauses parent [] [] n t fl [] cs->                 case cls of->                     [Fun (Function _ _ cl _ _) _] -> return (map snd cl)->                     _ -> fail $ "Invalid with clause for " ++ show n--         collectWiths rds fwds n t fl ((FunClause pat ex rhs []):cs) =-             | (RVar n) == getFn pat-                 = RawClause (mkApp pat withs)-->         mkhret mv v = RBind (UN "value") (RLet v RPlaceholder) ->                             (RMetavar mv)--> data Datatype = Datatype {->                           tyId :: Id,->                           tyType :: RawTerm,->                           tyConstructors :: [(Id, RawTerm)],->                           tyImplicits :: [(Id, RawTerm)],->                           tyOpts :: [TyOpt],->                           tyFile :: String,->                           tyLine :: Int->                          }->               | Latatype { tyId :: Id,->                            tyType :: RawTerm,->                            tyFile :: String,->                            tyLine :: Int ->                          } -- forward declaration->   deriving Show--> data TyOpt = NoElim | Collapsible | Codata->   deriving (Show, Eq, Enum)--> tyHasElim dt = not (elem NoElim (tyOpts dt))-> collapsible dt = elem Collapsible (tyOpts dt)--> data Function = Function {->                           funId :: Id,->                           funType :: RawTerm,->                           funClauses :: [(Id, RawClause)],->                           funFile :: String,->                           funLine :: Int->                          }->   deriving Show--> data Proof = Proof {->                     proofId :: Id,->                     proofType :: Maybe RawTerm,->                     proofScript :: [ITactic]->                    }->   deriving Show--> getId :: Decl -> Id-> getId (Fun f _) = funId f-> getId (DataDecl d) = tyId d-> getId (TermDef n tm _) = n--Raw terms, as written by the programmer with no implicit arguments added.--> data RawTerm = RVar String Int Id NameType->              | RVars String Int [Id]->              | RExpVar String Int Id -- variable with all explicit args->              | RApp String Int RawTerm RawTerm->              | RAppImp String Int Id RawTerm RawTerm -- Name the argument we make explicit->              | RBind Id RBinder RawTerm->              | RConst String Int Constant->              | RPlaceholder->              | RMetavar Id->              | RMetavarPrf Id [ITactic] Bool -- Bool for if proof is allowed to fail->              | RInfix String Int Op RawTerm RawTerm->              | RUserInfix String Int Bool String RawTerm RawTerm->              | RDo [Do]->              | RReturn String Int->              | RIdiom RawTerm->              | RPure RawTerm -- a term to apply normally inside idiom brackets->              | RRefl->              | RError String Int String -- Hackety. Found an error in processing, report when you can.->    deriving (Show, Eq)--> data RBinder = Pi Plicit [ArgOpt] RawTerm->              | Lam RawTerm->              | RLet RawTerm RawTerm->    deriving (Show, Eq)--> data Plicit = Im | Ex->    deriving (Show, Eq, Enum)--> data ArgOpt = Lazy | Static->    deriving (Show, Eq, Enum)--> data Do = DoBinding String Int Id RawTerm RawTerm->         | DoLet String Int Id RawTerm RawTerm->         | DoExp String Int RawTerm->     deriving (Show, Eq)--> data ITactic = Intro [Id]->              | Refine Id->              | Exists RawTerm->              | Generalise RawTerm->              | ReflP->              | Induction RawTerm->              | Fill RawTerm->              | Trivial->              | SimpleSearch->              | Case RawTerm->              | Rewrite Bool Bool RawTerm->              | Unfold Id->              | Compute->              | Equiv RawTerm->              | Believe RawTerm->              | Use RawTerm->              | Decide RawTerm->              | Undo->              | Abandon->              | ProofTerm->              | RunTactic RawTerm -- tactic computed from lib/tactics.idr->              | Qed->     deriving (Show, Eq)--> getArgOpt :: ArgOpt -> RawTerm -> [Int]-> getArgOpt ao tm = gl' 0 tm->   where gl' i (RBind n (Pi _ opts _) sc) ->               | ao `elem` opts = i:(gl' (i+1) sc)->         gl' i (RBind n (Pi Ex _ _) sc) = gl' (i+1) sc->         gl' i (RBind n (Pi Im _ _) sc) = gl' i sc->         gl' i x = []--> getLazy = getArgOpt Lazy-> getStatic = getArgOpt Static--> mkLazy :: ViewTerm -> ViewTerm-> mkLazy t = App (App (Name Unknown (name "__lazy")) Placeholder) t--> getFileLine :: RawTerm -> (String, Int)-> getFileLine (RApp f l _ _) = (f, l)-> getFileLine (RAppImp f l _ _ _) = (f, l)-> getFileLine (RVar f l _ _) = (f, l)-> getFileLine (RExpVar f l _) = (f, l)-> getFileLine (RInfix f l _ _ _) = (f, l)-> getFileLine (RUserInfix f l _ _ _ _) = (f, l)-> getFileLine (RConst f l _) = (f, l)-> getFileLine (RBind _ (Pi _ _ ty) _) = getFileLine ty-> getFileLine (RBind _ (Lam ty) _) = getFileLine ty-> getFileLine _ = ("(unknown)", 0)--> getFn :: RawTerm -> RawTerm-> getFn (RApp _ _ f a) = getFn f-> getFn (RAppImp _ _ _ f a) = getFn f-> getFn f = f--> getArgTypes :: RawTerm -> [(Id,RawTerm)]-> getArgTypes tm = gat tm [] where->     gat (RBind n (Pi _ _ ty) sc) acc = gat sc ((n,ty):acc)->     gat sc acc = reverse acc--> getRetType :: RawTerm -> RawTerm-> getRetType (RBind n (Pi _ _ ty) sc) = getRetType sc-> getRetType x = x--> getFnName f = case getFn f of->                 (RVar f l n _) -> Just (n,f,l)->                 _ -> Nothing--> getRawArgs :: RawTerm -> [RawTerm]-> getRawArgs x = args [] x->    where args acc (RApp _ _ f a) = args (a:acc) f->          args acc (RAppImp _ _ _ f a) = args (a:acc) f->          args acc f = acc--> getExplicitArgs :: RawTerm -> [RawTerm]-> getExplicitArgs x = args [] x->    where args acc (RApp _ _ f a) = args (a:acc) f->          args acc (RAppImp _ _ _ f a) = args acc f->          args [] (RInfix _ _ _ x y) = [x,y]->          args [] (RUserInfix _ _ _ _ x y) = [x,y]->          args acc f = acc--Binders; Pi (either implicit or explicitly written), Lambda and Let with-value.--> data Constant = Num Int->               | Str String->               | Bo Bool->               | Ch Char->               | Fl Double->               | TYPE->               | LTYPE->               | StringType->               | IntType->               | FloatType->               | CharType->               | PtrType->               | Builtin String -- builtin type, eg Handle or Lock->    deriving (Eq, Ord)--> instance ViewConst Char where->     typeof x = (name "Char")--> instance Show Constant where->     show (Num i) = show i->     show (Str s) = show s->     show (Bo b) = show b->     show (Ch c) = show c->     show (Fl d) = show d->     show TYPE = "Set"->     show LTYPE = "LSet"->     show IntType = "Int"->     show FloatType = "Float"->     show CharType = "Char"->     show StringType = "String"->     show PtrType = "Ptr"->     show (Builtin s) = s--Operators, more precisely, are built-in functions on primitive types which both the -typechecker and compiler need to know how to run. First we have the usual set of infix -operators (plus John Major equality):--> data Op = Plus  | Minus  | Times  | Divide | Modulo | Concat | JMEq->         | FPlus | FMinus | FTimes | FDivide->         | OpEq  | OpLT   | OpLEq  | OpGT   | OpGEq  ->         | OpFEq | OpFLT  | OpFLEq | OpFGT  | OpFGEq ->         | OpOr  | OpAnd | ShL    | ShR--Then built-in functions for coercing between types-->         | ToString | ToInt ->         | FloatToString | StringToFloat->         | IntToChar | CharToInt--Finally some primitive operations on primitive types.-->         | StringLength | StringGetIndex | StringSubstr->         | StringHead | StringTail | StringCons | StringRev->         | StringFind | StringSub->    deriving (Eq, Enum)--> allOps = [Plus,Minus,Times,Divide,Modulo,FPlus,FMinus,FTimes,FDivide,->           Concat,ShL,ShR,JMEq,OpEq,OpLT,OpLEq,OpGT,OpGEq,->           OpFEq,OpFLT,OpFLEq,OpFGT,OpFGEq]--> instance Show Op where->     show Plus = "+"->     show Minus = "-"->     show Times = "*"->     show Divide = "/"->     show Modulo = "%"->     show FPlus = "+."->     show FMinus = "-."->     show FTimes = "*."->     show FDivide = "/."->     show Concat = "++"->     show JMEq = "="->     show OpEq = "=="->     show OpLT = "<"->     show OpLEq = "<="->     show OpGT = ">"->     show OpGEq = ">="->     show OpFEq = "==."->     show OpFLT = "<."->     show OpFLEq = "<=."->     show OpFGT = ">."->     show OpFGEq = ">=."->     show OpOr = "||"->     show OpAnd = "&&"->     show ShL = "<<"->     show ShR = ">>"--> opFn Plus = (name "__addInt")-> opFn Minus = (name "__subInt")-> opFn Times = (name "__mulInt")-> opFn Divide = (name "__divInt")-> opFn Modulo = (name "__modInt")-> opFn FPlus = (name "__addFloat")-> opFn FMinus = (name "__subFloat")-> opFn FTimes = (name "__mulFloat")-> opFn FDivide = (name "__divFloat")-> opFn Concat = (name "__concat")-> opFn JMEq = (name "Eq")-> opFn OpEq = (name "__eq")-> opFn OpLT = (name "__intlt")-> opFn OpLEq = (name "__intleq")-> opFn OpGT = (name "__intgt")-> opFn OpGEq = (name "__intgeq")-> opFn OpFEq = (name "__feq")-> opFn OpFLT = (name "__floatlt")-> opFn OpFLEq = (name "__floatleq")-> opFn OpFGT = (name "__floatgt")-> opFn OpFGEq = (name "__floatgeq")-> opFn OpOr = (name "__or")-> opFn OpAnd = (name "__and")-> opFn ShL = (name "__shl")-> opFn ShR = (name "__shr")--> opFn ToInt = (name "__toInt")-> opFn ToString = (name "__toString")-> opFn StringToFloat = (name "__stringToFloat")-> opFn FloatToString = (name "__floatToString")-> opFn CharToInt = (name "__charToInt")-> opFn IntToChar = (name "__intToChar")--> opFn StringLength = (name "__strlen")-> opFn StringGetIndex = (name "__strgetIdx")-> opFn StringSubstr = (name "__substr")-> opFn StringHead = (name "__strHead")-> opFn StringTail = (name "__strTail")-> opFn StringRev = (name "__strRev")-> opFn StringFind = (name "__strFind")-> opFn StringSub = (name "__substr")-> opFn StringCons = (name "__strCons")--> useropFn fn = UN $ "__op_" ++ concat (map opC fn) where->     opC c = "_" ++ show (fromEnum c)--Pattern clauses--> data RawClause = RawClause { lhs :: RawTerm,->                              rhs :: RawTerm }->                | RawWithClause { lhs :: RawTerm,->                                  addproof :: Bool,->                                  scrutinee :: RawTerm,->                                  defn :: [RawClause] }->    deriving Show--> mkApp :: String -> Int -> RawTerm -> [RawTerm] -> RawTerm-> mkApp file line f [] = f-> mkApp file line f (a:as) = mkApp file line (RApp file line f a) as--For each raw definition, we'll translate it into something Ivor will understand-with all the placeholders added. For this we'll need to know how many-implicit arguments each function has.--> data IvorFun = IvorFun {->       ivorFName :: Maybe Name,->       ivorFType :: (Maybe ViewTerm),->       implicitArgs :: Int,->       -- paramArgs :: Int,->       ivorDef :: Maybe IvorDef,->       rawDecl :: Decl, -- handy to keep around for display + extra data->       funFlags :: [CGFlag],->       lazyArgs :: [Int],->       staticArgs :: [Int]->     }->              | IvorProblem String->    deriving Show--> getNameType :: IvorFun -> NameType-> getNameType i = case rawDecl i of->                   Fun _ _ -> Free->                   TermDef _ _ _ -> Free->                   Prf _ _ -> Free->                   Fwd _ _ _ -> Free->                   Constructor -> DataCon->                   _ -> Unknown--> mkNameMap :: Ctxt IvorFun -> [(Name, Id)]-> mkNameMap ctxt = mapMaybe mknm (ctxtAlist ctxt)->   where mknm (n, IvorProblem _) = Nothing->         mknm (n, i) = do iname <- ivorFName i->                          return (iname, n)--Get all the pattern definitions. Get the user specified one, not the-Ivor expanded one (i.e. with the placeholders as the user specified) so-that we avoid pattern matching where the programmer didn't ask us to.--> getRawPatternDefs :: Ctxt IvorFun -> Context ->->                      [(Name, (ViewTerm, Patterns))]-> getRawPatternDefs raw ctxt = gdefs (ctxtAlist raw) where->     gdefs [] = []->     gdefs ((n, IvorFun _ _ _ _ (decl@(LatexDefs _)) _ _ _):ds) = gdefs ds->     gdefs ((n, IvorFun _ _ _ _ (decl@(Fixity _ _ _)) _ _ _):ds) = gdefs ds->     gdefs ((n, IvorFun _ _ _ _ (decl@(Transform _ _)) _ _ _):ds) = gdefs ds->     gdefs ((n, IvorFun _ _ _ _ (decl@(SynDef _ _ _)) _ _ _):ds) = gdefs ds->     gdefs ((n, IvorFun _ _ _ _ (decl@(Freeze _ _ _ _)) _ _ _):ds) = gdefs ds->     gdefs ((n, ifun):ds)->        = let Just iname = ivorFName ifun in->             case (ivorFType ifun, ivorDef ifun) of->               (Just ty, Just (PattDef ps)) -> ->                   (iname, (ty,ps)):(gdefs ds)->               _ -> case getPatternDef ctxt iname of->                      Right (ty,ps) -> (iname, (ty,ps)):(gdefs ds)->                      _ -> gdefs ds--Name definitions Ivor-side.--> data IvorDef = PattDef !Patterns -- pattern matching function->              | ITyCon -- Type constructor->              | IDataCon -- Data constructor->              | SimpleDef !ViewTerm -- simple function definition->              | DataDef !Inductive Bool -- data type definition, generate elim->              | IProof [ITactic] Bool -- True if failable->              | Later -- forward declaration->              | LataDef -- forward declared data->    deriving Show--A transformation is a function converting a ViewTerm to a new form.--> data Transform = Trans String ->                        (Maybe (ViewTerm -> ViewTerm)) ->                        (Maybe TransData)--A syntax definition is a syntax level transformation from one term to another-(macros, essentially).--> data Syntax = Syntax Id [Id] RawTerm->   deriving Show--Concrete transformation data, used for rebuilding constructor transforms--> data TransData = Force (Maybe (Name, Name)) Int Name [Name] ->                        [(Name, ViewTerm)] Int->                | Collapse Name Name ViewTerm Int->                | Drop Name ViewTerm [Int] Int--> data Opt = NoErasure | ShowRunTime | NoSpec | Verbose->    deriving (Show, Eq, Enum)--> type Statics = [(Name, ([Int], Int, ViewTerm))]--Things we've partially evaluated that transform rules already exist for-(so don't make another one)--> type StaticUsed = [(Name, [ViewTerm])]--> data IdrisState = IState {->       idris_context :: Ctxt IvorFun, -- function definitions->       idris_decls :: [Decl], -- all checked declarations->       idris_metavars :: [(Name, ViewTerm)], -- things still to prove->       idris_options :: [Opt], -- global options->       idris_fixities :: UserOps, -- infix operators and precedences->       idris_transforms :: [Transform], -- optimisations->       idris_syntax :: Ctxt Syntax, -- syntax macros->       idris_imports :: [FilePath], -- included files->       idris_names :: [(Name, Id)], -- map ivor names back to idris names->       idris_static :: Statics, -- map from functions to static args->       idris_static_used :: StaticUsed->     }--> instance Show (Ctxt Syntax) where->     show xs = show (ctxtAlist xs)--> initState :: [Opt] -> IdrisState-> initState opts = IState newCtxt [] [] opts (UO [] [] [] newCtxt) [] newCtxt [] [] [] []--Add implicit arguments to a raw term representing a type for each undefined -name in the scope, returning the number of implicit arguments the resulting-type has.--We only want names which appear *in argument position*, e.g. P a we'd add a -but not P. [[We also don't want names which appear in the return type, since-they'll never be inferrable at the call site. (Not done this. Not convinced.) ]]--> addImpl :: Ctxt IvorFun -> RawTerm -> (RawTerm, Int) -> addImpl = addImpl' True [] [] []--> addImplWith :: Implicit -> Ctxt IvorFun -> RawTerm -> (RawTerm, Int) -> addImplWith (Imp using params paramnames ns) = addImpl' True using params ns--Bool says whether to pi bind unknown names-Also take a mapping of names to types ('using') --- if any name we need to -bind is  in the list, use the given type. Also sort the resulting bindings -so that they are in the same order as in 'using', and appear after any-other introduced bindings.--'params' is the arguments that the current group of definitions is parameterised over.-These should be added as *explicit* arguments.--Need to do it twice, in case the first pass added names in the indices-(from using)--> addImpl' :: Bool -> [(Id, RawTerm)] -> [(Id, RawTerm)] -> [Id] -> Ctxt IvorFun -> ->             RawTerm -> (RawTerm, Int) -> addImpl' pi using params namespace ctxt raw' ->             = let raw = parambind params raw'->                   (newargs, totimp) = execState (addImplB [] raw True) ([],0) in->                   if pi then ->                      let added = pibind Im (mknew newargs) raw in->                         if null using->                           then (added, totimp)->                           else let (added', totimp') = addImpl' True [] [] namespace ctxt added in->                                (added', totimp')->                      else (raw, totimp)->     where addImplB :: [Id] -> RawTerm -> Bool -> State ([Id], Int) ()->           addImplB env (RVar f l i _) argpos->               | i `elem` env = return ()->               | Right _ <- ctxtLookup ctxt namespace i = return ()--Only do it in argument position-->               | argpos = do (nms, tot) <- get->                             if (i `elem` nms) then return ()->                                 else put (i:nms, tot+1)->               | otherwise = return ()->           addImplB env ap@(RApp _ _ f a) argpos->                    = do addImplB env f False->                         addImplB env a True->           addImplB env (RAppImp _ _ _ f a) argpos ->                    = do addImplB env f False->                         addImplB env a True->           addImplB env (RBind n (Pi Im _ ty) sc) argpos->                    = do (nms, tot) <- get->                         put (nms, tot+1)->                         addImplB env ty argpos->                         addImplB (n:env) sc argpos->           addImplB env (RBind n (Pi Ex _ ty) sc) argpos->                    = do addImplB env ty True->                         addImplB (n:env) sc argpos->           addImplB env (RBind n (Lam ty) sc) argpos->                    = do addImplB env ty argpos->                         addImplB (n:env) sc argpos->           addImplB env (RBind n (RLet val ty) sc) argpos->                    = do addImplB env val argpos->                         addImplB env ty argpos->                         addImplB (n:env) sc argpos->           addImplB env (RInfix _ _ op l r) argpos->                    = do addImplB env l argpos->                         addImplB env r argpos->           addImplB env (RUserInfix _ _ _ op l r) argpos->                    = do addImplB env l argpos->                         addImplB env r argpos->           addImplB env _ _ = return ()-->           mknew :: [Id] -> [(Id, RawTerm)]->           mknew args = map fst (sortBy ordIdx (map addTy args))-->           ordIdx (a, x) (b, y) = compare x y-->           addTy n = case lookupIdx n using of->                        Just (t, i) -> ((n,t), i)->                        _ -> ((n,RPlaceholder), -1)-->           parambind :: [(Id, RawTerm)] -> RawTerm -> RawTerm->           parambind xs (RBind n b@(Pi Im strict ty) sc) = RBind n b (parambind xs sc)->           parambind xs sc = pibind Ex xs sc--> pibind :: Plicit -> [(Id, RawTerm)] -> RawTerm -> RawTerm-> pibind plicit [] raw = raw-> pibind plicit ((n, ty):ns) raw->     = RBind n (Pi plicit [] ty) (pibind plicit ns raw)--Is this, or something like it, in the Haskell libraries?--> lookupIdx :: Eq a => a -> [(a,b)] -> Maybe (b, Int)-> lookupIdx x xs = li' 0 x xs->    where li' i x [] = Nothing->          li' i x ((y,v):ys) | x == y = Just (v, i)->                             | otherwise = li' (i+1) x ys--Convert a raw term with all the implicit things added into an ivor term-ready for typechecking--> toIvorName :: Id -> Name-> toIvorName i = name (show i)--Lookup the original Idris name of a name from Ivor. Makes up a name if-the name doesn't exist.--> fromIvorName :: IdrisState -> Name -> Id-> fromIvorName ist i = case lookup i (idris_names ist) of->                        Just n -> n->                        _ -> UN (show i)--Make up a plausible Idris name from a name from Ivor (only really useful-for display purposes, or if it really doesn't matter whether the name exists -or not)--> fromIvorName_ :: Name -> Id-> fromIvorName_ i = UN (show i)--For desugaring -- do blocks, idiom brackets and syntax definitions--> data UndoInfo = UI Id Int -- bind, bind implicit->                    Id Int -- return, return implicit->                    Id Int -- pure, pure implicit->                    Id Int -- ap, ap implicit--> data ModInfo = MI Id -- namespace->                   [(Id, RawTerm)] -- parameters--Implicit argument information; current using clause and parameters. We also need to know -the functions in the current block, and which arguments to add automatically, because the-programmer doesn't have to write them down inside the param block.--> data Implicit = Imp { impUsing :: [(Id, RawTerm)], -- 'using'->                       params :: [(Id, RawTerm)], -- extra params->                       paramNames :: [(Id, [Id])], -- functions and params in the current block->                       thisNamespace :: [Id]->                     }--> noImplicit = Imp [] [] [] []--> addUsing :: Implicit -> Implicit -> Implicit-> addUsing (Imp a b pns ns) (Imp a' b' pns' ns') -- ns always == ns'->              = Imp (a++a') (b++b') (pns++pns') ns--> addParams :: Implicit -> [(Id, RawTerm)] -> Implicit-> addParams (Imp a b pns ns) newps = Imp a (b++newps) pns ns--> addNS :: Implicit -> Id -> Implicit-> addNS (Imp a b pns ns) n = Imp a b pns (n:ns)--> fullName :: Implicit -> Id -> Id-> fullName imp n = mkName (thisNamespace imp) n--> addParamName :: Implicit -> Id -> Implicit-> addParamName imp@(Imp u ps pns ns) n->     = case lookup n pns of->          Just _ -> imp->          Nothing -> Imp u ps ((n, (map fst ps)):pns) ns--> bindName = ioname "bind"-> ibindName = ioname "ibind"-> retName = ioname "ret"-> ioretName = ioname "IOReturn"-> iodoName = ioname "IODo"-> ioliftName = ioname "IOLift"-> applyName = ioname "apply"--> bindNamei = toIvorName bindName-> ibindNamei = toIvorName ibindName-> retNamei = toIvorName retName-> ioretNamei = toIvorName ioretName-> iodoNamei = toIvorName iodoName-> ioliftNamei = toIvorName ioliftName-> applyNamei = toIvorName applyName--> ioname n = NS [UN "IO"] (UN n)-> ionamei n = toIvorName (ioname n)--> defDo = UI bindName 2 retName 1 retName 1 applyName 2--Give names to unnamed metavariables, and record any associated proof-scripts--> insertMetas :: Id -> RawTerm -> State (Int, [(Id, [ITactic], Bool)]) RawTerm-> insertMetas fname tm = im tm->     where im (RMetavarPrf (UN "") tacs prf)->                 = do (h, ts) <- get->                      let nm = mkName fname h->                      put (h+1, (nm, tacs, prf):ts)->                      return $ RMetavar nm->           im (RApp f l x a) ->               = do x' <- im x->                    a' <- im a->                    return $ RApp f l x' a'->           im (RAppImp f l arg x a) ->               = do x' <- im x->                    a' <- im a->                    return $ RAppImp f l arg x' a'->           im (RBind n bind t)->               = do bind' <- imb bind->                    t' <- im t->                    return $ RBind n bind' t->           im (RInfix f l op x y)->               = do x' <- im x->                    y' <- im y->                    return $ RInfix f l op x' y'->           im (RUserInfix f l b op x y)->               = do x' <- im x->                    y' <- im y->                    return $ RUserInfix f l b op x' y'->           im (RDo ds) = do ds' <- mapM imd ds->                            return $ RDo ds'->           im (RIdiom t) = do t' <- im t->                              return $ RIdiom t'->           im (RPure t) = do t' <- im t->                             return $ RPure t'->           im x = return x-->           imb (Pi p opts t) = do t' <- im t->                                  return $ Pi p opts t'->           imb (Lam t) = do t' <- im t->                            return $ Lam t->           imb (RLet t v) = do t' <- im t->                               v' <- im v->                               return $ RLet t' v'-->           imd (DoBinding f l i x y)->               = do x' <- im x->                    y' <- im y->                    return $ DoBinding f l i x' y'->           imd (DoLet f l i x y)->               = do x' <- im x->                    y' <- im y->                    return $ DoLet f l i x' y'->           imd (DoExp f l x)->               = do x' <- im x->                    return $ DoExp f l x'-->           mkName (UN n) i = UN ("__"++n++"_"++show i)->           mkName (MN n j) i = MN ("__"++n++"_"++show i) j---> insertMetasClauses :: Id -> [(Id, RawClause)] -> ->                       State (Int, [(Id, [ITactic], Bool)]) [(Id, RawClause)]-> insertMetasClauses fn xs = mapM imcp xs where->     imcp (n, t) = do t' <- imc t->                      return (n, t')->     imc (RawClause lhs rhs) = ->         do lhs' <- insertMetas fn lhs->            rhs' <- insertMetas fn rhs->            return (RawClause lhs' rhs')->     imc (RawWithClause lhs prf scr def) =->         do lhs' <- insertMetas fn lhs->            scr' <- insertMetas fn scr->            def' <- mapM imc def->            return (RawWithClause lhs' prf scr' def')--> toIvor :: UserOps -> UndoInfo -> Id -> RawTerm -> ViewTerm-> toIvor uo ui fname tm = evalState (toIvorS tm) (0,1)->   where->     toIvorS :: RawTerm -> State (Int, Int) ViewTerm->     toIvorS (RVar f l n ty) = return $ Annotation (FileLoc f l) (Name ty (toIvorName n))->     toIvorS (RVars f l ns) = return $ Annotation (FileLoc f l) (Overloaded (map toIvorName ns))->     toIvorS ap@(RApp file line f a)->            = do f' <- toIvorS f->                 a' <- toIvorS a->                 return (Annotation (FileLoc file line) (App f' a'))->     toIvorS (RBind (MN "X" 0) (Pi _ _ ty) sc) ->            = do ty' <- toIvorS ty->                 sc' <- toIvorS sc->                 (i, x) <- get->                 put (i+1, x)->                 return $ Forall (toIvorName (MN "X" i)) ty' sc'->     toIvorS (RBind n (Pi _ _ ty) sc) ->            = do ty' <- toIvorS ty->                 sc' <- toIvorS sc->                 return $ Forall (toIvorName n) ty' sc'->     toIvorS (RBind n (Lam ty) sc) ->            = do ty' <- toIvorS ty->                 sc' <- toIvorS sc->                 return $ Lambda (toIvorName n) ty' sc'->     toIvorS (RBind n (RLet val ty) sc) ->            = do ty' <- toIvorS ty->                 val' <- toIvorS val->                 sc' <- toIvorS sc->                 return $ Let (toIvorName n) ty' val' sc'->     toIvorS (RConst _ _ c) = return $ toIvorConst c->     toIvorS RPlaceholder = return Placeholder->     toIvorS (RMetavar (UN "")) -- no name, so make on eup->                 = do (i, h) <- get->                      put (i, h+1)->                      return $ Metavar (toIvorName (mkName fname h))->     toIvorS (RMetavar n) = return $ Metavar (toIvorName n)->     toIvorS (RInfix file line JMEq l r) ->                 = do l' <- toIvorS l->                      r' <- toIvorS r->                      return $ Annotation (FileLoc file line) ->                                 (apply (Name Unknown (opFn JMEq)) ->                                 [Placeholder, Placeholder,l',r'])->     toIvorS (RInfix file line OpEq l r) ->                 = do l' <- toIvorS l->                      r' <- toIvorS r->                      return $ Annotation (FileLoc file line)->                                 (apply (Name Unknown (opFn OpEq))->                                 [Placeholder,l',r'])->     toIvorS (RInfix file line op l r) ->                 = do l' <- toIvorS l->                      r' <- toIvorS r->                      return $ Annotation (FileLoc file line)->                               (apply (Name Unknown (opFn op)) [l',r'])->     toIvorS (RDo dos) = do tm <- undo ui dos->                            toIvorS tm->     toIvorS (RReturn f l)->       = do let (UI _ _ ret retImpl _ _ _ _) = ui->            toIvorS $ mkApp f l (RVar f l ret Unknown) (take retImpl (repeat RPlaceholder))->     toIvorS (RIdiom tm) = do let tm' = unidiom ui tm->                              toIvorS tm'->     toIvorS (RPure t) = toIvorS t->     toIvorS RRefl = return $ apply (Name Unknown (name "refl")) [Placeholder]->     toIvorS (RError f l x) = error (f ++ ":" ++ show l ++ ":" ++ x)->     toIvorS x = error ("Can't happen, toIvorS: " ++ show x)-->     mkName (UN n) i = UN (n++"_"++show i)->     mkName (MN n j) i = MN (n++"_"++show i) j--> toIvorConst (Num x) = Constant x-> toIvorConst (Str str) = Constant str-> toIvorConst (Bo True) = Name Unknown (name "true")-> toIvorConst (Bo False) = Name Unknown (name "false")-> toIvorConst (Ch c) = Constant c-> toIvorConst (Fl f) = Constant f-> toIvorConst TYPE = Star-> toIvorConst LTYPE = LinStar-> toIvorConst StringType = Name Unknown (name "String")-> toIvorConst IntType = Name Unknown (name "Int")-> toIvorConst FloatType = Name Unknown (name "Float")-> toIvorConst CharType = Name Unknown (name "Char")-> toIvorConst PtrType = Name Unknown (name "Ptr")-> toIvorConst (Builtin ty) = Name Unknown (name ty)--Convert a raw term to an ivor term, adding placeholders--> makeIvorTerm :: Implicit -> UndoInfo -> UserOps -> Id -> Ctxt IvorFun -> RawTerm -> ViewTerm-> makeIvorTerm using ui uo n ctxt tm ->                  = let expraw = addPlaceholders ctxt using uo tm in->                                 toIvor uo ui n expraw--Apply syntax macros, and fixity declarations. -Assume they are terminating (perhaps check this by not-allowing recursion in them).--> syntax :: Ctxt IvorFun -> Implicit -> UserOps -> RawTerm -> RawTerm-> syntax ctxt using (UO uo _ _ syns) tm ->   = let ans = shiftimpl (syn (fixes tm)) in->        -- trace ("BEFORE: " ++ showImp False (fixes tm) ++ "\nAFTER: " ++->         --      showImp False ans) ->         ans->     where syn (RVar f l n _) = doSynN f l n syns->           syn app@(RApp file line f a) ->                   = doSyn (RApp file line (syn f) (syn a)) ->                            syns (syn f) [syn a]->           syn (RAppImp file line n f a) = RAppImp file line n (syn f) (syn a)->           syn (RBind n (Pi p opts t) sc)->               = RBind n (Pi p opts (syn t)) (syn sc)->           syn (RBind n (Lam t) sc)->               = RBind n (Lam (syn t)) (syn sc)->           syn (RBind n (RLet v t) sc)->               = RBind n (RLet (syn v) (syn t)) (syn sc)->           syn (RInfix f l op x y)->               = RInfix f l op (syn x) (syn y)->           syn (RUserInfix file line b op l r)->               = RUserInfix file line b op (syn l) (syn r)->               -- = RUserInfix f l b op (syn x) (syn y)->           syn (RDo ds) = RDo $ map synd ds->           syn (RIdiom t) = RIdiom (syn t)->           syn (RPure t) = RPure (syn t)->           syn t = t-->           synd (DoBinding f l n x y) ->                = DoBinding f l n (syn x) (syn y)->           synd (DoLet f l n x y) ->                = DoLet f l n (syn x) (syn y)->           synd (DoExp f l x) ->                = DoExp f l (syn x)-->           doSyn o syns (RApp _ _ f a) args = doSyn o syns f (a:args)->           doSyn o syns v args ->                = case v of->                      RVar f l n _ -> ->                        case findSyn n syns of->                          Just (a, rhs) -> -- trace (show (n, rhs, a, args)) $ ->                              if (length a == length args)->                                 then syn $ replSyn f l rhs (zip a args)->                                 else o->                          Nothing -> o->                      _ -> o-->           doSynN f l n syns = case findSyn n syns of->                             Just ([], rhs) -> syn $ replSyn f l rhs []->                             _ -> RVar f l n Unknown-->           findSyn n synct =->               case ctxtLookup synct (thisNamespace using) n of->                 (Right (Syntax f as rhs)) -> Just (as, rhs)->                 (Left err) -> Nothing -- FIXME: need to report an error->                                       -- if it's ambiguous-->           -- findSyn n [] = Nothing->           -- findSyn n ((Syntax f as rhs):xs) | n == f = Just (as, rhs)->           --                                  | otherwise = findSyn n xs-->           replSyn f l t@(RVar _ _ n ty) as = case lookup n as of->                                                Just v -> v->                                                Nothing -> RVar f l n ty->           replSyn f l (RApp _ _ fn a) as ->                 = RApp f l (replSyn f l fn as) (replSyn f l a as)->           replSyn f l (RInfix _ _ op x y) as ->                 = RInfix f l op (replSyn f l x as) (replSyn f l y as)->           replSyn f l (RUserInfix _ _ b op x y) as ->                 = RUserInfix f l b op (replSyn f l x as) (replSyn f l y as)->           replSyn f l (RAppImp _ _ x fn a) as->                 = RAppImp f l x (replSyn f l fn as) (replSyn f l a as)->           replSyn f l (RBind n b t) as->                 = RBind n (replBind f l b as) ->                           (replSyn f l t (filter (\ (x,_) -> x /= n) as))->           replSyn _ _ x _ = x-->           replBind f l (Pi p os t) as = Pi p os (replSyn f l t as)->           replBind f l (Lam t) as = Lam (replSyn f l t as)->           replBind f l (RLet v t) as = RLet (replSyn f l v as) (replSyn f l t as)-->           fixes fix@(RUserInfix _ _ _ _ _ _) =->               case fixFix uo fix of->                 (RUserInfix file line _ op l r) ->->                    fixes (RApp file line ->                           (RApp file line ->                            (RVar file line (useropFn op) Free) l) r)->                 (RError f l x) -> RError f l x->           fixes (RApp file line f a) = RApp file line (fixes f) (fixes a)->           fixes (RAppImp file line n f a) ->                     = RAppImp file line n (fixes f) (fixes a)->           fixes (RBind n (Lam t) sc) = RBind n (Lam (fixes t)) (fixes sc)->           fixes (RBind n (Pi p opts t) sc)->                 = RBind n (Pi p opts (fixes t)) (fixes sc)->           fixes (RBind n (RLet v t) sc)->                 = RBind n (RLet (fixes v) (fixes t)) (fixes sc)->           fixes (RInfix file line op l r)->                 = RInfix file line op (fixes l) (fixes r)->           fixes (RIdiom t) = RIdiom (fixes t)->           fixes (RPure t) = RPure (fixes t)->           fixes (RDo d) = RDo (map fixesd d)->           fixes t = t-->           fixesd (DoBinding f l n x y) = DoBinding f l n (fixes x) (fixes y)->           fixesd (DoLet f l n x y) = DoLet f l n (fixes x) (fixes y)->           fixesd (DoExp f l x) = DoExp f l (fixes x)-->           shiftimpl x = let (imps, t) = simp [] x in->                         pibind Im (reverse imps) t->           simp imps (RBind n (Pi Im _ t) sc) ->                 = simp ((n,t):imps) sc->           simp imps (RBind n (Pi p o t) sc) ->                 = let (imps', sc') = simp imps sc in->                       (imps', RBind n (Pi p o t) sc')->           simp imps x = (imps, x)--> syntaxClause :: Ctxt IvorFun -> Implicit -> UserOps -> RawClause ->->                 RawClause-> syntaxClause ctxt imp uo (RawClause l r)->      = (RawClause (syntax ctxt imp uo l)->                   (syntax ctxt imp uo r))-> syntaxClause ctxt imp uo (RawWithClause lhs prf scr def)->      = (RawWithClause (syntax ctxt imp uo lhs) prf->                       (syntax ctxt imp uo scr)->                       (map (syntaxClause ctxt imp uo) def))--Add placeholders so that implicit arguments can be filled in. Also desugar user infix apps.-FIXME: I think this'll fail if names are shadowed.--> addPlaceholders :: Ctxt IvorFun -> Implicit -> UserOps -> RawTerm -> RawTerm-> addPlaceholders ctxt using uops@(UO uo _ _ syns) tm ->                     = ap [] (syntax ctxt using uops tm)->     -- Count the number of args we've made explicit in an application->     -- and don't add placeholders for them. Reset the counter if we get->     -- out of an application->     where ap ex v@(RVar f l n _)->            = case ctxtLookupName ctxt (thisNamespace using) n of->                   -- leave syntax definitions alone and expand later->                   Right (IvorFun _ _ _ _ (SynDef _ _ _) _ _ _, _)->                       -> RVar f l n Unknown->                   Right (ifn@(IvorFun _ (Just ty) imp _ _ _ _ _), fulln) -> ->                     let pargs = case lookup n pnames of->                                   Nothing -> []->                                   Just ids -> map (\i -> RVar f l i Bound) ids in->                     mkApp f l (RVar f l fulln (getNameType ifn))->                               ((mkImplicitArgs ->                                (map fst (fst (getBinders ty []))) imp ex) ++ pargs)->                   Left err@(Ambiguous _ ns) -> RError f l (show err) -- RVars f l ns->                   Left err@(WrongNamespace _ _) -> RError f l (show err)->                   Right (ifn, fulln) -> RVar f l fulln (getNameType ifn)->                   _ -> RVar f l n Unknown->           ap ex (RExpVar f l n)->               = case ctxtLookupName ctxt (thisNamespace using) n of->                   Right (ifn@(IvorFun _ (Just ty) imp _ _ _ _ _), fulln) -> RVar f l fulln (getNameType ifn)->                   Left err@(Ambiguous _ _) -> RError f l (show err)->                   Left err@(WrongNamespace _ _) -> RError f l (show err)->                   Right (ifn, fulln) -> RVar f l fulln (getNameType ifn)->                   _ -> RVar f l n Unknown->           ap ex (RAppImp file line n f a) = (ap ((toIvorName n,(ap [] a)):ex) f)->           ap ex app@(RApp file line f a) = ->                   RApp file line (ap ex f) (ap [] a)->           ap ex (RBind n (Pi p l ty) sc)->               = RBind n (Pi p l (ap [] ty)) (ap [] sc)->           ap ex (RBind n (Lam ty) sc)->               = RBind n (Lam (ap [] ty)) (ap [] sc)->           ap ex (RBind n (RLet val ty) sc)->               = RBind n (RLet (ap [] val) (ap [] ty)) (ap [] sc)->           ap ex (RInfix file line op l r) = RInfix file line op (ap [] l) (ap [] r)->           ap ex fix@(RUserInfix file line _ op l r)->               = -- case fixFix uo fix of->                 --  (RUserInfix file line _ op l r) ->->                 ap ex (RApp file line ->                              (RApp file line (RVar file line (useropFn op) Free) l) r)->                 --  (RError f l x) -> RError f l x->           ap ex (RDo ds) = RDo (map apdo ds)->           ap ex (RIdiom tm) = RIdiom (ap [] tm)->           ap ex (RPure tm) = RPure (ap [] tm)->           ap ex r = r-->           apdo (DoExp f l r) = DoExp f l (ap [] r)->           apdo (DoBinding file line x t r) = DoBinding file line x (ap [] t) (ap [] r)->           apdo (DoLet file line x t r) = DoLet file line x (ap [] t) (ap [] r)-->           pnames = paramNames using--Go through the arguments; if an implicit argument has the same name as one-in our list of explicit names to add, add it.--> mkImplicitArgs :: [Name] -> Int -> [(Name, RawTerm)] -> [RawTerm]-> mkImplicitArgs _ 0 _ = [] -- No more implicit-> mkImplicitArgs [] i ns = [] -- No more args-> mkImplicitArgs (n:ns) i imps->      = case lookup n imps of->          Nothing -> RPlaceholder:(mkImplicitArgs ns (i-1) imps)->          Just v -> v:(mkImplicitArgs ns (i-1) imps)--> getBinders (Forall n ty sc) acc = (getBinders sc ((n,ty):acc))-> getBinders (Annotation _ t) acc = getBinders t acc-> getBinders sc acc = (reverse acc, sc)---> undo :: UndoInfo -> [Do] -> State (Int, Int) RawTerm-> undo ui [] = fail "The last statement in a 'do' block must be an expression"-> undo ui [DoExp f l last] = return last-> undo ui@(UI bind bindimpl _ _ _ _ _ _) ((DoBinding file line v' ty exp):ds)->          = -- bind exp (\v' . [[ds]])->            do ds' <- undo ui ds->               let k = RBind v' (Lam ty) ds'->               return $ mkApp file line (RVar file line bind Unknown) ->                          ((take bindimpl (repeat RPlaceholder)) ++ [exp, k])-> undo ui ((DoLet file line v' ty exp):ds)->          = do ds' <- undo ui ds->               return $ RBind v' (RLet exp ty) ds'-> undo ui@(UI bind bindimpl _ _ _ _ _ _) ((DoExp file line exp):ds)->          = -- bind exp (\_ . [[ds]])->            do ds' <- undo ui ds->               (i, h) <- get->               put (i+1, h)->               let k = RBind (MN "x" i) (Lam RPlaceholder) ds'->               return $ mkApp file line (RVar file line bind Unknown) ->                          ((take bindimpl (repeat RPlaceholder)) ++ [exp, k])---- > unret :: UndoInfo -> RawTerm -> RawTerm--- > unret (UI _ _ ret retImpl _ _ _ _) (RApp f l (RVar _ _ (UN "return")) arg)--- >       = mkApp f l (RVar f l ret) ((take retImpl (repeat RPlaceholder)) ++ [arg])--- > unret ui (RApp f l x a) = RApp f l (unret ui x) (unret ui a)--- > unret ui (RAppImp f l n x a) = RAppImp f l n (unret ui x) (unret ui a)--- > unret ui (RInfix f l op x y) = RInfix f l op (unret ui x) (unret ui y)--- > unret ui (RBind n (Pi pl z tm) sc) = RBind n (Pi pl z (unret ui tm)) (unret ui sc)--- > unret ui (RBind n (Lam tm) sc) = RBind n (Lam (unret ui tm)) (unret ui sc)--- > unret ui (RBind n (RLet tm ty) sc) = RBind n (RLet (unret ui tm) (unret ui ty)) (unret ui sc)--- > unret ui (RUserInfix f l b n x y) = RUserInfix f l b n (unret ui x) (unret ui y)--- > unret ui (RIdiom tm) = RIdiom (unret ui tm)--- > unret ui (RPure tm) = RPure (unret ui tm)--- > unret ui x = x--TODO: Get names out of UndoInfo--> unidiom :: UndoInfo -> RawTerm -> RawTerm-> unidiom ui@(UI _ _ _ _ pure pureImpl _ _) (RApp file line f (RPure x)) ->         = mkApp file line (RVar file line pure Unknown)->                ((take pureImpl (repeat RPlaceholder)) ++ [mkApp file line f [x]])-> unidiom ui@(UI _ _ _ _ pure pureImpl _ _) (RApp file line f RPlaceholder) ->         = mkApp file line (RVar file line pure Unknown)->                ((take pureImpl (repeat RPlaceholder)) ++ [mkApp file line f [RPlaceholder]])-> unidiom ui@(UI _ _ _ _ _ _ ap apImpl) (RApp file line f x) ->              = mkApp file line (RVar file line ap Unknown)->                     ((take apImpl (repeat RPlaceholder)) ++->                     [unidiom ui f, x])-> unidiom ui@(UI _ _ _ _ pure pureImpl _ _) x ->              = let (file, line) = getFileLine x in->               mkApp file line (RVar file line pure Unknown)->                     ((take pureImpl (repeat RPlaceholder)) ++ [x])--> testCtxt = addEntry newCtxt [] (UN "Vect") undefined--> dump :: Ctxt IvorFun -> String-> dump ctxt = concat $ map dumpFn (ctxtAlist ctxt)->   where dumpFn (_,IvorFun n ty imp def _ _ _ _) =->             show n ++ " : " ++ show ty ++ "\n" ++->             "   " ++ show imp ++ " implicit\n" ++->             show def ++ "\n\n"--> mkRName n = UN (show n)--> getOp v allops ->     = let ops = mapMaybe (\x -> if opFn x == v ->                                 then Just x ->                                 else Nothing) allops->          in if null ops then Nothing->                         else Just (head ops)--Convert an ivor term back to a raw term, for pretty printing purposes.-Use the context to decide which arguments to make implicit--FIXME: If a name is bound locally, don't add implicit args.--> unIvor :: Ctxt IvorFun -> ViewTerm -> RawTerm-> unIvor ctxt tm = unI tm [] where--Built-in constants firsts-->     unI (Name _ v) []->         | v == name "Int" = RConst "[val]" 0 IntType->         | v == name "String" = RConst "[val]" 0 StringType->     unI (Name _ v) [x,y]->         | v == name "refl" = RApp "[val]" 0 RRefl y--Now built-in operators-->     unI (Name _ v) [_,_,x,y]->         | v == opFn JMEq = RInfix "[val]" 0 JMEq x y->     unI (Name _ v) [_,x,y]->         | v == opFn OpEq = RInfix "[val]" 0 OpEq x y->     unI (Name _ v) [x,y]->         | Just op <- getOp v allOps = RInfix "[val]" 0 op x y->     unI (Name _ v) args ->        = case ctxtLookup ctxt [] (mkRName v) of->            Right fdata -> mkImpApp "[val]" 0 (implicitArgs fdata) ->                                   (argNames (ivorFType fdata)) (RVar "[val]" 0 (mkRName v) Unknown) args->            _ -> unwind (RVar "[val]" 0 (mkRName v) Unknown) args->     unI (App f a) args = unI f ((unI a []):args)->     unI (Lambda v ty sc) args = unwind (RBind (mkRName v) (Lam (unI ty [])) (unI sc [])) args->     unI (Forall v ty sc) args = unwind (RBind (mkRName v) (Pi Ex [] (unI ty [])) (unI sc [])) args->     unI (Let v ty val sc) args = unwind (RBind (mkRName v) ->                                          (RLet (unI val []) (unI ty [])) ->                                          (unI sc [])) args->     unI Star [] = RConst "[val]" 0 TYPE->     unI LinStar [] = RConst "[val]" 0 LTYPE->     unI (Constant c) [] = let try f = fmap (RConst "[val]" 0 . f) $ cast c->                           in  fromJust $ msum [try Num, try Str, try Ch, try Fl]->     unI (Annotation _ x) args = unI x args->     unI (Metavar n) args = RMetavar (mkRName n)->     unI Placeholder args = RPlaceholder->     unI x args = error (show x)-->     unwind = mkImpApp "[val]" 0 0 []--> argNames :: Maybe ViewTerm -> [Id]-> argNames Nothing = []-> argNames (Just ty) = an ty where->     an (Forall n ty sc) = (mkRName n):(an sc)->     an (Annotation _ t) = an t->     an x = []--> mkImpApp :: String -> Int -> Int -> [Id] -> RawTerm -> [RawTerm] -> RawTerm-> mkImpApp file line i (n:ns) tm (a:as) ->      | i>0 = mkImpApp file line (i-1) ns (RAppImp file line n tm a) as->      | otherwise = mkImpApp file line 0 ns (RApp file line tm a) as-> mkImpApp file line _ _ tm (a:as) = mkImpApp file line 0 [] (RApp file line tm a) as-> mkImpApp _ _ _ _ tm _ = tm---Show a raw term; either show or hide implicit arguments according to-boolean flag (true for showing them)--> showImp :: Bool -> RawTerm -> String-> showImp imp tm = showP 10 tm where->     showP p (RVar _ _ (UN "__Unit") _) = "()"->     showP p (RVar _ _ (UN "__Empty") _) = "_|_"->     showP p (RVar _ _ i _) = case (getOpName i) of->                                (True, o) -> "(" ++ o ++ ")"->                                (False, o) -> o->     showP p RRefl = "refl"->     showP p (RApp _ _ f a) = bracket p 1 $ showP 1 f ++ " " ++ showP 0 a->     showP p (RAppImp _ _ n f a)->           | imp = bracket p 1 $ showP 1 f ++ " {"++show n ++ " = " ++ showP 0 a ++ "} "->           | otherwise = showP 1 f->     showP p (RBind n (Lam ty) sc)->           = bracket p 2 $ ->             "\\ " ++ show n ++ " : " ++ showP 10 ty ++ " => " ++ showP 10 sc->     showP p (RBind n (Pi im _ ty) sc)->           | internal n && not imp -- hack for spotting unused names quickly!->              = bracket p 2 $ showP 1 ty ++ " -> " ++ showP 10 sc->           | otherwise->              = bracket p 2 $->                ob im ++ show n ++ " : " ++ showP 10 ty ++ cb im ++ " -> " ++->                showP 10 sc->        where ob Im = "{"->              ob Ex = "("->              cb Im = "}"->              cb Ex = ")"->              internal (UN ('_':'_':_)) = True->              internal (MN _ _) = True->              internal _ = False->     showP p (RBind n (RLet val ty) sc)->           = bracket p 2 $->             "let " ++ show n ++ " : " ++ showP 10 ty ++ " = " ++ showP 10 val->                    ++ " in " ++ showP 10 sc->     showP p (RConst _ _ c) = show c->     showP p (RInfix _ _ op l r) = bracket p 5 $->                                   showP 4 l ++ show op ++ showP 4 r->     showP _ x = show x->     bracket outer inner str | inner>outer = "("++str++")"->                             | otherwise = str--> showVT :: Ctxt IvorFun -> ViewTerm -> String-> showVT ivs t = showImp False (unIvor ivs t)--If we haven't got a line number for an error message, pick where the definition-starts as a best guess.--> guessContext :: IvorFun -> TTError -> TTError-> guessContext _ e@(ErrContext _ _) = e-> guessContext ifn e = case (ivorFType ifn) of->                        Just (Annotation (FileLoc f l) _) ->->                            ErrContext (f ++ ":" ++ show l ++ ":") e->                        _ -> e -- ErrContext (show (ivorFType ifn)) e--> idrisError :: Ctxt IvorFun -> TTError -> String-> idrisError ivs (CantUnify x y) = "Can't unify " ++ (showVT ivs x) ++ " and " ++ ->                                                    (showVT ivs y)-> idrisError ivs (Message str) = str-> idrisError ivs (Unbound clause clty rhs rhsty names) ->                = "Unbound names in " ++ showVT ivs rhs ++ ->                  " : " ++ showVT ivs clty ++->                  "  " ++ show names-> idrisError ivs (NoSuchVar n) = "No such variable as " ++ show n-> idrisError ivs (CantInfer n tm) = "Can't infer value for " ++ show n ++ " in " ++ (showVT ivs tm)-> idrisError ivs (ErrContext s e) = s ++ idrisError ivs e-> idrisError ivs (AmbiguousName ns) = "Ambiguous name " ++ show ns-> idrisError ivs (NotConvertible x y) = "Not convertible: " ++ (showVT ivs x) ++ " and " ++ (showVT ivs y)---> getOpName (UN ('_':'_':'o':'p':'_':op)) = (True, showOp op) where->          showOp ('_':cs) = case span isDigit cs of->                               (op, rest) -> toEnum (read op) : showOp rest->          showOp _ = ""-> getOpName s = (False, show s)--Correct the precedences in a user defined infix operator term using Dijkstra's-Shunting Yard algorithm.--> fixFix :: Fixities -> RawTerm -> RawTerm-> fixFix ops top@(RUserInfix f l b op x y) ->            = let toks = tok top ->                  shunted = shunt ops [] toks in->                  rebuild [] shunted-> fixFix ops x = x--> data OpTok = Op String Int String->            | OTm RawTerm->            | OpenB->            | CloseB->   deriving Show--> tok (RUserInfix f l False op x y) ->         = tok x ++ ((Op f l op):tok y)-> tok (RUserInfix f l True op x y) ->         = OpenB:(tok x ++ (Op f l op):tok y) ++ [CloseB]-> tok x = [OTm x]--> shunt :: Fixities -> [OpTok] -> [OpTok] -> [OpTok]-> shunt ops stk (OTm x:toks) = OTm x:(shunt ops stk toks)-> shunt ops stk (op@(Op f l _):toks) ->           = let (stk', out) = prec [] stk op in->                 out ++ shunt ops stk' toks->    where prec out (op2@(Op f2 l2 o2):opstk) op1@(Op f1 l1 o1)->              = case (lookup o1 ops, lookup o2 ops) of->                   (Just (LeftAssoc, prec1), Just (assoc2, prec2))->                      -> if (prec1<=prec2) then ->                               prec (op2:out) opstk op1->                             else ->                               (op1:op2:opstk, reverse out)->                   (Just (RightAssoc, prec1), Just (assoc2, prec2))->                      -> if (prec1<prec2) then ->                               prec (op2:out) opstk op1->                             else ->                               (op1:op2:opstk, reverse out)->                   (Nothing, Nothing) -> (opstk, OTm (RError f1 l1 (":unknown operators " ++ show o1 ++ " and " ++ show o2)):out)->                   (Nothing, _) -> (opstk, OTm (RError f1 l1 (":unknown operator " ++ show o1)):out)->                   (_, Nothing) -> (opstk, OTm (RError f2 l2 (":unknown operator " ++ show o2)):out)->          prec out opstk op1 = (op1:opstk, reverse out)--> shunt ops stk (OpenB:toks) = shunt ops (OpenB:stk) toks-> shunt ops stk (CloseB:toks) = let (stk',out) = popToLeft [] stk in->                                   out ++ shunt ops stk' toks->    where popToLeft out (OpenB:stk) = (stk, reverse out)->          popToLeft out (x:stk) = popToLeft (x:out) stk->          popToLeft out [] = error "Can't happen, no left paren"-> shunt ops (x:stk) [] = x:(shunt ops stk [])-> shunt ops [] [] = []--> rebuild :: [RawTerm] -> [OpTok] -> RawTerm-> rebuild stk (OTm x:xs) = rebuild (x:stk) xs-> rebuild (x:y:stk) (Op f l op:xs) ->       = rebuild ((RUserInfix f l True op y x):stk) xs-> rebuild (x:[]) [] = x-> rebuild stk xs = error $ "Can't happen: rebuild " ++ show (stk, xs)--Old version:---Only need to worry if the left term is not bracketed. Otherwise leave it alone.-Also need to sort out inner ops first.-- fixFix ops top@(RUserInfix f l b op x y)-     = let fixed = fixFix' ops top in -- (RUserInfix f l b op x y)-           if (fixed==top) then fixed else fixFix ops fixed- fixFix ops x = x------> fixFix' ops top@(RUserInfix file line _ opr ->                 (RUserInfix _ _ False opl a b) c) = ->     case (lookup opl ops, lookup opr ops) of->       (Just (assocl, precl), Just (assocr, precr)) ->->         doFix assocl precl assocr precr a opl b opr c->       (Nothing, Nothing) -> RError file line $ ":unknown operators " ++ show opl ++ " and " ++ show opr->       (Nothing, _) -> RError file line (":unknown operator " ++ show opl)->       (_, Nothing) -> RError file line (":unknown operator " ++ show opr)->  where->    doFix al pl ar pr a opl b opr c ->          | pr > pl = mkOp False opl (fixFix' ops a) (fixFix' ops (mkOp False opr b c))->          | pr < pl = mkOp False opr (fixFix' ops (mkOp False opl a b)) (fixFix' ops c)--In the following cases, change the top level operator, put explicit brackets in, then-rewrite the whole thing again. Termination guaranteed since the size of the expression-we check (i.e. the non-bracketed part) is smaller.-->          | pr == pl && al == LeftAssoc && ar == LeftAssoc->                    = fixFix ops $ mkOp False opr (mkOp True opl a b) c->          | pr == pl && al == RightAssoc && ar == RightAssoc->                    = fixFix ops $ mkOp False opl a (mkOp True opr b c)->          | otherwise = RError file line $ ":ambiguous operators, please add brackets"-->    mkOp t op l r = RUserInfix file line t op l r---Everything else, we ony work at the top level.--> fixFix' _ x = x--> (!!!) xs (x, msg) = if x >= length xs then error msg else xs!!x
− Idris/Compiler.lhs
@@ -1,396 +0,0 @@-> module Idris.Compiler(comp, addTransforms) where--> import Idris.AbsSyntax-> import Idris.PMComp-> import Idris.LambdaLift-> import Idris.ConTrans-> import Idris.SCTrans-> import Idris.Lib-> import Ivor.TT hiding (transform, SimpleCase(..), CaseAlt(..))--> import System-> import System.IO-> import System.Environment-> import System.Directory-> import Monad-> import Debug.Trace--Get every definition from the context. Convert them all to simple case-trees. Ignore constructors, types, etc. Simple definitions are, of course, -already simple case trees.--> addTransforms :: IdrisState -> Context -> IdrisState-> addTransforms ist ctxt ->      = let raw = idris_context ist->            erasure = not $ NoErasure `elem` (idris_options ist) ->            ctrans = makeConTransforms raw ctxt->            atrans = makeArgTransforms raw ctxt ctrans->            trans = if erasure then makeIDTransforms raw ctxt atrans->                       else [] in->              ist { idris_transforms = trans }--> comp :: IdrisState -> Context -> Id -> FilePath -> IO Bool-> comp ist ctxt nm ofile ->          = do let raw = idris_context ist->               let decls = idris_decls ist->               let erasure = not $ NoErasure `elem` (idris_options ist)->               let pdefs = getCompileDefs raw ctxt->               let trans = idris_transforms ist->               let vtrans = transforms (idris_fixities ist)->               let pcomp = map (pmCompDef raw ctxt erasure trans vtrans) pdefs->               let declouts = filter (/="") (map epicDecl decls)->               let clink = filter (/="") (map epicLink decls)->               -- dumpNames pcomp->               let scs = map (\ (n, inl, sc) -> (n, inl, transformSC erasure sc)) ->                           $ allSCs pcomp->               catch (do compileAll raw ctxt ofile erasure clink declouts scs->                         return True)->                     (\e -> do putStrLn "Compilation error"->                               print e->                               return False)->    where allSCs [] = []->          allSCs ((x,gen,(args,def)):xs) ->                       = -- trace (show (x,args)) $->                         let lifted = lambdaLift ctxt ist x args def->                             scfuns = map (\ (n,args,sc) -> ->                                          (n, scFun ctxt ist (fromIvorName ist n) args sc)) lifted->                             xs' = allSCs xs in->                             mkGen gen scfuns ++ xs'->          mkGen gen ((n, d):ds) = (n,gen,d):(mkGen True ds)->          mkGen gen [] = []--Convert top level declarations to epic output.-This is just for the directives to link in C headers, .o file, etc.--> epicDecl :: Decl -> String-> epicDecl (CInclude i) = "%include " ++ show i-> epicDecl _ = ""--> epicLink :: Decl -> String-> epicLink (CLib l) = l-> epicLink _ = ""--Get all the definitions we want to compile (i.e., skipping NoCG ones)--Get the user specified pattern definition, if it exists, not the Ivor-expanded one (i.e. with the placeholders as the user specified) so-that we avoid pattern matching where the programmer didn't ask us to.--> getCompileDefs :: Ctxt IvorFun -> Context -> [(Name, (ViewTerm, Patterns))]-> getCompileDefs raw ctxt = defs' [] (ctxtAlist raw) ->    where alldefs = map getOrig (getAllPatternDefs ctxt)->          defs' acc [] = dropAll acc alldefs->          defs' acc ((n,ifun):ds) ->              = let flags = funFlags ifun ->                    inm = toIvorName n in->                case (NoCG `elem` flags) of->                     True -> {- trace ("Not compiling " ++ show n) -}->                                defs' (inm:acc) ds->                     _ -> defs' acc ds->          dropAll drops [] = []->          dropAll drops ((n,def):ds) | n `elem` drops = dropAll drops ds->                                     | otherwise = (n,def):(dropAll drops ds)->          getOrig (n, (ty, ps)) = (n, (ty, ps))--                  = case ctxtLookup raw (mkRName n) of-                      (Just ifun) ->-                          case (ivorDef ifun) of-                            PattDef ps' -> (n, (ty, (mergePats ps ps')))-                            _ -> (n, (ty, ps))-                      _ -> (n, (ty, ps))--> mergePats :: Patterns -> Patterns -> Patterns-> mergePats (Patterns ps) (Patterns ps') = Patterns (mp ps ps')->   where->     mp [] [] = []->     mp ((PClause a _ r):ps) ((PClause a' _ r'):ps') =->             (PClause a' [] r):(mp ps ps')--> pmCompDef :: Ctxt IvorFun -> Context -> ->              Bool -> -- erasure on->              [Transform] -> -- optimisations->              [(ViewTerm, ViewTerm)] -> -- user level transforms->              (Name, (ViewTerm, Patterns)) -> ->              (Name, Bool, ([Name], SimpleCase))-> pmCompDef raw ctxt erase ctrans vtrans (n, (ty,ps)) -> --    = let flags = getFlags n raw in-> --          case ((NoCG `elem` flags), (CGEval `elem` flags)) of -> --             (True, _) -> trace ("Not compiling " ++ show n) (n, [])-> --             (False, False)e -> ->       =  let transpm = transform ctxt ctrans vtrans n ps ->              gen = isAuxPattern ctxt n->              compiledp = pmcomp raw ctxt erase n ty transpm in->              -- trace (if n == name "copyRecInt" then show n ++ "\n" ++ show compiledp else "")->              (n, gen, compiledp)--     where getFlags n raw = case ctxtLookup raw n of-                              Just i -> funFlags i-                              Nothing -> []---> compileAll :: Ctxt IvorFun -> Context -> FilePath -> Bool ->->               [String] -> -- options to pass to epic->               [String] -> -- raw epic output->               [(Name, Bool, SCFun)] -> IO ()-> compileAll raw ctxt ofile erasure clink outputs scs = do->      (efile, eH) <- tempfile->      prel <- readLibFile defaultLibPath "Prelude.e"->      hPutStrLn eH prel->      mapM_ (hPutStrLn eH) outputs->      -- dumpNames scs->      mapM_ (writeDef eH erasure) scs->      hClose eH->      let cmd = "epic " ++ efile ++ " -o " ++ ofile ++->                " -checking 0 " ++ ->                concat (map (' ':) clink) ->      -- putStrLn cmd->      exit <- system cmd->      -- removeFile efile->      if (exit /= ExitSuccess) ->         then fail "EPIC FAIL"->         else return ()--> quotename [] = ""-> quotename ('[':cs) = "_OB_"++quotename cs-> quotename (']':cs) = "_CB_"++quotename cs-> quotename ('.':cs) = "_NS_"++quotename cs-> quotename (c:cs) = c:(quotename cs)--> dumpNames [] = return ()-> dumpNames (x:xs) = do putStr "Name: "->                       putStrLn ((\ (a, b, c) -> show a) x)->                       dumpNames xs--> writeDef :: Handle -> Bool -> (Name, Bool, SCFun) -> IO ()-> writeDef h erasure (n,gen,(SCFun scopts args def)) = do->   -- putStrLn $ "Writing " ++ show n->   when (gen || elem SCInline scopts) $ hPutStr h "%inline "->   when (elem SCStrict scopts) $ hPutStr h "%strict "->   maybe (return ()) (\ c -> hPutStrLn h ("export " ++ show c ++ " ")) (getEName scopts)->   hPutStrLn h (quotename (show n) ++ " (" ++ list args ++ ") -> Any = \n" ++->                writeSC n erasure def)->   -- putStrLn $ "Written " ++ show n->    where list [] = ""->          list [a] = quotename (show a) ++ " : Any"->          list (x:xs) = quotename (show x) ++ " : Any, " ++ list xs--Write out a constructor name, turning constructors of IO commands into-the relevant IO operation--> writeSC :: Name -> Bool -> SCBody -> String-> writeSC fname erasure b = writeSC' b where-->   list [] = ""->   list [a] = writeSC' a->   list (x:xs) = writeSC' x ++ ", " ++ list xs-->   writeSC' (SVar n) = quotename (show n)->   writeSC' (SCon n i) = writeCon n i ++ "()"->   writeSC' (SApp (SCon n i) (fn:args:[]))->     | n == ionamei "Foreign" = writeFCall fn erasure args fname->   writeSC' (SApp (SCon n i) (_:args))->     | n == ionamei "WhileAcc" = writeCon n i ++ "(" ++ list args ++ ")"->   writeSC' (SApp (SCon n i) args) = writeCon n i ++ "(" ++ list args ++ ")"--Fork is a special case, because its argument needs to be evaluated lazily-or it'll be evaluated by the time we run the thread!-->   writeSC' (SApp (SVar n) [arg])->     | n == name "fork" =->         "fork(lazy("++writeSC' arg++"))"--TMP HACK until we do coercions on primitives properly-->     | n == name "__toInt" =->         "__epic_toInt(" ++ writeSC' arg ++ ")"->     | n == name "__toString" =->         "__epic_toString(" ++ writeSC' arg ++ ")"->     | n == name "__floatToString" =->         "__epic_floatToString(" ++ writeSC' arg ++ ")"->     | n == name "__stringToFloat" =->         "__epic_stringToFloat(" ++ writeSC' arg ++ ")"->     | n == name "__charToInt" =->         writeSC' arg->     | n == name "__intToChar" =->         writeSC' arg->     | n == name "__strlen" =->         "__epic_strlen(" ++ writeSC' arg ++ ")"->     | n == name "unsafeNative" =->         "__epic_native(" ++ writeSC' arg ++ ")"--HACK for explicit laziness, and marking effectfullness-->   writeSC' (SApp (SVar lazy) [_,v])->     | lazy == name "__lazy" =->         "lazy(" ++ writeSC' v ++ ")"->   writeSC' (SApp (SVar effect) [_,v])->     | effect == name "__effect" =->         "%effect(" ++ writeSC' v ++ ")"--Manual allocation-->   writeSC' (SApp (SVar malloc) [_,b,v])->     | malloc == name "malloc" =->         "%memory(%fixed," ++ writeSC' b ++ "," ++ writeSC' v ++ ")"--Epic has if/then/else, so just use that-->   writeSC' (SApp (SVar ite) [_,v,SLazy t,SLazy e])->     | ite == name "if_then_else" =->         writeSC' (SIf v t e)->   writeSC' (SApp (SVar ite) [_,v,t,e])->     | ite == name "if_then_else" =->         writeSC' (SIf v t e)-->   writeSC' (SApp (SVar n) [arg1, arg2, arg3])->     | n == name "__substr" =->         "__epic_substr("++writeSC' arg1++", " ++ writeSC' arg2 ++ ", " ++->                           writeSC' arg3 ++ ")"--HACK for string equality-->   writeSC' (SApp (SVar n) [arg1, arg2])->     | n == name "__strEq" =->         "__epic_streq("++writeSC' arg1++", " ++ writeSC' arg2 ++ ")"->     | n == name "__charEq" =->         "__epic_chareq("++writeSC' arg1++", " ++ writeSC' arg2 ++ ")"->     | n == name "__strLT" =->         "__epic_strlt("++writeSC' arg1++", " ++ writeSC' arg2 ++ ")"-->     | n == name "__strCons" =->         "__epic_strcons("++writeSC' arg1++", " ++ writeSC' arg2 ++ ")"->     | n == name "__strFind" =->         "__epic_strFind("++writeSC' arg1++", " ++ writeSC' arg2 ++ ")"-->   writeSC' (SApp (SVar n) [arg1])->     | n == name "__strHead" =->         "__epic_strhead("++writeSC' arg1++ ")"->     | n == name "__strTail" =->         "__epic_strtail("++writeSC' arg1++ ")"->     | n == name "__strRev" =->         "__epic_strrev("++writeSC' arg1++ ")"-->   writeSC' (SApp b args) = "(" ++ writeSC' b ++")(" ++ list args ++ ")"->       where list [] = ""->             list [a] = writeSC' a->             list (x:xs) = writeSC' x ++ ", " ++ list xs->   writeSC' (SLet n val b) = "let " ++ quotename (show n) ++ " : Any = " ++ writeSC' val->                          ++ " in ("  ++ writeSC' b ++ ")"->   writeSC' (SCCase b alts@((SConstAlt _ _):_))->                    = writeConstAlts fname erasure (writeSC' b) alts->   writeSC' (SCCase b alts) = "case " ++ writeSC' b ++ " of { " ++ ->                              writeAlts fname erasure alts->                             ++ "}"->   writeSC' (SIf x t e) = "(if (" ++ writeSC' x ++ ") then (" ++->                          writeSC' t ++ ") else (" ++ writeSC' e ++ "))"->   writeSC' (SIfZero x t e) = "(if (" ++ writeSC' x ++ "==0) then (" ++->                          writeSC' t ++ ") else (" ++ writeSC' e ++ "))"->   writeSC' (SInfix op l r) = boolOp erasure op (writeOp op (writeSC' l) (writeSC' r))->   writeSC' (SConst c) = writeConst c->   writeSC' (SLazy b) = "lazy(" ++ writeSC' b ++ ")"->   writeSC' SUnit = "%unused"->   writeSC' SError = "error \"error\""--> writeCon :: Name -> Int -> String-> writeCon n i->   | n == ionamei "PutStr" = "__epic_putStr"->   | n == ionamei "GetStr" = "__epic_readStr"->   | n == ionamei "NewRef" = "__epic_newRef"->   | n == ionamei "ReadRef" = "__epic_readRef"->   | n == ionamei "WriteRef" = "__epic_writeRef"->   | n == ionamei "NewLock" = "__epic_newLock"->   | n == ionamei "DoLock" = "__epic_doLock"->   | n == ionamei "DoUnlock" = "__epic_doUnlock"->   | n == ionamei "Fork" = "__epic_fork"->   | n == ionamei "Within" = "__epic_within"->   | n == ionamei "While" = "%while"->   | n == ionamei "WhileAcc" = "%while"->   | otherwise = "Con " ++ show i--> writeOp Concat l r = "__epic_append(" ++ l ++", " ++ r ++")"-> writeOp op l r = "(" ++ l ++ ") " ++ show op ++ " (" ++ r ++ ")"--> boolOp erasure op c = if (not erasure) && (retBool op) then->                   "__epic_bool(" ++ c ++ ")" else c->    where retBool OpLT = True->          retBool OpEq = True->          retBool OpLEq = True->          retBool OpGT = True->          retBool OpGEq = True->          retBool _ = False--> writeAlts n e [] = ""-> writeAlts n e [a] = writeAlt n e a-> writeAlts n e (x:xs) = writeAlt n e x ++ " | " ++ writeAlts n e xs--> writeAlt n e (SAlt _ t args b) = "Con " ++ show t ++ " (" ++ list args ++ ") -> "->                                ++ writeSC n e b->    where list [] = ""->          list [a] = quotename (show a) ++ ":Any"->          list (x:xs) = quotename (show x) ++ ":Any, " ++ list xs-> writeAlt n e (SDefault b) = "Default -> " ++ writeSC n e b-> writeAlt n e _ = "Default -> error \"unhandled case in " ++ show n ++ "\""--> writeConstAlts n e b [] = "error \" unhandled case in " ++ show n ++ "\""-> writeConstAlts n e b [a] = writeConstAlt n e b a-> writeConstAlts n e b (x:xs) = writeConstAlt n e b x ++->                             " else (" ++ writeConstAlts n e b xs ++ ")"--> writeConstAlt n e b (SConstAlt (Num x) ret) ->                   = " if (" ++ b ++ " == " ++ show x ++") then ("->                        ++ writeSC n e ret ++ ") "-> writeConstAlt n e b (SConstAlt (Str x) ret) ->                   = " if (__epic_streq(" ++ b ++ ", " ++ show x ++")) then ("->                        ++ writeSC n e ret ++ ") "-> writeConstAlt n e b (SDefault ret) = writeSC n e ret--Chars are just treated as Ints by the compiler, so convert here.--> writeConst (Ch c) = show $ fromEnum c-> writeConst c = show c--> writeFCall :: SCBody -> Bool -> SCBody -> Name -> String-> writeFCall (SApp (SCon ffun _) [SConst (Str fname),argtys,retty]) e arglist topname = ->     "foreign " ++ fToEpic retty ++ " " ++ show fname ++ ->               " (" ++ build (zip (extract arglist) (extract argtys)) ++ ")"->     where build [] = ""->           build [(x,ty)] = writeSC topname e x ++ ":" ++ (fToEpic ty)->           build ((x,ty):xs) = writeSC topname e x ++ ":" ++ (fToEpic ty) ++ ->                               ", " ++ build xs--This'll work for FArgList and List, because the penultimate is always the -element and last is always the tail. Should therefore also work before and-after forcing optimisation...-->           extract (SCon _ 0) = []->           extract (SApp (SCon _ 0) _) = []->           extract (SApp (SCon _ 1) args) = (last (init args)):->                                               (extract (last args))->           extract x = error (show x)->           exTy arg = fToEpic arg--> writeFCall _ _ _ _ = error "Ill-formed foreign function call"---Convert a constructor application of type 'FType' to an epic type. Just do-this on tag, we know the type. Check 'FType' in io.idr.--> fToEpic :: SCBody -> String-> fToEpic (SCon _ 0) = "Unit"-> fToEpic (SCon _ 1) = "Int"-> fToEpic (SCon _ 2) = "String"-> fToEpic (SCon _ 3) = "Ptr"-> fToEpic (SCon _ 4) = "Float"-> fToEpic _ = "Any" -- idris data type--> tempfile :: IO (FilePath, Handle)-> tempfile = do env <- environment "TMPDIR"->               let dir = case env of->                               Nothing -> "/tmp"->                               (Just d) -> d->               openTempFile dir "idris"--> environment :: String -> IO (Maybe String)-> environment x = catch (do e <- getEnv x->                           return (Just e))->                       (\_ -> return Nothing)
− Idris/ConTrans.lhs
@@ -1,540 +0,0 @@-> {-# OPTIONS_GHC -fglasgow-exts #-}--Apply Forcing/Detagging/Collapsing optimisations from Edwin Brady's thesis.--> module Idris.ConTrans(makeConTransforms, makeArgTransforms, makeIDTransforms,->                       applyTransforms, transform, rebuildTrans) where--> import Idris.AbsSyntax-> import Ivor.TT hiding (transform)-> import qualified Ivor.ViewTerm(transform)--> import Maybe-> import List--> import Debug.Trace--Algorithm is approximately:--1. Make sure all constructors are fully applied. This means all transformations-will be uniform whether on LHS or RHS of pattern defs.-Also it means that any constructors which aren't fully applied on the LHS-of a pattern turn into '_' patterns. This is fine...-2. Generate transformation rules as ViewTerm transformations by applying-forcing, detagging and collapsing to every data structure.-3. Apply rules on LHS and RHS of all definitions.--Do all this before any pattern match compilation or lambda lifting.--To do this uniformly, turn a pattern def into an application of the lhs, -then turn it back into a pclause--Also apply user level transforms (vts) at this stage.--Throughout, we don't care about the bound arguments in a PClause any more,-so just ignore them.--> transform :: Context -> [Transform] -> [(ViewTerm, ViewTerm)] -> ->              Name -> Patterns -> Patterns-> transform ctxt ts vts n (Patterns ps) = Patterns $ (map doTrans ps)->    where doTrans (PClause args _ ret) ->              = let lhs = apply (Name Unknown n) args->                    lhs' = applyTransforms ctxt (filter lhsSafe ts) lhs->                    ret' = applyTransforms ctxt ts (allTrans vts ret)->                    args' = getFnArgs lhs' in->                    PClause args' [] ret'->          doTrans (PWithClause prf args scr (Patterns pats))->              = let pats' = Patterns $ (map doTrans pats)->                    lhs = apply (Name Unknown n) args->                    lhs' = applyTransforms ctxt ts lhs->                    scr' = applyTransforms ctxt ts scr->                    args' = getFnArgs lhs' in->                    PWithClause prf args' scr' pats'--HACK: better to have a flag when building the transform. FIXME!-->          lhsSafe (Trans nm _ _) = not (isSuffixOf "_ID" nm)--> allTrans ts tm = foldl (\tm (l,r) -> Ivor.ViewTerm.transform l r tm) tm (ts++ts)--Look at all the definitions in the context, and make the relevant constructor-transformations for forcing, detagging and collapsing.--HACK: We do three passes, to pick up collapsible things from the last pass to -help. This still won't get everything right.-If Ivor returned things in the order they were defined this wouldn't-be necessary - better fix Ivor.--> makeConTransforms :: Ctxt IvorFun -> Context -> [Transform]-> makeConTransforms raw ctxt ->    = let pass1 = mkT' (getAllInductives ctxt) [] []->          pass2 = mkT' (getAllInductives ctxt) [] pass1 in->          mkT' (getAllInductives ctxt) [] pass2->   where mkT' [] acc p1 = acc->         mkT' (x:xs) acc p1 = mkT' xs ((makeTransform ctxt x (p1++acc))++acc) p1--Apply the constructor transforms before making the function transforms-so that we don't needlessly keep arguments dropped by forcing.--> makeArgTransforms :: Ctxt IvorFun -> Context -> [Transform] -> [Transform]-> makeArgTransforms raw ctxt ctrans ->    = let pass1 = mkP' (getRawPatternDefs raw ctxt) ctrans []->          pass2 = mkP' (getRawPatternDefs raw ctxt) ctrans pass1 in->          mkP' (getRawPatternDefs raw ctxt) ctrans pass2->   where mkP' [] acc p1 = acc->         mkP' (x:xs) acc p1 ->              = mkP' xs ((makePTransform raw ctxt (ctrans++p1++acc) x)++acc) p1--Look for functions which have become identity functions as a result of previous-transforms--> makeIDTransforms :: Ctxt IvorFun -> Context -> [Transform] -> [Transform]-> makeIDTransforms raw ctxt trans->    = mkP' (getRawPatternDefs raw ctxt) trans->   where mkP' [] acc = acc->         mkP' (x:xs) acc ->              = mkP' xs ((makeIDTransform raw ctxt (trans++acc) x)++acc)--Make all the transformations for a type--Step 1. Forcing-   On each constructor, find namess that appear constructor -   guarded in that constructor's return type. Any argument with these-   names is forceable.-   If the type of the argument is collapsible, it's also forceable.--   If there's only one constructor left, of the form C x, transform it to just x.-   (Relies on totality)--Step 2: Detagging-   Check if there is an argument position in the return type which has a-   different constructor at the head on each constructor. If so,-   remove the tags on all constructor.-Step 3: Collapsing-   If the only remaining arguments in all constructors are recursive (i.e.-   return the type we're working with) or themselves collapsible, -   translate all to Unit.-   If this doesn't apply, undo step 2.--Using the transforms so far (in acc) - we can also eliminate arguments-which are themselves collapsible.--> makeTransform :: Context -> (Name, Inductive) -> [Transform] -> [Transform]-> makeTransform ctxt (n, ity) acc->    = let cons = constructors ity->          detagin = (map (getFnArgs.getReturnType) (map snd cons))->          forceable = nub (map (\ (x,y) -> (x, force ctxt y acc, Ivor.TT.getArgTypes y)) cons)->          detaggable = pdisjoint ctxt detagin->          recursive = nub (map (\ (x,y) -> (x, recArgs n y acc, Ivor.TT.getArgTypes y)) cons)->          collapsible = (detaggable && all droppedAll (combine forceable recursive)) || (n == name "Proof")->          nattable = isNat forceable recursive->               in->          -- trace (show n ++ " " ++ show (nattable) ++ " " ++ show (forceable, recursive)) $ -- FORCING \n\t" ++ show forceable) ->            if collapsible then->                map (collapseTrans n) cons->                else mapMaybe (forceTrans nattable (length cons)) forceable--Combine assumes constructors are in each list in the same order. Since they-were built the same way, this is okay. Just combines the forceable and-recursive arguments, so we can see if this gets all of them-->   where combine [] [] = []->         combine ((con, d, all):cs) ((con',d',all'):cs')->             | con == con' = (con, nub (d++d'), all):(combine cs cs')->         droppedAll (con, d, args) = length d == length args--Horrible hack, sorry. It's an easy way to tell if a constructor is -from a collapsible type...--> isCollapsible x t = (show x++"_COLLAPSE") `elem` (transNames t)-> transNames = map tname->    where tname (Trans n _ _) = n--> isNat :: [(Name, [Name], [(Name, ViewTerm)])] ->->          [(Name, [Name], [(Name, ViewTerm)])] ->->           Maybe (Name, Name)-> isNat force recs = nt' force recs [] where->     nt' [] [] acc = nattable' (sortBy cmprec acc)->     nt' ((f, fargs, targs):fs) ((r, rargs, _):rs) acc->     -- we know f = r, from how they were built->          = nt' fs rs ((f, length targs, length fargs, length rargs):acc)->     cmprec (_,_,_,x) (_,_,_,y) = compare x y--Ordered by number of recursive arguments-If there's two constructors, one with 0 recursive arguments and all others -force, one with 1 recursive argument and all others force, it can be -transformed to Nat.--> nattable' :: [(Name, Int, Int, Int)] -> Maybe (Name, Name)-> nattable' [(z, ztot, zforce, 0), (s, stot, sforce, 1)]->       | (ztot==zforce) && (stot-1 == sforce) ->            = Just (z, s)-> nattable' _ = Nothing--> collapseTrans :: Name -> (Name, ViewTerm) -> Transform-> collapseTrans n (c, ty) = Trans ((show n)++"_COLLAPSE")->                            (Just (mkCollapseTrans n c ty (length (Ivor.TT.getArgTypes ty))))->                            (Just (Collapse n c ty (length (Ivor.TT.getArgTypes ty))))--> mkCollapseTrans n c ty num = mkCollapse num->    where mkCollapse num tm->             | Name nty con <- getApp tm->                 = let args = getFnArgs tm in->                       if con == c && length args == num then->                          Placeholder -- lose the lot->                          else tm->          mkCollapse _ tm = tm--> forceTrans :: Maybe (Name, Name) -> Int ->->               (Name, [Name], [(Name, ViewTerm)]) -> Maybe Transform-> forceTrans Nothing _ (x, [], _) = Nothing-> forceTrans nat ncons (n, forced, tys)->      = Just (Trans ((show n)++"_FORCE") (Just (mkForceTrans nat ncons n forced tys (length tys))) (Just (Force nat ncons n forced tys (length tys))))--If a term is n applied to (length tys) arguments, change it to-n applied to arguments minus the ones in forceable positions--> mkForceTrans nat ncons n forced tys num = mkForce num->    where mkForce num tm->             | Name nty con <- getApp tm->                 = let fn = getApp tm->                       args = getFnArgs tm ->                       nargs = zip (map fst tys) args in->                   if con == n && length args == num then->                       let app = forceapply ncons (Name nty (newname nat con)) ->                                       (map snd (filter notForced nargs)) in->                           -- trace (show (app, con, nargs)) ->                           app->                       else tm->          mkForce _ tm = tm->          forceapply 1 _ [x] = x->          forceapply _ n args = apply n args->          notForced (f, tm) = not (f `elem` forced)->          newname Nothing n = n--If the type has the shape of a Nat, transform the constructors.-->          newname (Just (z, s)) n | n == z = name "O"->                                  | n == s = name "S"--Given a constructor type, return all the names bound in it which-need not be stored (i.e. need not be bound)--> force :: Context -> ViewTerm -> [Transform] -> [Name]-> force ctxt tm acc = let rt = getReturnType tm->                         atypes = Ivor.TT.getArgTypes tm->                         rtargs = getFnArgs rt in->                         nub $ concat (map conGuarded rtargs) ++ ->                            (map fst (filter collapse atypes))->     where isVar n | elem n boundnames = True->                   | otherwise =->                       case nameType ctxt n of->                         Right _ -> False->                         _ -> True->           boundnames = map fst (Ivor.TT.getArgTypes tm)->           conGuarded t = cg [] t->           cg acc (Name Bound x) | isVar x = x:acc -- variable name->           cg acc (Name Free x) | isVar x = x:acc -- variable name->           cg acc (Name DataCon _) = acc->           cg acc (Name t x) = []->           cg acc (App f a) = cg (acc++(cg [] a)) f->           cg acc _ = []->           collapse (n, ty)->                | Name _ apn <- getApp ty->                     = isCollapsible apn acc->           collapse _ = False--Given a constructor type, return all the names bound in it which-are to recursive arguments of the datatype.-(TODO: Higher order recursive arguments too.)--> recArgs :: Name -> ViewTerm -> [Transform] -> [Name]-> recArgs tyname tm trans = map fst (filter isRec (Ivor.TT.getArgTypes tm))->     where isRec (n, ty)->                 | Name _ apn <- getApp ty->                    = apn == tyname || isCollapsible apn trans->           isRec _ = False---Return whether constructor types are pairwise disjoint in their indices---- takes a list of indices for each constructor--> pdisjoint :: Context -> [[ViewTerm]] -> Bool-> pdisjoint c [] = True-> pdisjoint c [x] = True-> pdisjoint c (x:xs) = pdisjoint c xs && (pdisjointWith x xs)->   where pdisjointWith x [] = True->         pdisjointWith x (y:ys) = disjoint (zip x y) && pdisjointWith x ys--Is there an argument position with a different constructor at the head?-->         disjoint xs = or (map disjointCon xs)->         disjointCon (x, y)->              | Name _ xn <- getApp x->              , Name _ yn <- getApp y->                 = case (nameType c xn, nameType c yn) of->                     (Right DataCon, Right DataCon) -> ->                         if (xn /= yn) then True->                            else disjoint (zip (getFnArgs x) (getFnArgs y)) ->                     _ -> False->         disjointCon _ = False--If an argument position is a placeholder in all clauses in the idris-definition, and the corresponding argument position in the Ivor definition-is either a pattern or unused (modulo recursion), do this to it:--[[x]] => x -[[complex term]] => _--> getPlaceholders :: Context -> Name -> Patterns -> Patterns -> [Int]-> getPlaceholders ctxt n (Patterns ps) (Patterns ivps) ->        = getPlPos (noDiscriminate [0..(args ps)-1] ps) ps ivps->    where->      getPlPos acc [] [] = acc->      getPlPos acc ((PClause args _ r):ps) ((PClause args' _ r'):ps')->            = getPlPos (filter (plArg args args' r') acc) ps ps'->      getPlPos acc ((PWithClause _ args _ _):ps) ((PClause args' _ r'):ps')->            = getPlPos (filter (plArg args args' r') acc) ps ps'->      getPlPos acc (_:ps) (_:ps')->            = getPlPos acc ps ps'->      getPlPos acc p p' = error $ "getPlPos : " ++ show (n,acc,p,p')-->      plArg args args' r' x ->            = x<length args && args!!x == Placeholder && recGuard x n r' (namesIn (args'!!!(x,"args' fail")))->      args ((PClause args _ r):_) = length args->      args ((PWithClause _ args _ (Patterns rest)):_) = length args->      args [] = 0--Remove argument positions from the list where those arguments are needed-to discriminate. i.e., make sure the patterns are still pairwise disjoint -after removing them.-->      noDiscriminate :: [Int] -> [PClause] -> [Int]->      noDiscriminate phs ps = indiscriminate phs (map pargs ps)->          where pargs (PClause args _ _) = args->                pargs (PWithClause _ args _ _) = args--Drop argument x, from all patterns, see if they are still pairwise disjoint.-If so, x can remain a placeholder position.-->      indiscriminate (x:xs) pats ->         = let pats' = map (blot x) pats->               ok = pdisjoint ctxt pats' in->              if ok then x:(indiscriminate xs pats') -- remove->                    else indiscriminate xs pats -- don't remove->      indiscriminate [] _ = []-->      blot i xs = take (i-1) xs ++ Placeholder:(drop (i+1) xs)-->      recGuard :: Int -> Name -> ViewTerm -> [Name] -> Bool--z must be used only as part of the ith argument to a call to fn. Anywhere-else, it can't be dropped.-->      recGuard i fn ret zs = and (map (recGuard' i fn ret) zs)->      recGuard' i fn ret z ->          | Left _ <- nameType ctxt z->        = let res = rgOK ret in->           -- trace ("GUARD " ++ show (i,fn,z,ret,res)) ->            res                    ->        where rgOK ap@(App f a) = nthOK (getApp ap) (getFnArgs ap)->              rgOK (Name _ x) = x /= z->              rgOK (Lambda _ _ sc) = rgOK sc->              rgOK (Let _ _ val sc) = rgOK val && rgOK sc->              rgOK _ = True-->              nthOK (Name _ x) args->                    | x == fn = and (map nOK (zip [0..] args))->              nthOK f args = rgOK f && (and (map rgOK args))->              nOK (argno, arg) | argno == i = True->              nOK (_,arg) = rgOK arg->      recGuard' i fn ret z = True---          trace ("GUARD OK " ++ show (i,fn,tm,ret)) True--True -- Complex term, just drop it.--> makePTransform :: Ctxt IvorFun -> Context -> [Transform] ->->                   (Name, (ViewTerm, Patterns)) -> [Transform]-> makePTransform raw ctxt ctrans (n, (ty, patsin)) ->   = let pats = transform ctxt ctrans [] n patsin in->       case getPatternDef ctxt n of->        Right (_, idpatsin) ->->            let idpats = transform ctxt ctrans [] n idpatsin->                numargs = args pats->                placeholders = getPlaceholders ctxt n pats idpats in ->             -- trace (show (placeholders, n)) $->                if (null placeholders) ->                 then []->                 else [Trans (show n ++ "_dropargs") ->                             (Just (mkDropTrans n ty placeholders numargs))->                             (Just (Drop n ty placeholders numargs))]->        _ -> []->    where->      args (Patterns ((PClause args _ r):_)) = length args->      args _ = 0--> mkDropTrans n ty pls num = doDrop pls num where->      doDrop pls num tm->         | Name nty fname <- getApp tm->             = let fn = getApp tm->                   args = getFnArgs tm in->               if fname == n && length args == num then->                   apply (Name nty fname) ->                         (map (simplArg pls) (zip [0..] args))->                   else tm->      doDrop _ _ tm = tm->      -- simplArg pls (a, n@(Name _ _)) = n->      simplArg pls (a, t) | a `elem` pls = Placeholder->                          | otherwise = t--Look for arguments which are invariant across all patterns and calls. -If there's only one left, in position i, replace recursive calls with the -argument in position i. If the LHS and RHS of all patterns is the same in -the result, it's an identity function, so replace it with (id x) where x is-the argument in position i.--> makeIDTransform :: Ctxt IvorFun -> Context -> [Transform] ->->                    (Name, (ViewTerm, Patterns)) -> [Transform]-> makeIDTransform raw ctxt ctrans (n, (ty, patsin@(Patterns (_:_))))->   = let Patterns pats = transform ctxt ctrans [] n patsin ->         argpos = zip [0..] (arguments (pats!!!(0,"pats fail")))->         keepArgs = [0..length argpos-1] \\ (invariants argpos (map arguments pats))->         trans = Trans (show n ++ "_ID") ->                       (Just (mkIDTrans n keepArgs (length argpos)))->                       Nothing->         stripInvs = map (stripInv trans) pats in->          -- trace (show (n,stripInvs)) $->          if (all (idClause keepArgs) stripInvs) ->             then [trans] else []-->    where invariants :: [(Int, ViewTerm)] -> [[ViewTerm]] -> [Int]->          invariants invs [] = map fst invs->          invariants invs (x:xs) = invariants (checkInv invs (zip [0..] x)) xs-->          checkInv [] args = args->          checkInv ((p,a):invs) args ->              = checkInv invs (filter (isNotInv p a) args)--If the argument in the given position is not invariant, drop it. Otherwise-keep it, for now. (We're either looking at a different position, or it-is indeed invariant)-->          isNotInv p a (x,a') | p==x && a/=a' = False->                              | otherwise = True-->          stripInv t (PClause args _ ret) = PClause args [] (doTrans t ret)->          stripInv t w = w->          idClause [k] t@(PClause args _ ret) | k<length args = args!!!(k,"idClause fail") == ret->          idClause _ _ = False--> makeIDTransform raw ctxt ctrans _ = []--> mkIDTrans n [keep] arity tm->         | Name nty fname <- getApp tm->             = let fn = getApp tm->                   args = getFnArgs tm in->               if fname == n && length args == arity && keep<length args then->                   args!!!(keep, "mkIDfail")->                   else tm--> mkIDTrans _ _ _ tm = tm--Dangerous: doesn't take account of argument lengths. Top level function-is transformed anyway.-- mkIDTrans n [keep] arity tm@(Name nty fname)-     = if fname == n then App (Name nty (name "id")) Placeholder else tm---Apply all transforms in order to a term, eta expanding constructors first.--> applyTransforms :: Context -> [Transform] -> ViewTerm -> ViewTerm-> applyTransforms ctxt ts term ->     = foldl (flip doTrans) (etaExpand ctxt term) ts--> doTrans :: Transform -> ViewTerm -> ViewTerm-> doTrans (Trans nm (Just trans) _) tm = tr tm where->     tr tm = {- if (nm=="Next_FORCE") then (trace (show tm) (tr' tm)) else -}->             tr' tm->     tr' (App f a) = trans (App (tr f) (tr a))->     tr' (Lambda v ty sc) = trans (Lambda v (tr ty) (tr sc))->     tr' (Forall v ty sc) = trans (Forall v (tr ty) (tr sc))->     tr' (Let v ty val sc) = trans (Let v (tr ty) (tr val) (tr sc))->     tr' (Annotation a t) = Annotation a (tr t)->     tr' t = trans t--> etaExpand :: Context -> ViewTerm -> ViewTerm-> etaExpand ctxt tm = ec tm->   where->     ec ap@(App f a) ->         | Right (ar, con, args) <- needsExp (App f a)->              = etaExp ar con args->     ec ap@(App _ _) = let f = getApp ap->                           args = getFnArgs ap in->                           apply f (map ec args)->     ec (Lambda n ty sc) = Lambda n (ec ty) (ec sc)--That's all the terms we care about.-->     ec x = x-->     needsExp ap = needsExp' ap []->     needsExp' (App f a) as = needsExp' f ((ec a):as)->     needsExp' nm@(Name _ n) as ->         = do ar <- getConstructorArity ctxt n->              if (ar == length as) then ttfail "FAIL"->                  else Right (ar, nm, as)->     needsExp' _ _ = ttfail "FAIL"--We don't care about the type on the lambda here, We'll never look at it-even when compiling, it's just for the sake of having constructors fully-applied.-->     etaExp ar con args ->         = -- trace ("ETA " ++ show (ar,con,args)) $ ->             let newargs = map (\n -> (toIvorName (MN "exp" n)))->                            [1..(ar-(length args))] in->               addLam newargs (apply con (args++(map (Name Unknown) newargs)))->     addLam [] t = t->     addLam (n:ns) t = Lambda n Star (addLam ns t)---Get the type of the constructor, look for constructor guarded arguments-in the return type, strip them.--If, in addition, there is an index with disjoint constructors *and* all -remaining arguments are recursive, transform all constructors to Unit.-- mkConTrans :: Ctxt IvorFun -> Context -> Name -> Name -> [Transform]- mkConTrans raw ctxt ty = -     let Just cons = getConstructors ctxt ty--Given a constructor name, return the names and types of the arguments-which are not removed--> getRemaining :: Context -> Name -> [(Name, ViewTerm)]-> getRemaining = undefined--Given a constructor name, the names of arguments it has, and the names-of arguments to keep, make a transformation rule.--> mkTrans :: Name -> [Name] -> [Name] -> Transform-> mkTrans con args keep = Trans (show con ++ "_force") (Just trans) undefined->    where trans tm = let (f,fargs) = (getApp tm, getFnArgs tm) in->                        (tCon f fargs tm)->          tCon fc@(Name _ fcon) fargs tm->            | con == fcon = if (length args == length fargs)->                              then apply fc (dropArgs fargs args keep)->                              else tm->          tCon _ _ t = t->          dropArgs (f:fs) (a:as) keep->                   | a `elem` keep = f:(dropArgs fs as keep)->                   | otherwise = dropArgs fs as keep->          dropArgs _ _ keep = []->          --> rebuildTrans :: TransData -> ViewTerm -> ViewTerm-> rebuildTrans (Force a b c d e f) = mkForceTrans a b c d e f-> rebuildTrans (Collapse a b c d) = mkCollapseTrans a b c d-> rebuildTrans (Drop a b c d) = mkDropTrans a b c d
− Idris/Context.lhs
@@ -1,242 +0,0 @@-> module Idris.Context(Ctxt, Id(..), addEntry, ctxtLookup, ctxtLookupName,->                      ctxtAlist, newCtxt, appCtxt, alistCtxt, mkName,->                      Err(..)) where--> import Data.List-> import qualified Data.Map as Map-> import Control.Monad.Error--> import Data.Binary-> import Data.Typeable-> import Control.Monad--> import Char--> import Debug.Trace--> data Id = UN String | MN String Int | NS [Id] Id -- NS is decorated name->    deriving (Eq, Ord)--> instance Show Id where->     show (UN s) = s->     show (MN s i) = "__" ++ s ++ "_" ++ show i->     show (NS ns n) = showSep ns ++ show n->       where showSep ns = concat (map ((++".").show) ns)--> instance Binary Id where->     put (UN x) = do put (0 :: Word8)->                     put x->     put (MN x i) = do put (1 :: Word8)->                       put x; put i->     put (NS n i) = do put (2 :: Word8)->                       put n; put i-->     get = do tag <- getWord8->              case tag of->                0 -> liftM UN get->                1 -> liftM2 MN get get->                2 -> liftM2 NS get get--> type Dict k v = Map.Map k v--Lifted this lot out since I had to change for backwards compatibility. --> dictInsert :: Ord k => k -> v -> Dict k v -> Dict k v-> dictInsert = Map.insert-> dictElems = Map.elems-> dictAlist = Map.assocs-> dictEmpty = Map.empty--> dictLookup :: Ord k => k -> Dict k v -> Maybe v-> dictLookup = Map.lookup--Contexts containing names and type information A context is just a map-from a to b, but we'll keep it abstract in case we need or want-something better later--Contexts are divided into namespaces. Entries are added either to a defined namespace, or-the global namespace. Lookup will look for names in the current namespace then the global-namespace, and report an error on ambiguous names.--FIXME: Needs to be a map from names to all possibilities, which are then disambiguated.-- type Ctxt a = Dict [Id] [(Id, a)]--We keep a context as an alist *and* a Dict. This is because we want to retain-ordering, have multiple entries, append *and* have fast lookup. Rather than-have a cleverer data structure, this is an easy way.--> data Ctxt a = Ctxt {->                 alist :: [(Id, a)], -- for retaining ordering->                 cdict :: Dict Id [(Id, a)] ->               }--> instance Binary a => Binary (Ctxt a) where->     put (Ctxt a b) = do put a; put b->     get = liftM2 Ctxt get get--> data Err = NoName Id->          | Ambiguous Id [Id]->          | WrongNamespace Id [Id]->          | OtherErr String--> instance Show Err where->     show (NoName n) = "No such name " ++ show n->     show (Ambiguous n xs) = "Ambiguous name " ++ show n ++ " " ++ show xs ->     show (WrongNamespace n ns) = show n ++ " not defined in namespace " ++ show (NS ns (UN ""))--> instance Error Err where->     noMsg = OtherErr "Unknown error"->     strMsg s = OtherErr s--All operations are passed a [Id], which is the namespace we are currently in.-[] is the outermost namespace. --> mkName :: [Id] -> Id -> Id-> mkName [] name = name-> mkName ns name@(NS ns' x) = name-> mkName ns x = NS ns x--> lastName :: Id -> Id-> lastName (NS ns i) = lastName i-> lastName x = x--> globalNS :: Id -> Bool-> globalNS (NS [] _) = True-> globalNS (NS _ _) = False-> globalNS _ = True--> currentNS :: [Id] -> Id -> Bool-> currentNS ns (NS ns' _) = ns == ns'-> currentNS _ _ = True -- used as a global name, okay if not ambiguous--> getNS :: Id -> [Id]-> getNS (NS n _) = n-> getNS x = [x]--> addToD :: Dict Id [(Id,a)] -> Id -> a -> Dict Id [(Id, a)]-> addToD d n v = case dictLookup (lastName n) d of->                  Nothing -> dictInsert (lastName n) [(n,v)] d->                  Just nvs -> case lookup n nvs of->                     Nothing -> dictInsert (lastName n) ((n,v):nvs) d->                     Just _ -> dictInsert (lastName n) ((n,v):(dropN n nvs)) d->   where dropN n [] = []->         dropN n ((n',v):xs) | n == n' = xs->                             | otherwise = (n',v):(dropN n xs)--If the root of the given name n appears multiple times in the dictionary,-then only return a value if it's an exact match, otherwise issue an -ambiguous name error--> lookupD :: Dict Id [(Id,a)] -> [Id] -> Id -> Either Err (a, Id) -> lookupD d ns n = case dictLookup (lastName n) d of->                 Nothing -> Left (NoName n)->                 Just [] -> Left (NoName n)->                 Just [(n',v)] -> if (n==n' || currentNS ns n) then Right (v, n')->                                    else Left (WrongNamespace (lastName n)->                                                              (getNS n))->                 Just xs -> case lookup n xs of->                              Just v -> Right (v, n)->                              Nothing -> Left (Ambiguous n (map fst xs))--> addEntry :: Ctxt a -> [Id] -> Id -> a -> Ctxt a-> addEntry (Ctxt ca cd) ns name val ->    = let name' = mkName ns name in->          Ctxt ((name', val):ca) (addToD cd name' val)--> ctxtLookupName :: (Show a) => Ctxt a -> [Id] -> Id -> Either Err (a, Id)-> ctxtLookupName (Ctxt _ d) ns n = lookupD d ns (mkName ns n)--> ctxtLookup :: (Show a) => Ctxt a -> [Id] -> Id -> Either Err a-> ctxtLookup ctxt namespace k = case ctxtLookupName ctxt namespace k of->                                 Right (x, k) -> Right x->                                 Left err -> Left err--> ctxtAlist :: Ctxt a -> [(Id,a)]-> ctxtAlist (Ctxt ca _) = reverse ca--> alistCtxt :: [(Id, a)] -> Ctxt a-> alistCtxt a = Ctxt a (mkD dictEmpty a) where->     mkD acc [] = acc->     mkD acc ((n,v):ns) = mkD (addToD acc n v) ns--> newCtxt = Ctxt [] dictEmpty--> appCtxt :: Ctxt a -> Ctxt a -> Ctxt a-> appCtxt (Ctxt l _)  (Ctxt r _) = alistCtxt (l++r)---> {--> addEntry :: Ctxt a -> [Id] -> Id -> a -> Ctxt a-> addEntry ctxt using k v = let vs = cnames using ctxt in->                               dictInsert using ((k,v):vs) ctxt--If name is fully qualified, just look in the right namespace.-Otherwise, first look in current namespace, then in global namespace.--> ctxtLookupName :: (Show a) => Ctxt a -> [Id] -> Id -> Either Err (a, Id)-> ctxtLookupName ctxt [] k->         = case lookup k (cnames [] ctxt) of->                    Just v -> Right (v, k)->                    _ -> Left "No such var"--> cnames ns ctxt = case dictLookup ns ctxt of->                      Just vs -> vs->                      _ -> []--> ctxtLookup :: (Show a) => Ctxt a -> [Id] -> Id -> Either Err a-> ctxtLookup ctxt namespace k = case ctxtLookupName ctxt namespace k of->                                 Right (x, k) -> Right x->                                 Left err -> Left err--> ctxtAlist :: Ctxt a -> [(Id,a)]-> ctxtAlist cs = reverse $ concat (Map.elems cs)--> alistCtxt :: [(Id, a)] -> Ctxt a-> alistCtxt [] = newCtxt-> alistCtxt ((x,y):xs) = addEntry (alistCtxt xs) [] x y--> newCtxt = dictEmpty--> appCtxt :: Ctxt a -> Ctxt a -> Ctxt a-> appCtxt xs ys = app' (nub (Map.keys xs)++(Map.keys ys))->   where app' [] = dictEmpty->         app' (n:ns) = let bothnames = (cnames n xs ++ cnames n ys) in->                           dictInsert n bothnames (app' ns)-> -}--We need to keep insertion order, because when we add to ivor, we'd better insert them in-dependency order.--This doesn't quite work. We need a multimap or some other trickery, because things may be -declared, used, then defined with the same name, and that name has to map each time.--> {---> type Ctxt a = Dict Id [(a, Int)]--> type Err = String--> addEntry :: Ctxt a -> Maybe Id -> Id -> a -> Ctxt a-> addEntry ctxt using k v = dictInsert k (v, Map.size ctxt) ctxt--> ctxtLookupName :: (Show a) => Ctxt a -> Maybe Id -> Id -> Either Err (a, Id)-> ctxtLookupName ctxt namespace k = case dictLookup k ctxt of->                                 Just (x, _) -> Right (x, k)->                                 Nothing -> Left "No such var"--> ctxtLookup :: (Show a) => Ctxt a -> Maybe Id -> Id -> Either Err a-> ctxtLookup ctxt namespace k = case ctxtLookupName ctxt namespace k of->                                 Right (x, k) -> Right x->                                 Left err -> Left err--> ctxtAlist :: Ctxt a -> [(Id,a)]-> ctxtAlist xs = map (\ (x, (d, o)) -> (x, d)) $ sortBy dep (dictAlist xs)->     where dep (n, (def, o)) (n', (def', o')) = compare o o'--> newCtxt = dictEmpty--> appCtxt :: Ctxt a -> Ctxt a -> Ctxt a-> appCtxt xs ys = Map.union xs ys--> -}
− Idris/Fontlock.lhs
@@ -1,280 +0,0 @@-> module Idris.Fontlock(htmlise,latexise) where--> import Data.Char-> import List--> import Idris.AbsSyntax-> import Idris.Lexer-> import Idris.Context--> data Markup = DC | TC | FN | CM | VV | KW | ST | CH | LCM->             | BRK | SEC | SUBSEC ->             | TITLE | AUTHOR | HTML | LATEX | None->   deriving Show--> hclass DC = "datacon"-> hclass TC = "typecon"-> hclass FN = "function"-> hclass CM = "comment"-> hclass VV = "variable"-> hclass KW = "keyword"-> hclass ST = "string"-> hclass CH = "string"-> hclass _ = ""--> mkMarkups :: Ctxt IvorFun -> [(String, Markup)]-> mkMarkups ctxt = map mkMarkup (map (\ (x,y) -> (x, rawDecl y)) (ctxtAlist ctxt))--> mkMarkup :: (Id, Decl) -> (String, Markup)-> mkMarkup (NS _ i, f) = mkMarkup (i, f)-> mkMarkup (n, Fun _ _) = (show n, FN)-> mkMarkup (n, Fwd _ _ _) = (show n, FN)-> mkMarkup (n, TermDef _ _ _) = (show n, FN)-> mkMarkup (n, Prf _ _) = (show n, FN)-> mkMarkup (n, DataDecl _) = (show n, TC)-> mkMarkup (n, Constructor) = (show n, DC)-> mkMarkup (n, _) = (show n, VV)--> getMarkup :: String -> [(String, Markup)] -> Markup-> getMarkup x ms = case lookup x ms of->                    Just m -> m->                    Nothing -> VV--> markupText :: [(String, Markup)] -> String -> [(Markup, String)]-> markupText ms ('-':'-':' ':'I':'G':'N':'O':'R':'E':xs) = endIgnore ms xs-> markupText ms ('-':'-':'\n':xs) = (BRK, ""):markupText ms xs-> markupText ms ('-':'-':' ':'S':'e':'c':'t':'i':'o':'n':':':' ':xs) ->                = markupSECtoNewline SEC "" ms xs-> markupText ms ('-':'-':' ':'T':'i':'t':'l':'e':':':' ':xs) ->                = markupSECtoNewline TITLE "" ms xs-> markupText ms ('-':'-':' ':'L':'a':'T':'e':'X':':':' ':xs) ->                = markupSECtoNewline LATEX "" ms xs-> markupText ms ('-':'-':' ':'H':'T':'M':'L':':':' ':xs) ->                = markupSECtoNewline HTML "" ms xs-> markupText ms ('-':'-':' ':'A':'u':'t':'h':'o':'r':':':' ':xs) ->                = markupSECtoNewline AUTHOR "" ms xs-> markupText ms ('-':'-':' ':'S':'u':'b':'s':'e':'c':'t':'i':'o':'n':':':' ':xs) ->                = markupSECtoNewline SUBSEC "" ms xs-> markupText ms ('-':'-':xs) = markupCMtoNewline "" ms xs-> markupText ms ('{':'-':'>':xs) = markupText ms xs-> markupText ms ('>':'-':'}':xs) = markupText ms xs-> markupText ms ('{':'-':'-':xs) = markupLCM "" ms xs-> markupText ms ('{':'-':xs) = markupCM "" ms xs-> markupText ms ('\'':c:'\'':xs) = (CH, ['\'',c,'\'']):markupText ms xs-> markupText ms ('"':xs) = markupString ms xs-> markupText ms ('%':xs) = markupSpecial ms xs-> markupText ms ('\t':xs) = (None, "        "):markupText ms xs-> markupText ms (c:cs)->       | isAlpha c || c=='_' = markupVar ms (c:cs)-> markupText ms (c:cs) = (None, [c]):markupText ms cs--> markupText ms [] = []--> keywords = ["proof","data","using","idiom","params","namespace","module",->             "import","export","inline","where","partial","syntax","lazy",->             "infix","infixl","infixr","do","refl","if","then","else","let",->             "in","return","include","exists", "with"]-> types = ["String","Int","Char","Float","Ptr","Lock","Handle","Set"]--> markupSpecial ms cs = case span isAllowed cs of->      (var,rest) -> (None, '%':var):(markupText ms rest)--> markupVar ms cs = case span isAllowed cs of->      (var,rest) -> if (var `elem` keywords) ->                       then (KW, var):(markupText ms rest)->                       else if (var `elem` types) ->                         then (TC, var):(markupText ms rest)->                         else (getMarkup var ms, var):(markupText ms rest)--> markupCMtoNewline acc ms ('\n':xs) = (CM, "--"++reverse acc):->                                        markupText ms ('\n':xs)-> markupCMtoNewline acc ms (x:xs) = markupCMtoNewline (x:acc) ms xs-> markupCMtoNewline acc ms [] = (CM, "--"++reverse acc):[]--> markupSECtoNewline sec acc ms ('\n':xs) = (sec, reverse acc):->                                        markupText ms ('\n':xs)-> markupSECtoNewline sec acc ms (x:xs) = markupSECtoNewline sec (x:acc) ms xs-> markupSECtoNewline sec acc ms [] = (sec, reverse acc):[]--> markupCM acc ms ('-':'}':xs) = (CM, "{-"++reverse acc++"-}"):markupText ms xs-> markupCM acc ms (x:xs) = markupCM (x:acc) ms xs-> markupCM acc ms [] = (CM, "{-"++reverse acc):[]--> markupLCM acc ms ('-':'-':'}':xs) = (LCM, reverse acc):markupText ms xs-> markupLCM acc ms (x:xs) = markupLCM (x:acc) ms xs-> markupLCM acc ms [] = (LCM, reverse acc):[]--> endIgnore ms ('-':'-':' ':'S':'T':'A':'R':'T':'\n':xs) = markupText ms xs-> endIgnore ms (x:xs) = endIgnore ms xs-> endIgnore ms [] = []--> markupString ms xs = case getstr xs of->                        Just (str, rest, nls) -> (ST, show str):markupText ms rest--> htmlise :: Ctxt IvorFun -> FilePath -> FilePath -> Maybe FilePath -> IO ()-> htmlise ctxt fp outf style ->                      = do txt <- readFile fp->                           let ms = mkMarkups ctxt->                           let mtxt = markupText ms txt->                           writeFile outf (renderHTML fp style mtxt)--> latexise :: Ctxt IvorFun -> FilePath -> FilePath -> IO ()-> latexise ctxt fp outf = do txt <- readFile fp->                            let ms = mkMarkups ctxt->                            let mtxt = markupText ms txt->                            writeFile outf (renderLatex mtxt)--> skipnl :: [(Markup, String)] -> [(Markup, String)]-> skipnl ((None, "\n"):xs) = skipnl xs-> skipnl xs = xs--> skipIfBrk :: [(Markup, String)] -> [(Markup, String)]-> skipIfBrk xs = si xs xs->    where si orig next@((BRK, _):xs) = next->          si orig next@((TITLE, _):xs) = next->          si orig next@((HTML, _):xs) = next->          si orig next@((LATEX, _):xs) = next->          si orig next@((AUTHOR, _):xs) = next->          si orig next@((SEC, _):xs) = next->          si orig next@((SUBSEC, _):xs) = next->          si orig next@((LCM, _):xs) = next->          si orig ((None, "\n"):xs) = si orig xs->          si orig _ = orig--> renderHTML :: String -> Maybe String -> [(Markup, String)] -> String-> renderHTML title style ms = htmlHeader title style ++ ->                       "<code>\n" ++ html (skipIfBrk ms) ++ "\n</code>\n\n</body></html>"->   where ->     html [] = ""->     html ((None, "\n"):xs) = tHtml "\n" ++ html (skipIfBrk xs)->     html ((None, t):xs) = tHtml t ++ html xs->     html ((TITLE, t):xs) ->        = "</code>\n\n<h2>" ++ t ++ "</h2>\n\n<code>" ++ html (skipnl xs)->     html ((HTML, t):xs) ->        = "</code>\n\n<p>" ++ t ++ "</p>\n\n<code>" ++ html (skipnl xs)->     html ((LATEX, t):xs) ->        = html (skipnl xs)->     html ((AUTHOR, t):xs) ->        = "</code>\n\n<h4>" ++ t ++ "</h4>\n\n<code>" ++ ->          "</code>" ++ sechead xs ++ "\n\n<code>" ++ html (skipnl xs)->     html ((SEC, t):xs) ->        = "</code><a name=\"" ++ secname t ++ "\">\n\n<h3>" ++ t ++ "</h3>\n\n<code>" ++ html (skipnl xs)->     html ((SUBSEC, t):xs) ->        = "</code>\n\n<h4>" ++ t ++ "</h4>\n\n<code>" ++ html (skipnl xs)->     html ((BRK, t):xs) = tHtml t ++ html xs->     html ((LCM, t):xs) = "</code>\n\n<p class=\"explanation\">" ++ tpara 0 t ++ "</p>\n\n<code>" ++ html (skipnl xs)->     html ((m, t):xs) = "<span class=\"" ++ hclass m ++ "\">" ++ tHtml t ++ ->                        "</span>" ++ html xs->     tHtml = concat.(map th) -->     th ' ' = "&nbsp;"->     th '\n' = "</code><br>\n<code>"->     th x = [x]-->     tpara l [] = ""->     tpara l ('"':xs) = case getstr xs of->                        Just (str,rest,_) -> "<code>" ++ tpara l str ++ "</code>" ++->                                             tpara l rest->                        _ -> error xs->     tpara l ('U':'R':'L':'[':xs) =->         case span (/=']') xs of->           (url, ']':rest) -> "<a href=\"" ++ url ++ "\">" ++ url ++ "</a>"->                          ++ tpara l rest->     tpara l ('\\':'/':xs) = '/':tpara l xs ->     tpara l ('\\':'\\':xs) = '\\':tpara l xs ->     tpara l ('\\':'"':xs) = '"':tpara l xs ->     tpara l ('\\':'*':xs) = '*':tpara l xs ->     tpara l ('/':xs) =->         case span (/='/') xs of->           (txt, '/':rest) -> "<em>" ++ txt ++ "</em>" ++ tpara l rest->     tpara l ('*':xs) = case span (=='*') xs of->                          (_,rest) -> "<li>" ++ tpara l rest->     tpara l ('\n':'\n':'*':xs) = "<ul>\n" ++ tpara (l+1) ('*':xs)->     tpara l ('\n':'\n':xs) = "\n</p>\n<p>\n" ++ tpara l xs->     tpara l ('\n':'-':xs) = if (l>0) then "</ul>" ++ tpara (l-1) xs ->                                       else "</p><p>" ++ tpara l xs->     tpara l ('<':xs) = "&lt;"++ tpara l xs->     tpara l (x:xs) = x:(tpara l xs)--> htmlHeader title style->                = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\">" ++->                  "<html><head><title>" ++ title ++ "</title>\n" ++->                  defaultStyle style ++ "</head><body>"--> secname t = take 10 (filter isAlpha t)--> getsecs [] = []-> getsecs ((SEC,t):xs) = ("<a href=\"#" ++ (secname t) ++"\">"++ t ++ "</a>"):(getsecs xs)-> getsecs (_:xs) = getsecs xs--> sechead ms = let ss = getsecs ms in->              if null ss then "" ->                         else concat (intersperse " | " (getsecs ms)) ++ "<br>"--> defaultStyle Nothing ->                  = "<style type=\"text/css\">\n" ++->                    "." ++ hclass DC ++ " {\n  color:red; font-family: Courier;\n}\n" ++ ->                    "." ++ hclass TC ++ " {\n  color:blue; font-family: Courier;\n}\n" ++ ->                    "." ++ hclass FN ++ " {\n  color:green; font-family: Courier;\n}\n" ++ ->                    "." ++ hclass VV ++ " {\n  color:purple; font-family: Courier;\n}\n" ++ ->                    "." ++ hclass CM ++ " {\n  color:darkred; font-family: Courier;\n}\n" ++ ->                    "." ++ hclass ST ++ " {\n  color:gray; font-family: Courier;\n}\n" ++ ->                    "." ++ hclass KW ++ " {\n  color:black;\n  font-family: Courier; font-weight:bold;\n}\n" ++ ->                    "p.explanation {\n  color:black;\n}\n" ++->                    "BODY, SPAN {\n  font-family: Tahoma;\n" ++->                    "  color:  #000020;\n  background: #f0f0f0;\n}\n" ++->                    "</style>"-> defaultStyle (Just s) = "<link rel=\"stylesheet\" type=\"text/css\" href=\"" ++ s ++ "\">"--> renderLatex :: [(Markup, String)] -> String-> renderLatex ms = latexHeader ++ latex 0 (skipIfBrk ms) ++ "\n\n\\end{document}"->   where ->     latex i [] = usev i->     latex i ((None, "\n"):xs) = "\n" ++ latex i (skipIfBrk xs)->     latex i ((None, t):xs) = t ++ latex i xs->     latex i ((BRK, t):xs) = usev i ++ startv (i+1) ++ latex (i+1) xs->     latex i ((TITLE, t):xs) = "\\title{" ++ t ++ "}\n" ++ latex i (skipnl xs)->     latex i ((HTML, t):xs) = latex i (skipnl xs)->     latex i ((AUTHOR, t):xs) = "\\author{" ++ t ++ "}\n\\maketitle\n\n" ++ startv i ++ latex i (skipnl xs)->     latex i ((SEC, t):xs) = usev i ++ "\\section{" ++ t ++ "}\n\n" ++ startv (i+1) ++ latex (i+1) (skipnl xs)->     latex i ((SUBSEC, t):xs) = usev i ++ "\\subsection{" ++ t ++ "}\n\n" ++ startv (i+1) ++ latex (i+1) (skipnl xs)->     latex i ((LCM, t):xs) = usev i ++ tpara 0 t ++ "\n\n" ++ startv (i+1) ++ latex (i+1) (skipnl xs)->     latex i ((LATEX, t):xs) = usev i ++ tpara 0 t ++ "\n\n" ++ startv (i+1) ++ latex (i+1) (skipnl xs)->     latex i ((m, t):xs) = "^" ++ show m ++ "@" ++ t ++ "!"->                               ++ latex i xs-->     tpara l [] = ""->     tpara l ('"':xs) = case getstr xs of->                        Just (str,rest,_) -> "\\texttt{" ++ tpara l str ++ "}" ++->                                             tpara l rest->     tpara l ('U':'R':'L':'[':xs) =->         case span (/=']') xs of->           (url, ']':rest) -> "\\url{" ++ url ++ "}" ++ tpara l rest->     tpara l ('/':'/':xs) = '/':tpara l xs->     tpara l ('/':xs) =->         case span (/='/') xs of->           (txt, '/':rest) -> "\\emph{" ++ txt ++ "}" ++ tpara l rest->           (txt, rest) -> "\\emph{" ++ txt ++ "}" ++ tpara l rest->     tpara l ('~':xs) = "\\~{ }" ++ tpara l xs->     tpara l ('#':xs) = "\\#" ++ tpara l xs->     tpara l ('\n':'\n':'*':xs) = "\n\\begin{itemize}\n" ++ tpara (l+1) ('*':xs)->     tpara l ('\n':'-':xs) = if (l>0) then "\\end{itemize}" ++ tpara (l-1) xs ->                                       else "\n\n" ++ tpara l xs->     tpara l ('*':xs) = case span (=='*') xs of->                          (_,rest) -> "\\item " ++ tpara l rest->     tpara l (x:xs) = x:(tpara l xs)-->     usev i = "\n\\end{SaveVerbatim}\n\\BUseVerbatim{vbtm" ++ show i ++ "}\n\n"->     startv i = "\\begin{SaveVerbatim}[commandchars=^@!]{vbtm" ++ show i ++ "}\n\n"---> latexHeader = "\\documentclass[a4paper]{article}\n" ++->   "\n\\usepackage{fancyvrb}\n\\usepackage{color}\n\\usepackage{url}\n\n\\begin{document}\n\n" ++->   "\\newcommand{\\" ++ show DC ++ "}[1]{\\textcolor[rgb]{0.8,0,0}{#1}}\n" ++->   "\\newcommand{\\" ++ show TC ++ "}[1]{\\textcolor[rgb]{0,0,0.8}{#1}}\n" ++->   "\\newcommand{\\" ++ show FN ++ "}[1]{\\textcolor[rgb]{0,0.5,0}{#1}}\n" ++->   "\\newcommand{\\" ++ show VV ++ "}[1]{\\textcolor[rgb]{0.5,0,0.5}{#1}}\n" ++->   "\\newcommand{\\" ++ show CM ++ "}[1]{\\textcolor[rgb]{0.4,0.2,0.2}{#1}}\n" ++->   "\\newcommand{\\" ++ show KW ++ "}[1]{\\textcolor[rgb]{0,0,0}{#1}}\n" ++->   "\\newcommand{\\" ++ show ST ++ "}[1]{\\textcolor[rgb]{0.4,0.4,0.4}{#1}}\n"-
− Idris/LambdaLift.lhs
@@ -1,322 +0,0 @@-> {-# OPTIONS_GHC -fglasgow-exts #-}--> module Idris.LambdaLift where--> import Idris.AbsSyntax-> import Idris.PMComp-> import Ivor.TT hiding (SimpleCase(..), CaseAlt(..))-> -> import Control.Monad.State-> import Data.Typeable-> import Debug.Trace-> import Maybe--> import List--This is the language we're converting directly into Epic code, and the-output of the lambda lifter--SCFun is a top level function, with C export name, list of args, code for the body.--> data SCFun = SCFun [SCOpt] [Name] SCBody ->    deriving Show--> data SCOpt = SCInline | SCStrict | SCExport String->    deriving (Show, Eq)--> getEName [] = Nothing-> getEName (SCExport n : xs) = Just n-> getEName (_:xs) = getEName xs--> data SCBody = SVar Name->             | SCon Name Int->             | SApp SCBody [SCBody]->             | SLet Name SCBody SCBody->             | SCCase SCBody [SCAlt]->             | SIf SCBody SCBody SCBody->             | SIfZero SCBody SCBody SCBody->             | SUnit -- for anything that has no runtime meaning, eg types->             | SInfix Op SCBody SCBody->             | SIOOp SCIO->             | SConst Constant->             | SLazy SCBody->             | SError->    deriving (Show, Eq)--Case alternatives, could be a constructor (with tag), a constant, or-a default case--> data SCAlt = SAlt Name Int [Name] SCBody->            | SConstAlt Constant SCBody->            | SDefault SCBody->    deriving (Show, Eq)--It's useful to be able to sort alternatives by tag, for transformation -purposes, since once they're compiled order doesn't matter.--> instance Ord SCAlt where->   compare (SAlt _ t _ _) (SAlt _ u _ _) = compare t u->   compare (SConstAlt c _) (SConstAlt d _) = compare c d->   compare (SDefault _) (SDefault _) = EQ->   compare (SAlt _ _ _ _) _ = LT->   compare (SConstAlt _ _) (SAlt _ _ _ _) = GT->   compare (SConstAlt _ _) (SDefault _) = LT->   compare (SDefault _) _ = GT--Built-in IO operations --> data SCIO = PutStr SCBody->           | GetStr ->           | Fork SCBody->           | NewLock SCBody->           | DoLock SCBody->           | DoUnlock SCBody->           | NewRef->           | ReadRef SCBody->           | WriteRef SCBody SCBody->    deriving (Show, Eq)--Any lambdas in the body need to be made functions in their own right,-with names in scope passed as arguments.--We should try to collect sequences of lambdas, e.g. \x \y \z . e -and lift x,y,z all at once.--We are assuming that all names are already unique, and we're not going-to be inventing any new variable names, just new function names. This-should be guaranteed in the underlying Ivor term.--Inside every ViewTerm, pull out the new SCs and replace lambdas with -application of new SC. First step, just lift lambda out. --Note that we're not fussy about maintaining types here (we've already broken-things by making the case trees anyway). It would, perhaps, be useful to keep-an eye on where the primitive types are though.--LiftState carries the next name, and a list of new functions with -name, arguments, body--> data LiftState = SCS Int [(Name, [Name], SimpleCase)] --> lambdaLift :: Context -> IdrisState -> Name -> [Name] -> ->               SimpleCase -> [(Name, [Name], SimpleCase)]-> lambdaLift ctxt ist root args sc ->        = let -- scEta = expandCons ctxt sc -- Forcing does this! If we->              -- do it again, we undo some of the work forcing has done since->              -- we've reduced arity there.->              (body, SCS _ defs) = runState (liftSC args sc) (SCS 0 []) in->                  addRoot root args body defs->    where liftSC env (SCase tm alts) = do tm' <- lift env tm->                                          alts' <- mapM (liftAlt env) alts->                                          return (SCase tm' (sort alts'))->          liftSC env (Tm t) = do t' <- lift env t->                                 return (Tm t')->          liftSC env x = return x-->          liftAlt env (Alt c i args sc) = do sc' <- liftSC (env++args) sc->                                             return (Alt c i args sc')->          liftAlt env (ConstAlt c sc) = do sc' <- liftSC env sc->                                           return (ConstAlt c sc')->          liftAlt env (Default sc) = do sc' <- liftSC env sc->                                        return (Default sc')--First argument says whether to eta expand-->          lift env (Lambda n ty sc) = liftLam env [n] sc->          lift env (App f a) = do f' <- lift env f->                                  a' <- lift env a->                                  return (App f' a')-->          lift env (Let n ty val sc) = do val' <- lift env val->                                          sc' <- lift (n:env) sc->                                          return (Let n ty val' sc')->          lift env (Annotation a t) = do t' <- lift env t->                                         return (Annotation a t')->          -- and that's all the nested terms we care about->          lift env x = return x--Hoover up all the arguments to nested lambdsa, and make a new function.-with env and newargs. Apply it to the environment only.--FIXME: Invent a unique name for the lifted arg n. Epic can deal with it, but it's still-a bit unpleasant.-->          liftLam env newargs (Lambda n ty sc) ->                      = liftLam env (newargs++[n]) sc->          liftLam env newargs x = do->              x' <- lift (env++newargs) x->              newFn <- getNewSC->              -- new function is \ env newargs -> x'->              addFn newFn (env++newargs) (Tm x')->              -- new body is (newFn @ env)->              return (apply (Name Unknown newFn)->                            (map (Name Unknown) env))-->          getNewSC = do SCS i bs <- get->                        put (SCS (i+1) bs)->                        return (name (show (MN (show root) i)))-->          addFn name args body = do SCS i bs <- get->                                    put (SCS i ((name,args,body):bs))--We need to make sure all constructors are fully applied before we start--> expandCons ctxt sc = ec' sc->   where->     ec' (Tm tm) = Tm (ec tm)->     ec' (SCase tm alts) = SCase (ec tm) (map ecalt alts)->     ec' x = x->     ecalt (Alt n i ns sc) = Alt n i ns (ec' sc)->     ecalt (ConstAlt c sc) = ConstAlt c (ec' sc)->     ecalt (Default sc) = Default (ec' sc)-->     ec ap@(App f a) ->         | Right (ar, con, args) <- needsExp (App f a)->              = etaExp ar con args->     ec (App f a) = App f (ec a)->     ec (Lambda n ty sc) = Lambda n (ec ty) (ec sc)--That's all the terms we care about.-->     ec x = x-->     needsExp ap = needsExp' ap []->     needsExp' (App f a) as = needsExp' f ((ec a):as)->     needsExp' nm@(Name _ n) as ->         = do ar <- getConstructorArity ctxt n->              if (ar == length as) then ttfail "FAIL"->                  else Right (ar, nm, as)->     needsExp' _ _ = ttfail "FAIL"--We don't care about the type on the lambda here, We'll never look at it-even when compiling, it's just for the sake of having constructors fully-applied.-->     etaExp ar con args ->         = let newargs = map (\n -> (toIvorName (MN "exp" n)))->                            [1..(ar-(length args))] in->               addLam newargs (apply con (args++(map (Name Unknown) newargs)))->     addLam [] t = t->     addLam (n:ns) t = Lambda n Star (addLam ns t)--Second step, turn the lambda lifted SimpleCases into SCFuns, translating -IO operations and do notation as we go. Pass relevant function flags through--> scFun :: Context -> IdrisState -> Id -> [Name] -> SimpleCase -> SCFun-> scFun ctxt ist fn args lifted = SCFun mkOpts args (toSC ctxt ist lifted)->    where mkOpts' = do ifn <- ctxtLookup (idris_context ist) [] fn->                       let decl = rawDecl ifn->                       let opts = if (null (lazyArgs ifn)) ->                                    then [SCStrict] else []->                       return $ opts ++ mapMaybe mkSCOpt (funFlags ifn)->                       {- exp <- case decl of->                           Fun _ fls -> getExpFlag fls->                           TermDef _ _ fls -> getExpFlag fls->                            _ -> fail "" -}-->          mkOpts = case mkOpts' of->                         Left _ -> []->                         Right x -> x-->          mkSCOpt (CExport str) = Just $ SCExport str->          mkSCOpt Inline = Just $ SCInline->          mkSCOpt _ = Nothing--> class ToSC a where->     toSC :: Context -> IdrisState -> a -> SCBody--> instance ToSC SimpleCase where->     toSC c ist ErrorCase = SError->     toSC c ist Impossible = SError->     toSC c ist (Tm vt) = toSC c ist vt->     toSC c ist (SCase vt alts) = SCCase (toSC c ist vt) (map toSCa alts)->        where toSCa (Alt n i ns sc) = SAlt n i ns (toSC c ist sc)->              toSCa (ConstAlt v sc) = SConstAlt v (toSC c ist sc)->              toSCa (Default sc)  = SDefault (toSC c ist sc)--> instance ToSC ViewTerm where->     toSC ctxt ist t = sc' t [] where->        sc' (Name ty n) args ->          | n == toIvorName (UN "__Prove_Anything")->            -- we can't actually use this value!->             = SCon (toIvorName (UN "__FAKE")) 0 ->          | n == toIvorName (UN "__Suspend_Disbelief") -- arbitrary refl->             = scapply ist (SCon (toIvorName (UN "refl")) 0) args -- can't actually use this either->          | ty == DataCon->             = case getConstructorTag ctxt n of->                   Right i -> scapply ist (SCon n i) args->          | otherwise->             = case nameType ctxt n of->                   Right TypeCon -> SUnit->                   _ -> scapply ist (SVar n) args->        sc' (App f a) args = sc' f ((sc' a []):args)->        sc' (Let n ty val x) args ->                = scapply ist (SLet n (sc' val []) (sc' x [])) args--Chars are just treated as Ints by the compiler, so convert here.-->        sc' (Constant c) [] ->            = case (cast c)::Maybe Int of->                 Just i -> SConst (Num i)->                 Nothing -> ->                    case (cast c)::Maybe String of->                           Just s -> SConst (Str s)->                           Nothing -> case (cast c)::Maybe Char of->                                        Just c -> SConst (Num (fromEnum c))->                                        Nothing -> case (cast c)::Maybe Double of->                                                     Just c -> SConst (Fl c)->        sc' (Annotation _ x) args = sc' x args->        sc' Placeholder args = SUnit->        sc' x args = SUnit -- no runtime meaning--scapply deals with special cases for infix operators, IO, etc.--> scapply :: IdrisState -> SCBody -> [SCBody] -> SCBody--Infix operators--> scapply ist (SVar n) [x,y]->         | Just op <- getOp n allOps = SInfix op x y-> scapply ist (SVar n) [_,_,_,_]->         | n == opFn JMEq = SUnit-- scapply ist (SVar n) [_,x,y]-         | n == opFn OpEq = SInfix OpEq x y--> scapply ist f [] = f--> scapply ist (SVar n) args->         = let raw = idris_context ist in->           case ctxtLookup raw [] (fromIvorName ist n) of->             Left _ -> SApp (SVar n) args->             Right ifn -> let ia = implicitArgs ifn->                              lz = lazyArgs ifn ->                              args' = makeLazy (map (ia+) lz) args in->                              SApp (SVar n) args'-> scapply ist (SCon n i) args->         = let raw = idris_context ist in->           case ctxtLookup raw [] (fromIvorName ist n) of->             Left _ -> SApp (SCon n i) args->             Right ifn -> let ia = implicitArgs ifn->                              lz = lazyArgs ifn ->                              args' = makeLazy (map (ia+) lz) args in->                              SApp (SCon n i) args'--Everything else--> scapply ist f args = SApp f args--> makeLazy :: [Int] -> [SCBody] -> [SCBody]-> makeLazy lz args = zipWith ml' ->                       (map (\x -> elem x lz) [0..(length args-1)]) args->   where ml' True arg = SLazy arg->         ml' False arg = arg--> addRoot :: Name -> [Name] -> SimpleCase -> [(Name, [Name], SimpleCase)] ->            -> [(Name, [Name], SimpleCase)] -> addRoot root [] body@(Tm (Name _ n)) defs =->         case lookupT n defs of->           Just (as,b) -> (root, as, b):defs->           _ -> (root, [], body):defs->     where lookupT n ds = lookup n (map (\ (x,y,z) -> (x, (y,z))) ds)-> addRoot root args body defs = (root, args, body):defs
− Idris/Latex.lhs
@@ -1,151 +0,0 @@-> {-# OPTIONS_GHC -fglasgow-exts #-}--> module Idris.Latex(latexDump,latexDefs) where--> import Idris.AbsSyntax-> import Debug.Trace--> latexDefs :: [String] -> [(Id,String)]-> latexDefs [] = []-> latexDefs (d:ds) = case span (/='=') d of->                      (i,a:def) -> (UN i, def):(latexDefs ds)->                      _ -> latexDefs ds--> latexDump :: Ctxt IvorFun -> [(Id,String)] -> Id -> IO ()-> latexDump ctxt defs nm = case ctxtLookup ctxt [] nm of->                            Right fn -> putStrLn $ latex ctxt defs fn->                            Left _ -> do putStrLn "No such name"->                                         return ()--> class LaTeX a where->     latex :: Ctxt IvorFun -> [(Id, String)] -> a -> String--> instance LaTeX Id where->     latex ctxt defs n ->         = case lookup n (defs++ldefs) of->             Just l -> l->             Nothing -> case ctxtLookup ctxt [] n of->                          Right (IvorFun _ _ _ _ d _ _ _) -> ty d (show n)->                          Left _ -> "\\VV{" ++ show n ++ "}"->         where ty (DataDecl _) n = "\\TC{" ++ n ++ "}"          ->               ty Constructor n = "\\DC{" ++ n ++ "}"->               ty _ n = "\\FN{" ++ n ++ "}"->               ldefs = case ctxtLookup ctxt [] (MN "latex" 0) of->                         Right (IvorFun _ _ _ _ (LatexDefs ds) _ _ _) -> ds->                         Left _ -> []--> instance LaTeX IvorFun where->     latex ctxt defs (IvorFun nm ty _ _ decl _ _ _) = latex ctxt defs decl--> instance LaTeX Decl where->     latex ctxt defs (DataDecl (Datatype id ty cons _ _ _ _))->           = "\\DM{\\AR{\n\\Data\\hg\\:" ++ ->             latex ctxt defs id ++ "\\:\\Hab\\:\\AR{" ++->             latex ctxt defs ty ++ "\\hg\\Where}\\\\ \n\\begin{array}{rl}\n" ++ ->                     conList (map (latex ctxt defs) cons) ++->                             "\\end{array}\n}}"->        where conList [] = ""->              conList [a] = " & " ++ a ++ "\n"->              conList (a:as) = " & " ++ a ++ "\\\\ \n \\mid" ++ conList as ->     latex ctxt defs (Fun f _) = latex ctxt defs f->     latex ctxt defs (TermDef n tm _) = "\\DM{" ++ latex ctxt defs n ++ "\\:=\\:" ++ latex ctxt defs tm ++ "}"->     latex ctxt defs (Fwd n ty _) = "\\DM{" ++ latex ctxt defs n ++ "\\:\\Hab\\:\\AR{" ++ latex ctxt defs ty ++ "}}"->     latex ctxt defs _ = "Can't LaTeXify this"->                                --> instance LaTeX Function where->     latex ctxt defs (Function n ty clauses _ _) =->         "\\DM{\\AR{\n" ++->         latex ctxt defs n ++ "\\:\\Hab\\:\\AR{" ++ latex ctxt defs ty ++ "}\\\\ \n" ++->         latexClauses clauses ++ "}}"->        where latexClauses [] = ""->              latexClauses cs@((n,(RawClause lhs rhs)):_) =->                  let arity = length (getRawArgs lhs) in->                         "\\PA{" ++ concat (take arity (repeat "\\A")) ++ ->                         "}{" ++->                         concat (map (latex ctxt defs) cs) ++ "}"--> instance LaTeX RawClause where->     latex ctxt defs (RawClause lhs rhs)->                 = let args = getRawArgs lhs->                       fn = getFn lhs in->                       showArgs (fn:args) ++ " & \\Ret{" ++ ->                                latex ctxt defs rhs ++ "}\\\\ \n"->         where->             showArgs [] = ""->             showArgs (a:as) = " & " ++ bracket (latex ctxt defs a) ++ showArgs as->             bracket x | ':' `elem` x = "(" ++ x ++ ")"->                       | otherwise = x--Type/term pairs--> instance (LaTeX a) => LaTeX (a,RawTerm) where->     latex ctxt defs (tm,ty) = latex ctxt defs tm ++ "\\:\\Hab\\:\\AR{" ++ latex ctxt defs ty ++ "}"--Clauses--> instance (LaTeX a) => LaTeX (a,RawClause) where->     latex ctxt defs (nm,clause) = latex ctxt defs clause--Constants--> instance LaTeX Constant where->     latex ctxt defs TYPE = "\\Type"->     latex ctxt defs StringType = "\\TC{String}"->     latex ctxt defs IntType = "\\TC{Int}"->     latex ctxt defs FloatType = "\\TC{Float}"->     latex ctxt defs (Builtin s) = "\\TC{" ++ s ++ "}"->     latex ctxt defs n = show n--Main bit for terms--> instance LaTeX RawTerm where->     latex ctxt defs tm = showP 10 tm where->        showP p (RVar _ _ (UN "__Unit") _) = "()"->        showP p (RVar _ _ (UN "__Empty") _) = "\\bottom"->        showP p (RVar _ _ i _) = latex ctxt defs i->        showP p RRefl = "\\DC{refl}"->        showP p RPlaceholder = "\\_"->        showP p (RApp _ _ f a) = bracket p 1 $ showP 1 f ++ "\\:" ++ showP 0 a->        showP p (RAppImp _ _ n f a) = showP 1 f->        showP p (RBind n (Lam ty) sc)->           = bracket p 2 $ ->             "\\lambda\\VV{" ++ show n ++ "}." ++ showP 10 sc->        showP p (RBind n (Pi Ex _ ty) sc)->           | internal n -- hack for spotting unused names quickly!->              = bracket p 2 $ showP 1 ty ++ "\\to" ++ showP 10 sc->           | otherwise->              = bracket p 2 $->                "(\\VV{" ++ show n ++ "} \\Hab " ++ showP 10 ty ++ ")\\to" ++->                       showP 10 sc->          where internal (UN ('_':'_':_)) = True->                internal (MN _ _) = True->                internal _ = False->        showP p (RBind n (Pi Im _ ty) sc)->              = bracket p 2 $ showP 10 sc->        showP p (RBind n (RLet val ty) sc)->           = bracket p 2 $->             "\\LET:\\VV{" ++ show n ++ "}\\: = " ++ showP 10 val->                    ++ "\\:\\IN\\:" ++ showP 10 sc->        showP p (RConst _ _ c) = latex ctxt defs c->        showP p (RInfix _ _ op l r) = bracket p 5 $->                                      showP 4 l ++ show op ++ showP 4 r--We want the closing bracket inside the \AR here, so it's on the right line,-hence the weird bracketing.-->        showP p (RDo ds) = (bracket p 2 $->                            "\\RW{do}\\:\\AR{" ++ ->                            concat (map (latex ctxt defs) ds)) ++ "}"->                            ->        showP _ x = show x ->        bracket outer inner str | inner>outer = "("++str++")"->                                | otherwise = str--> instance LaTeX Do where->     latex ctxt defs (DoBinding _ _ n ty tm) ->         = latex ctxt defs n ++ "\\leftarrow " ++ latex ctxt defs tm ++ ->           "\\\\ \n"->     latex ctxt defs (DoExp _ _ tm) = latex ctxt defs tm ++ "\\\\ \n"--
− Idris/Lexer.hs
@@ -1,465 +0,0 @@-module Idris.Lexer where--import Data.Char-import Debug.Trace--import Idris.AbsSyntax--type LineNumber = Int--type P a = String -> String -> LineNumber -> Fixities -> Result a--getLineNo :: P LineNumber-getLineNo = \s fn l ops -> Success l--getFileName :: P String-getFileName = \s fn l ops -> Success fn--getContent :: P String-getContent = \s fn l ops -> Success s--getOps :: P Fixities-getOps = \s fn l ops -> Success ops--thenP :: P a -> (a -> P b) -> P b-m `thenP` k = \s fn l ops ->-   case m s fn l ops of-       Success a -> k a s fn l ops-       Failure e f ln -> Failure e f ln--returnP :: a -> P a-returnP a = \s fn l ops -> Success a--failP :: String -> P a-failP err = \s fn l ops -> Failure err fn l--catchP :: P a -> (String -> P a) -> P a-catchP m k = \s fn l ops ->-   case m s fn l ops of-      Success a -> Success a-      Failure e f ln -> k e s fn l ops--happyError :: P a-happyError = reportError "Parse error"--reportError :: String -> P a-reportError err = getFileName `thenP` \fn ->-                  getLineNo `thenP` \line ->-		  getContent `thenP` \str ->-                      failP (fn ++ ":" ++ show line ++ ":" ++ err ++ -                             " - before " ++ take 80 str ++ "...")--data Token-      = TokenName Id-      | TokenNSep-      | TokenInfixName String-      | TokenBrackName Id-      | TokenString String-      | TokenInt Int-      | TokenFloat Double-      | TokenChar Char-      | TokenBool Bool-      | TokenMetavar Id-      | TokenIntType-      | TokenCharType-      | TokenBoolType-      | TokenFloatType-      | TokenStringType-      | TokenHandleType-      | TokenLockType-      | TokenPtrType-      | TokenDataType-      | TokenCoDataType-      | TokenInfix-      | TokenInfixL-      | TokenInfixR-      | TokenParams-      | TokenUsing-      | TokenIdiom-      | TokenNoElim-      | TokenCollapsible-      | TokenPartial-      | TokenSyntax-      | TokenLazy-      | TokenStatic-      | TokenWhere-      | TokenWith-      | TokenType-      | TokenLType-      | TokenLazyBracket-      | TokenOB-      | TokenCB-      | TokenOCB-      | TokenCCB-      | TokenHashOB-      | TokenLPair-      | TokenRPair-      | TokenOSB-      | TokenCSB-      | TokenOId-      | TokenCId---      | TokenExists-      | TokenConcat-      | TokenTilde-      | TokenPlus-      | TokenMinus-      | TokenTimes-      | TokenDivide-      | TokenEquals-      | TokenOr-      | TokenAnd-      | TokenMightEqual-      | TokenEQ-      | TokenGE-      | TokenLE-      | TokenGT-      | TokenLT-      | TokenArrow-      | TokenFatArrow-      | TokenTransArrow-      | TokenLeftArrow-      | TokenColon-      | TokenSemi-      | TokenComma-      | TokenTuple-      | TokenBar-      | TokenStars-      | TokenDot-      | TokenEllipsis-      | TokenLambda-      | TokenInclude-      | TokenModule-      | TokenNamespace-      | TokenPublic-      | TokenPrivate-      | TokenAbstract-      | TokenImport-      | TokenExport-      | TokenInline-      | TokenDo-      | TokenReturn-      | TokenIf-      | TokenThen-      | TokenElse-      | TokenLet-      | TokenIn-      | TokenRefl-      | TokenEmptyType-      | TokenUnitType-      | TokenUnderscore-      | TokenBang--- Tactics-      | TokenProof-      | TokenTryProof-      | TokenIntro-      | TokenRefine-      | TokenExists-      | TokenGeneralise-      | TokenReflP-      | TokenRewrite-      | TokenRewriteAll-      | TokenCompute-      | TokenUnfold-      | TokenUndo-      | TokenInduction-      | TokenFill-      | TokenTrivial-      | TokenSimpleSearch-      | TokenMkTac-      | TokenBelieve-      | TokenUse-      | TokenDecide-      | TokenAbandon-      | TokenProofTerm-      | TokenQED--- Directives-      | TokenLaTeX-      | TokenNoCG-      | TokenEval-      | TokenSpec-      | TokenFreeze-      | TokenThaw-      | TokenTransform-      | TokenCInclude-      | TokenCLib-      | TokenHide-      | TokenEOF- deriving (Show, Eq)---lexer :: (Token -> P a) -> P a-lexer cont [] = cont TokenEOF []-lexer cont ('\n':cs) = \fn line -> lexer cont cs fn (line+1)--- empty type-lexer cont ('_':'|':'_':cs) = cont TokenEmptyType cs-lexer cont ('_':c:cs) | not (isAlpha c) && c/='_' = cont TokenUnderscore (c:cs)-lexer cont (c:cs)-      | isSpace c = \fn line -> lexer cont cs fn line-      | isAlpha c = lexVar cont (c:cs)-      | isDigit c = lexNum cont (c:cs)-      | c == '_' = lexVar cont (c:cs)--- unit type-lexer cont ('(':')':cs) = cont TokenUnitType cs-lexer cont ('"':cs) = lexString cont cs-lexer cont ('\'':cs) = lexChar cont cs-lexer cont ('{':'-':cs) = lexerEatComment 0 cont cs-lexer cont ('-':'-':cs) = lexerEatToNewline cont cs-lexer cont ('(':cs) = cont TokenOB cs-lexer cont (')':cs) = cont TokenCB cs-lexer cont ('{':c:cs) -    | isAlpha c || c=='_' = lexBrackVar cont (c:cs)-lexer cont ('{':cs) = cont TokenOCB cs-lexer cont ('}':cs) = cont TokenCCB cs-lexer cont ('[':'|':cs) = cont TokenOId cs-lexer cont ('|':']':cs) = cont TokenCId cs-lexer cont ('[':cs) = cont TokenOSB cs-lexer cont (']':cs) = cont TokenCSB cs-lexer cont ('?':'=':cs) = cont TokenMightEqual cs-lexer cont (';':cs) = cont TokenSemi cs-lexer cont ('\\':cs) = cont TokenLambda cs-lexer cont ('#':'(':cs) = cont TokenHashOB cs--- lexer cont ('#':cs) = cont TokenType cs-lexer cont (',':cs) = cont TokenComma cs-lexer cont ('|':'(':cs) = cont TokenLazyBracket cs-lexer cont ('%':cs) = lexSpecial cont cs-lexer cont ('?':cs) = lexMeta cont cs-lexer cont (c:cs) | isOpPrefix c = lexOp cont (c:cs)-lexer cont (c:cs) = lexError c cs--lexError c s l ops = failP (show l ++ ": Unrecognised token '" ++ [c] ++ "'\n") s l ops--lexerEatComment nls cont ('-':'}':cs)-    = \fn line -> lexer cont cs fn (line+nls)-lexerEatComment nls cont ('\n':cs) = lexerEatComment (nls+1) cont cs-lexerEatComment nls cont (c:cs) = lexerEatComment nls cont cs--lexerEatToNewline cont ('\n':cs)-   = \fn line -> lexer cont cs fn (line+1)-lexerEatToNewline cont []-   = \fn line -> lexer cont [] fn line-lexerEatToNewline cont (c:cs) = lexerEatToNewline cont cs--lexNum cont cs = case readNum cs of-                    (num,rest,isreal) ->-                        cont (tok num isreal) rest-  where tok num isreal | isreal = TokenFloat (read num)-                       | otherwise = TokenInt (read num)--readNum :: String -> (String,String,Bool)-readNum x = rn' False "" x-  where rn' dot acc [] = (acc,[],dot)-        rn' False acc ('.':xs) | head xs /= '.' = rn' True (acc++".") xs-        rn' dot acc (x:xs) | isDigit x = rn' dot (acc++[x]) xs-        rn' dot acc ('e':'+':xs) = rn' True (acc++"e+") xs-        rn' dot acc ('e':'-':xs) = rn' True (acc++"e-") xs-        rn' dot acc ('e':xs) = rn' True (acc++"e") xs-        rn' dot acc xs = (acc,xs,dot)--lexString cont cs =-   \fn line ops ->-   case getstr cs of-      Just (str,rest,nls) -> cont (TokenString str) rest fn (nls+line) ops-      Nothing -> failP (fn++":"++show line++":Unterminated string contant")-                    cs fn line ops--lexChar cont cs =-   \fn line ops ->-   case getchar cs of-      Just (str,rest) -> cont (TokenChar str) rest fn line ops-      Nothing ->-          failP (fn++":"++show line++":Unterminated character constant")-                       cs fn line ops--isAllowed c = isAlpha c || isDigit c || c `elem` "_\'?#."--lexVar cont cs =-   case span isAllowed cs of--- Keywords-      ("proof",rest) -> cont TokenProof rest-      ("tryproof",rest) -> cont TokenTryProof rest-      ("data",rest) -> cont TokenDataType rest-      ("codata",rest) -> cont TokenCoDataType rest-      ("using",rest) -> cont TokenUsing rest-      ("idiom",rest) -> cont TokenIdiom rest-      ("params",rest) -> cont TokenParams rest-      ("namespace",rest) -> cont TokenNamespace rest-      ("public",rest) -> cont TokenPublic rest-      ("private",rest) -> cont TokenPrivate rest-      ("abstract",rest) -> cont TokenAbstract rest-      ("module",rest) -> cont TokenModule rest-      ("import",rest) -> cont TokenImport rest-      ("export",rest) -> cont TokenExport rest-      ("inline",rest) -> cont TokenInline rest-      ("noElim",rest) -> cont TokenNoElim rest-      ("collapsible",rest) -> cont TokenCollapsible rest-      ("where",rest) -> cont TokenWhere rest-      ("with",rest) -> cont TokenWith rest-      ("partial",rest) -> cont TokenPartial rest-      ("syntax",rest) -> cont TokenSyntax rest-      ("lazy",rest) -> cont TokenLazy rest-      ("static",rest) -> cont TokenStatic rest-      ("infix",rest) -> cont TokenInfix rest-      ("infixl",rest) -> cont TokenInfixL rest-      ("infixr",rest) -> cont TokenInfixR rest-      ("exists",rest) -> cont TokenExists rest--- Types-      ("Set",rest) -> cont TokenType rest-      ("LSet",rest) -> cont TokenLType rest-      ("Int",rest) -> cont TokenIntType rest-      ("Char",rest) -> cont TokenCharType rest-      ("Float",rest) -> cont TokenFloatType rest-      ("String",rest) -> cont TokenStringType rest-      ("Lock",rest) -> cont TokenLockType rest-      ("Handle",rest) -> cont TokenHandleType rest-      ("Ptr",rest) -> cont TokenPtrType rest-      ("refl",rest) -> cont TokenRefl rest-      ("include",rest) -> cont TokenInclude rest-      ("do",rest) -> cont TokenDo rest-      ("return",rest) -> cont TokenReturn rest-      ("if",rest) -> cont TokenIf rest-      ("then",rest) -> cont TokenThen rest-      ("else",rest) -> cont TokenElse rest-      ("let",rest) -> cont TokenLet rest-      ("in",rest) -> cont TokenIn rest--- values--- expressions-      (var,rest) -> cont (mkname var) rest--lexOp cont cs = case span isOpChar cs of-                   (":",rest) -> cont TokenColon rest---                   ("+",rest) -> cont TokenPlus rest-                   ("-",rest) -> cont TokenMinus rest---                   ("*",rest) -> cont TokenTimes rest---                   ("/",rest) -> cont TokenDivide rest-                   ("=",rest) -> cont TokenEquals rest---                   ("==",rest) -> cont TokenEQ rest-                   (">",rest) -> cont TokenGT rest-                   ("<",rest) -> cont TokenLT rest---                   (">=",rest) -> cont TokenGE rest---                   ("<=",rest) -> cont TokenLE rest---                   ("++",rest) -> cont TokenConcat rest---                   ("&&",rest) -> cont TokenAnd rest-                   ("<|",rest) -> cont TokenLPair rest-                   ("|>",rest) -> cont TokenRPair rest-                   ("&",rest) -> cont TokenTuple rest---                   ("||",rest) -> cont TokenOr rest-                   ("...",rest) -> cont TokenEllipsis rest-                   ("**",rest) -> cont TokenStars rest-                   ("|",rest) -> cont TokenBar rest-                   ("!",rest) -> cont TokenBang rest-                   ("->", rest) -> cont TokenArrow rest-                   ("=>", rest) -> cont TokenFatArrow rest-                   -- ("==>", rest) -> cont TokenTransArrow rest-                   ("<-", rest) -> cont TokenLeftArrow rest-                   ("~", rest) -> cont TokenTilde rest-                   (op,rest) -> cont (TokenInfixName op) rest--isOpPrefix c = c `elem` ":+-*/=_.?|&><!@$%^~#"-isOpChar = isOpPrefix--lexBrackVar cont cs =-    case span isAllowed cs of-      (var,rest) -> cont (TokenBrackName (UN var)) rest--lexSpecial cont cs =-    case span isAllowed cs of-      ("latex",rest) -> cont TokenLaTeX rest-      ("nocg",rest) -> cont TokenNoCG rest-      ("eval",rest) -> cont TokenEval rest-      ("spec",rest) -> cont TokenSpec rest-      ("freeze",rest) -> cont TokenFreeze rest-      ("thaw",rest) -> cont TokenThaw rest-      ("transform",rest) -> cont TokenTransform rest-      ("include",rest) -> cont TokenCInclude rest-      ("lib",rest) -> cont TokenCLib rest-      ("hide",rest) -> cont TokenHide rest--- tactics--- FIXME: it'd be better to have a 'theorem proving' state so that these--- don't need the ugly syntax...-      ("intro",rest) -> cont TokenIntro rest-      ("refine",rest) -> cont TokenRefine rest-      ("exists",rest) -> cont TokenExists rest-      ("generalise",rest) -> cont TokenGeneralise rest-      ("refl",rest) -> cont TokenReflP rest-      ("rewrite",rest) -> cont TokenRewrite rest-      ("rewriteall",rest) -> cont TokenRewriteAll rest-      ("compute",rest) -> cont TokenCompute rest-      ("unfold",rest) -> cont TokenUnfold rest-      ("undo",rest) -> cont TokenUndo rest-      ("induction",rest) -> cont TokenInduction rest-      ("fill", rest) -> cont TokenFill rest-      ("trivial", rest) -> cont TokenTrivial rest-      ("searchcontext", rest) -> cont TokenSimpleSearch rest-      ("mktac", rest) -> cont TokenMkTac rest-      ("believe", rest) -> cont TokenBelieve rest-      ("use", rest) -> cont TokenUse rest-      ("decide", rest) -> cont TokenDecide rest-      ("abandon", rest) -> cont TokenAbandon rest-      ("prf", rest) -> cont TokenProofTerm rest-      ("qed", rest) -> cont TokenQED rest-      (thing,rest) -> lexError '%' rest---- Read everything up to '[whitespace]Qed'-{--lexProof cont cs = -   \fn line ->-      case getprf cs of-        Just (str,rest,nls) -> cont (TokenProof str) rest fn (nls+line)-        Nothing -> failP (fn++":"++show line++":No QED in Proof")-                          cs fn line--}--lexMeta cont cs =-    case span isAllowed cs of-      (thing,rest) -> cont (TokenMetavar (UN thing)) rest--mkname :: String -> Token-mkname c = TokenName (mkNS c)--mkNS c = let xs = mkNS' [] [] c in-            case xs of-              [x] -> UN x-              (x:xs) -> NS (map UN (reverse xs)) (UN x)- where-  mkNS' acc wds [] = reverse acc:wds-  mkNS' acc wds ('.':cs) = mkNS' [] (reverse acc:wds) cs-  mkNS' acc wds (c:cs) = mkNS' (c:acc) wds cs--getstr :: String -> Maybe (String,String,Int)-getstr cs = case getstr' "" cs 0 of-               Just (str,rest,nls) -> Just (reverse str,rest,nls)-               _ -> Nothing-getstr' acc ('\"':xs) = \nl -> Just (acc,xs,nl)-getstr' acc ('\\':'n':xs) = getstr' ('\n':acc) xs -- Newline-getstr' acc ('\\':'r':xs) = getstr' ('\r':acc) xs -- CR-getstr' acc ('\\':'t':xs) = getstr' ('\t':acc) xs -- Tab-getstr' acc ('\\':'b':xs) = getstr' ('\b':acc) xs -- Backspace-getstr' acc ('\\':'a':xs) = getstr' ('\a':acc) xs -- Alert-getstr' acc ('\\':'f':xs) = getstr' ('\f':acc) xs -- Formfeed-getstr' acc ('\\':'0':xs) = getstr' ('\0':acc) xs -- null-getstr' acc ('\\':x:xs) = getstr' (x:acc) xs -- Literal-getstr' acc ('\n':xs) = \nl ->getstr' ('\n':acc) xs (nl+1) -- Count the newline-getstr' acc (x:xs) = getstr' (x:acc) xs-getstr' _ _ = \nl -> Nothing--getchar :: String -> Maybe (Char,String)-getchar ('\\':'n':'\'':xs) = Just ('\n',xs) -- Newline-getchar ('\\':'r':'\'':xs) = Just ('\r',xs) -- CR-getchar ('\\':'t':'\'':xs) = Just ('\t',xs) -- Tab-getchar ('\\':'b':'\'':xs) = Just ('\b',xs) -- Backspace-getchar ('\\':'a':'\'':xs) = Just ('\a',xs) -- Alert-getchar ('\\':'f':'\'':xs) = Just ('\f',xs) -- Formfeed-getchar ('\\':'0':'\'':xs) = Just ('\0',xs) -- null-getchar ('\\':x:'\'':xs) = Just (x,xs) -- Literal-getchar (x:'\'':xs) = Just (x,xs)-getchar _ = Nothing--getprf :: String -> Maybe (String, String, Int)-getprf s = case getprf' "" s 0 of -               Just (str,rest,nls) -> Just (reverse str,rest,nls)-               _ -> Nothing-getprf' acc (c:'Q':'E':'D':rest)-    | isSpace c = \nl -> Just (acc,rest,nl)-getprf' acc ('\n':xs) = \nl ->getprf' ('\n':acc) xs (nl+1) -- Count the newline-getprf' acc (x:xs) = getprf' (x:acc) xs-getprf' acc _ = \nl -> Nothing
− Idris/Lib.lhs
@@ -1,15 +0,0 @@-> {-# OPTIONS_GHC -fglasgow-exts #-}--> module Idris.Lib(defaultLibPath, readLibFile) where--> import Paths_idris--> defaultLibPath = [] -- prefix ++ "/lib/idris"]--> readLibFile :: [FilePath] -> FilePath -> IO String-> readLibFile xs x = ->    do dfname <- getDataFileName x->       tryReads ((map (\f -> f ++ "/" ++ x) (".":xs))++[dfname])->    where tryReads [] = fail $ "Can't find " ++ x->          tryReads (x:xs) = do catch (readFile x)->                                  (\e -> tryReads xs)
− Idris/MakeTerm.lhs
@@ -1,418 +0,0 @@-> module Idris.MakeTerm where--> import Idris.AbsSyntax-> import Idris.Prover-> import Idris.SimpleCase-> import Idris.PartialEval--> import Ivor.TT as TT-> import Debug.Trace--> import Control.Monad-> import Control.Monad.State-> import List--Work out how many implicit arguments we need, then translate our definition-into an ivor definition, with all the necessary placeholders added.--The definition may generate new definitions (e.g. metavariables with proofs-attached).--> makeIvorFun ::  Implicit -> UndoInfo -> UserOps ->->                 Ctxt IvorFun -> Decl -> Function -> [CGFlag] -> ->                 (IvorFun, [Decl])--> makeIvorFun using ui uo ctxt decl (Function n ty clauses file line) flags->     = let (rty, imp) = addImplWith using ctxt (syntax ctxt using uo ty)->           ity = makeIvorTerm using ui uo n ctxt rty->           extCtxt = addEntry ctxt (thisNamespace using) n (IvorFun Nothing (Just ity) ->                                       imp Nothing decl flags (map (+p) (getLazy ty)) (map (+p) (getStatic ty)))->           clauses' = map (\ (n, c) -> (n, syntaxClause ctxt using uo c)) clauses ->           (clausesm, (_, newms)) ->                 = runState (insertMetasClauses n clauses') (0, [])->           pclauses = map (mkPat extCtxt imp) clausesm->           newdefs = reverse (map mkPrf newms) in->       (IvorFun (Just (toIvorName (fullName using n))) ->                   (Just (Annotation (FileLoc file line) ity)) imp ->                   (Just (PattDef (Patterns pclauses))) decl flags ->                   (map (+p) (getLazy ty)) (map (+p) (getStatic ty)),->                   newdefs)->   where p = length (params using)->         mkPat ectx imp (id,(RawClause lhs rhs)) ->               = let lhs' = addPlaceholders ectx using uo lhs in->                     case (getFn lhs', getRawArgs lhs') of->                          (fid, pats) ->->                            let vpats = map (toIvor uo ui n) pats->                                vrhs = makeIvorTerm using ui uo n ectx rhs in->                                PClause vpats [] vrhs->         mkPat ectx imp (id,(RawWithClause lhs prf scr def))->               = let lhs' = addPlaceholders ectx using uo lhs in->                     case (getFn lhs', getRawArgs lhs') of->                          (fid, pats) ->->                            let vpats = map (toIvor uo ui n) pats->                                vscr = makeIvorTerm using ui uo n ectx scr->                                vdef = Patterns $ map (mkPat ectx imp) (zip (repeat id) def) in->                                PWithClause prf vpats vscr vdef->         mkPrf (nm, tacs, failable) = Prf (Proof nm Nothing tacs) failable--> makeIvorFuns :: [Opt] -> Ctxt IvorFun -> ->                 [Decl] -> UserOps -> (Ctxt IvorFun, UserOps)-> makeIvorFuns opts is defs uo = mif opts is newCtxt noImplicit defDo uo defs--> mif :: [Opt] ->->        Ctxt IvorFun -> -- init->        Ctxt IvorFun -> -- new->        Implicit -> -- implicits->        UndoInfo -> -- do using bind, return->        UserOps -> -- Users operators->        [Decl] -> (Ctxt IvorFun, UserOps)-> mif opt ctxt acc using ui uo [] = (acc, uo)-> mif opt ctxt acc using' ui uo ((Using using decls):ds)->         = let (acc', uo') = mif opt ctxt acc (addUsing using' (Imp using [] [] (thisNamespace using'))) ui uo decls in->               mif opt ctxt acc' using' ui uo' ds-> mif opt ctxt acc using' ui uo ((Params newps decls):ds)->         = let (acc', uo') = (mif opt ctxt acc (addParams using' newps) ui uo decls) in->               mif opt ctxt acc' using' ui uo' ds-> mif opt ctxt acc using' ui uo ((Namespace n decls):ds)->         = let (acc', uo') = (mif opt ctxt acc (addNS using' n) ui uo decls) in->               mif opt ctxt acc' using' ui uo' ds-> mif opt ctxt acc using ui@(UI _ _ _ _ p pi r ri) uo ((DoUsing bind ret decls):ds)->         = let (acc', uo') = (mif opt ctxt acc using ui' uo decls) in->              mif opt ctxt acc' using ui uo' ds->    where ui' = let (bimpl, bfull) ->                       = case ctxtLookupName (appCtxt ctxt acc) (thisNamespace using) bind of->                              Right (i, bfull) -> (implicitArgs i, bfull)->                              Left err -> error (show err)->                    (rimpl, rfull)->                       = case ctxtLookupName (appCtxt ctxt acc) (thisNamespace using) ret of->                              Right (i, rfull) -> (implicitArgs i, rfull)->                              Left err -> error (show err)->                     in UI bfull bimpl rfull rimpl p pi r ri-> mif opt ctxt acc using ui@(UI b bi r ri _ _ _ _) uo ((Idiom pure ap decls):ds)->         = let (acc', uo') = (mif opt ctxt acc using ui' uo decls) in->             mif opt ctxt acc' using ui uo' ds->    where ui' = let (pureImpl, pfull) ->                      = case ctxtLookupName (appCtxt ctxt acc) (thisNamespace using) pure of->                              Right (i, pfull) -> (implicitArgs i, pfull)->                              Left err -> error (show err)->                    (apImpl, afull) ->                      = case ctxtLookupName (appCtxt ctxt acc) (thisNamespace using) ap of->                              Right (i, afull) -> (implicitArgs i, afull)->                              Left err -> error (show err)->                     in UI b bi r ri pfull pureImpl afull apImpl-> mif opt ctxt acc using' ui uo (decl@(Fun f flags):ds) ->         = let using = addParamName using' (funId f)->               (fn, newdefs) = makeIvorFun using ui uo (appCtxt ctxt acc) decl f flags in->               mif opt ctxt (addEntry acc (thisNamespace using) (funId f) fn) using ui uo (newdefs ++ ds)-> mif opt ctxt acc using' ui uo (decl@(Fwd n ty flags):ds) ->      = let (file, line) = getFileLine ty->            using = addParamName using' n->            (rty, imp) = addImplWith using (appCtxt ctxt acc) ty->            ity = makeIvorTerm using ui uo n (appCtxt ctxt acc) rty in->            mif opt ctxt (addEntry acc (thisNamespace using) n ->                         (IvorFun (Just (toIvorName (fullName using n))) ->                            (Just (Annotation (FileLoc file line) ity))->                              imp (Just Later) decl flags (getLazy ty) (getStatic ty))) using ui uo ds-> mif opt ctxt acc using' ui uo (decl@(DataDecl d):ds) ->      = let using = addParamName using' (tyId d) in->            addDataEntries opt ctxt acc decl d using ui uo ds -- will call mif on ds-> mif opt ctxt acc using ui uo@(UO _ trans _ _) (decl@(TermDef n tm flags):ds) ->     | null $ params using->         = let (itmraw, imp) = addImplWith using (appCtxt ctxt acc) tm->               itm = makeIvorTerm using ui uo n (appCtxt ctxt acc) itmraw in->               mif opt ctxt (addEntry acc (thisNamespace using) n ->                   (IvorFun (Just (toIvorName (fullName using n))) Nothing imp ->                            (Just (SimpleDef itm)) decl flags [] [])) using ui uo ds->     | otherwise = let (f,l) = getFileLine tm in->                       mif opt ctxt (addEntry acc (thisNamespace using) n ->                                (IvorProblem (f ++ ":" ++ show l ++ ":" ++->                                 show n ++ " needs a type declaration in a params block"))) ->                                 using ui uo ds-> mif opt ctxt acc using ui uo (decl@(LatexDefs ls):ds) ->         = mif opt ctxt (addEntry acc (thisNamespace using) (MN "latex" 0) ->              (IvorFun Nothing Nothing 0 Nothing decl [] [] [])) using ui uo ds-> mif opt ctxt acc using ui (UO fix trans fr syns) (decl@(Fixity op assoc prec):ds) ->         = mif opt ctxt (addEntry acc (thisNamespace using) (MN "fixity" (length ds)) ->              (IvorFun Nothing Nothing 0 Nothing decl [] [] [])) using ui ->                   (UO ((op,(assoc,prec)):fix) trans fr syns) ds-> mif opt ctxt acc using ui uo@(UO fix trans fr syns) (decl@(Transform lhs rhs):ds) ->         = let lhsraw = addPlaceholders (appCtxt ctxt acc) using uo lhs->               rhsraw = addPlaceholders (appCtxt ctxt acc) using uo rhs->               lhstm = makeIvorTerm using ui uo (MN "LHS" 0) ctxt lhsraw->               rhstm = makeIvorTerm using ui uo (MN "RHS" 0) ctxt rhsraw ->               trans' = if (NoSpec `elem` opt) then trans else->                            (lhstm,rhstm):trans in->           mif opt ctxt (addEntry acc (thisNamespace using) (MN "transform" (length ds)) ->              (IvorFun Nothing Nothing 0 Nothing decl [] [] [])) using ui ->                   (UO fix trans' fr syns) ds-> mif opt ctxt acc using ui uo@(UO fix trans fr syns) (decl@(SynDef f args rhs):ds) ->         = let sname = mkName (thisNamespace using) f ->               syns' = addEntry syns (thisNamespace using) sname (Syntax sname args rhs) in->               mif opt ctxt (addEntry acc (thisNamespace using) f->                 (IvorFun Nothing Nothing 0 Nothing decl [] [] []))->               using ui (UO fix trans fr syns') ds--Don't add yet! Or everything will be frozen in advance, rather than being -frozen after they are needed.--> mif opt ctxt acc using ui uo@(UO fix trans fr syns) (decl@(Freeze _ _ _ _):ds) ->     = mif opt ctxt (addEntry acc (thisNamespace using) (MN "freeze" (length ds))->                 (IvorFun Nothing Nothing 0 Nothing decl [] [] [])) using ui ->                 (UO fix trans fr syns) ds-> mif opt ctxt acc using ui uo (decl@(Prf (Proof n _ scr) failable):ds) ->     = case ctxtLookup acc (thisNamespace using) n of->          Left _ -> -- add the script and process the type later, should->                    -- be a metavariable->             mif opt ctxt (addEntry acc (thisNamespace using) n->               (IvorFun (Just (toIvorName (fullName using n))) Nothing 0 (Just (IProof scr failable)) decl [] [] [])) ->                  using ui uo ds->          Right (IvorFun _ ty imp _ _ _ _ _) -> ->             mif opt ctxt (addEntry acc (thisNamespace using) n->               (IvorFun (Just (toIvorName (fullName using n))) ty imp (Just (IProof scr failable)) decl [] [] []))->                   using ui uo ds--Just pass these on to epic to do the right thing--> mif opt ctxt acc using ui uo ((CInclude _):ds) = mif opt ctxt acc using ui uo ds-> mif opt ctxt acc using ui uo ((CLib _):ds) = mif opt ctxt acc using ui uo ds-> mif opt ctxt acc using ui uo (d:ds) = error $ "Miffed: " ++ show d--error "Not implemented"--Add an entry for the type id and for each of the constructors.--> addDataEntries :: [Opt] ->->                   Ctxt IvorFun -> Ctxt IvorFun -> Decl ->->                   Datatype -> Implicit ->->                   UndoInfo -> UserOps ->->                   [Decl] -> ->                   (Ctxt IvorFun, UserOps)-> addDataEntries opt ctxt acc decl (Latatype tid tty f l) using ui uo ds = ->     let (tyraw, imp) = addImplWith using (appCtxt ctxt acc) tty->         tytm = Annotation (FileLoc f l) $ makeIvorTerm using ui uo tid (appCtxt ctxt acc) tyraw ->         acc' = addEntry acc (thisNamespace using) tid ->                   (IvorFun (Just (toIvorName (fullName using tid))) (Just tytm) imp (Just LataDef) decl [] [] []) in->         mif opt ctxt acc' using ui uo ds-> addDataEntries opt ctxt acc decl (Datatype tid tty cons u e f l) using ui uo ds = ->     let (tyraw, imp) = addImplWith using (appCtxt ctxt acc) tty->         tytm = Annotation (FileLoc f l) $ makeIvorTerm using ui uo tid (appCtxt ctxt acc) tyraw->         acctmp = addEntry (appCtxt ctxt acc) (thisNamespace using) tid ->                     (IvorFun (Just (toIvorName (fullName using tid))) (Just tytm) imp Nothing decl [] [] [])->         ddef = makeInductive acctmp tid (getBinders tytm []) cons ->                    (addUsing using (Imp u [] [] (thisNamespace using))) ui uo []->         acc' = addEntry acc (thisNamespace using) tid ->                   (IvorFun (Just (toIvorName (fullName using tid))) (Just tytm) imp ->                              (Just (DataDef ddef (not (elem NoElim e)))) decl [] [] []) in->         addConEntries opt ctxt acc' cons u using ui uo ds f l--     Inductive (toIvorName tid) [] --> makeInductive :: Ctxt IvorFun -> Id -> ([(Name, ViewTerm)], ViewTerm) ->->                  [(Id,RawTerm)] -> Implicit ->->                  UndoInfo -> UserOps -> [(Name, ViewTerm)] -> Inductive-> makeInductive ctxt tid (indices, tty) [] using ui uo acc->        = Inductive (toIvorName (fullName using tid)) [] indices tty (reverse acc)-> makeInductive ctxt cdec indices ((cid, cty):cs) using ui uo acc->        = let (tyraw, imp) = addImplWith using ctxt cty->              tytm = makeIvorTerm using ui uo cdec ctxt tyraw in->              makeInductive ctxt cdec->                            indices cs using ui uo (((toIvorName (fullName using cid)),tytm):acc)--Examine an inductive definition; any index position which does not-change across the structure becomes a parameter.--The type has to be fully elaborated here. It's a bit of a hack, but we-add the type once, without the elim rule, so that the placeholders are filled-in, then we add it again after we work out what the parameters are, with-the elim rule.--Parameters go at the left, so as soon as find find an argment which isn't-a parameter, there can be no more (or we mess up the declared type). Hence -'span' rather than 'partition'.--> mkParams :: Inductive -> Inductive-> mkParams ind@(Inductive tname ps inds ty cons) ->   = let (newps', newinds') = span (isParam (map snd cons)) ->                                      (zip [0..] inds)->         newps = map snd newps'->         newinds = map snd newinds'->         newty = remAllPs newps ty->         newind = Inductive tname (ps++newps) newinds ty (remPs newps cons) in->           -- trace (show ind ++ "\n" ++ show newind ++ "\n" ++ show newps) $->             newind->   where isParam [] _ = True->         isParam (c:cs) (pos, (n,ty))->              | isParamCon pos c n = isParam cs (pos, (n,ty))->              | otherwise = False--If argument at given position wherever 'tname' is applied is always n, then-n is a parameter-->         isParamCon pos tm n ->             = checkp pos n (getApps tm)->         checkp pos n [] = True->         checkp pos n (t:ts) ->              | length t >= pos = nameMatch n (t!!!(pos,"checkp fail")) && checkp pos n ts->              | otherwise = False->         nameMatch n (Name _ nm) = n == nm->         nameMatch n (Annotation _ t) = nameMatch n t->         nameMatch _ _ = False-->         getApps app@(App f a)->             | appIsT (getApp f) = [getFnArgs app]->             | otherwise = getApps f ++ getApps a->         getApps (Forall n ty sc) = getApps ty ++ getApps sc->         getApps (Annotation _ n) = getApps n->         getApps x = []-->         appIsT (Name _ n) = n == tname->         appIsT (Annotation _ t) = appIsT t->         appIsT _ = False-->         remPs newps [] = []->         remPs newps ((n,ty):tys) = (n,remAllPs newps ty):(remPs newps tys)->         remAllPs newps (Forall n ty sc)->                  | n `elem` (map fst newps) = remAllPs newps sc->                  | otherwise = Forall n ty (remAllPs newps sc)->         remAllPs newps (Annotation _ n) = remAllPs newps n->         remAllPs newps x = x--> addConEntries :: [Opt] ->->                  Ctxt IvorFun -> Ctxt IvorFun -> ->                  [(Id,RawTerm)] -> -- constructors->                  [(Id,RawTerm)] -> -- datatype local 'using'->                  Implicit -> UndoInfo -> UserOps -> -- global 'using'->                  [Decl] -> String -> Int ->->                  (Ctxt IvorFun, UserOps)-> addConEntries opt ctxt acc [] u using ui uo ds f l = mif opt ctxt acc using ui uo ds-> addConEntries opt ctxt acc ((cid, ty):cs) u using' ui uo ds f l->     = let using = using' -- No! params are implicit here. addParamName using' cid->           (tyraw, imp) = addImplWith (addUsing (Imp u [] [] (thisNamespace using)) using) (appCtxt ctxt acc) ty->           tytm = Annotation (FileLoc f l) $ makeIvorTerm using ui uo cid (appCtxt ctxt acc) tyraw->           acc' = addEntry acc (thisNamespace using) cid ->                      (IvorFun (Just (toIvorName (fullName using cid))) (Just tytm) (imp+length (params using')) (Just IDataCon) Constructor [] (getLazy ty) (getStatic ty)) in->           addConEntries opt ctxt acc' cs u using ui uo ds f l--Add definitions to the Ivor Context. Return the new context and a list-of things we need to define to complete the program (i.e. metavariables)--> data TryAdd = OK (Context, [(Name, ViewTerm)]) UserOps StaticUsed->             | Err (Context, [(Name, ViewTerm)]) UserOps StaticUsed String -- record how far we got--> addIvor :: [Opt] -> IdrisState ->->            Ctxt IvorFun -> -- all definitions, including prelude->            Ctxt IvorFun -> -- just the ones we haven't added to Ivor yet->            Context -> UserOps -> Statics -> StaticUsed -> TryAdd-> addIvor opts ist all defs ctxt uo sts stu ->             = addivs (ctxt, []) uo stu (ctxtAlist defs)->    where addivs acc fixes stu [] = OK acc fixes stu->          addivs acc fixes stu ((n, IvorProblem err):ds) ->                                  = Err acc fixes stu err->          addivs acc fixes stu (def@(_,ifn):ds) = ->              case addIvorDef opts ist all fixes acc def sts stu of->                 Right (ok, fixes, stu') -> addivs ok fixes stu' ds->                 Left err -> Err acc fixes stu (idrisError all (guessContext ifn err))--Add a definition to Ivor. UserOps have been finalised already, by makeIvorFuns,-except frozen things, which need to be added as we go, in order.--> addIvorDef :: [Opt] -> IdrisState ->->               Ctxt IvorFun -> UserOps -> (Context, [(Name, ViewTerm)]) -> ->               (Id, IvorFun) -> Statics -> StaticUsed -> ->               TTM ((Context, [(Name, ViewTerm)]), UserOps, StaticUsed)-> addIvorDef opt ist raw uo (ctxt, metas) (n,IvorFun name tyin _ def (LatexDefs _) _ _ _) sts stu->                = return ((ctxt, metas), uo, stu)-> addIvorDef opt ist raw (UO fix trans fr syns) (ctxt, metas) (n,IvorFun name tyin _ def f@(Fixity op assoc prec) _ _ _) sts stu->                = return ((ctxt, metas), UO fix trans fr syns, stu)-> addIvorDef opt ist raw (UO fix trans fr syns) (ctxt, metas) (n,IvorFun name tyin _ def f@(SynDef _ _ _) _ _ _) sts stu->                = return ((ctxt, metas), UO fix trans fr syns, stu)-> addIvorDef opt ist raw (UO fix trans fr syns) (ctxt, metas) (n,IvorFun name tyin _ def f@(Transform lhs rhs) _ _ _) sts stu->                = return ((ctxt, metas), UO fix trans fr syns, stu)-> addIvorDef opt ist raw (UO fix trans fr syns) (ctxt, metas) (n,IvorFun name tyin _ def f@(Freeze file line ns frfn) _ _ _) sts stu->        = case ctxtLookupName raw ns frfn of->            Right (_,fn') -> return ((ctxt, metas), UO fix trans (fn':fr) syns, stu)->            Left err -> Left (ErrContext (file ++ ":" ++ show line ++ ":") (Message (show err)))-> addIvorDef opt ist raw uo@(UO fix trans fr syns) (ctxt, metas) (n,IvorFun (Just name) tyin _ (Just def') _ flags lazy static) sts stu->   = let def = if (Verbose `elem` opt) ->                  then trace ("Processing " ++ show n) def' else def' in->       case def of->         PattDef ps -> -- trace (show (ps, getSpec flags fr)) $->                 do checkArgLengths (show n) ps->                    (ctxt, newdefs) <- addPatternDefSC ctxt name (unjust tyin) ps (getSpec flags fr) sts->                    -- Get the type checked version->                    (_, pdef) <- getPatternDef ctxt name->                    -- Generate some PE data from it->                    -- let (_, nds, stu', newts, newfs) = getNewDefs n sts ist raw stu (PattDef pdef)->                    -- (ctxt, uo, freeze) <- addPEdefs raw ctxt sts uo nds->                    if (null newdefs) then return ((ctxt, metas), uo, stu)->                      else do r <- addMeta (Verbose `elem` opt) raw ctxt metas newdefs->                              return (r, uo, stu)->->         SimpleDef tm -> ->                         do tm' <- case (getSpec flags fr) of->                              Nothing -> return tm->                              Just [] -> do ctm <- check ctxt tm->                                            let ans = view (evalnew ctxt ctm)->                                            return ans->                              Just specfns -> do ctm <- check ctxt tm->                                                 let ans = view (evalnewLimit ctxt ctm specfns)->                                                 return ans->                            ctxt <- case tyin of->                                 Nothing -> addDef ctxt name tm'->                                 Just ty -> addTypedDef ctxt name tm' ty->                            -- Get the type checked version->                            (_, pdef) <- getPatternDef ctxt name->                            -- Generate some PE data from it->                            let (_, nds, stu', newts, newfs) = getNewDefs n sts ist raw stu (PattDef pdef)->                            (ctxt, uo, freeze) <- addPEdefs raw ctxt sts uo nds->                            return ((ctxt, metas), uo, stu)->         LataDef -> case tyin of->                       Just ty -> do ctxt <- declareData ctxt name ty->                                     return ((ctxt, metas), uo, stu)->         DataDef ind e -> -- trace (show (ind, e)) $->                          do c <- addDataNoElim ctxt ind->                           -- add once to fill in placeholders->                             ctxt <- if e then do->                                     d <- getInductive c name ->                           -- add again after we work out the parameters->                                     addData ctxt (mkParams d)->                                  else return c->                             return ((ctxt, metas), uo, stu)->                           -- addDataNoElim ctxt (mkParams d)->                           -- trace (show (mkParams d)) $ return c->         IProof scr failable -> ->                do case runScript raw ctxt uo n scr of->                     Right ctxt -> do->                        return ((ctxt, filter (\ (x,y) -> x /= toIvorName n)->                                metas), uo, stu)--If the proof doesn't work, but it was just a guess in a [tryproof ...] block,-just silently discard it and leave it for the user to fill in later:-->                     Left err -> let ctxt' = if (Verbose `elem` opt) then->                                             trace (show n ++ " proof failed") ctxt else ctxt in->                                 if failable ->                                     then return ((ctxt', metas), uo, stu)->                                     else Left err->         Later -> case tyin of->                    Just ty -> do ctxt <- declare ctxt name ty->                                  return ((ctxt, metas), uo, stu)->                    Nothing -> fail $ "No type given for forward declared " ++ show n->         _ -> return ((ctxt, metas), uo, stu)->    where unjust (Just x) = x->          getSpec [] fr->             = Nothing->          getSpec (CGEval:_) fr ->             = Just (map (\x -> (toIvorName x, 0)) fr)->          getSpec (CGSpec ns:_) fr->             | NoSpec `elem` opt = Nothing->             | otherwise = Just $ (map (\ (x, i) -> (toIvorName x, i)) ns) ++->                              (map (\x -> (toIvorName x, 0)) fr)->          getSpec (_:ns) fr = getSpec ns fr--> checkArgLengths :: String -> Patterns -> TTM ()-> checkArgLengths n (Patterns cs) ->    = if (length (nub (map (length.arguments) cs)) <= 1)->         then return ()->         else ttfail $ "Differing numbers of arguments in clauses for " ++ n-
− Idris/PMComp.lhs
@@ -1,405 +0,0 @@-> {-# OPTIONS_GHC -fglasgow-exts #-}--> module Idris.PMComp(pmcomp,SimpleCase(..),CaseAlt(..)) where--Pattern matching compiler, convert to simple case expressions--> import Idris.AbsSyntax-> import Ivor.TT hiding (SimpleCase(..), CaseAlt(..))--> import Data.Typeable-> import Debug.Trace-> import Control.Monad.State-> import List hiding (partition)--Simple case statements are either a case analysis, just a term. ErrorCase -and Impossible are distinct in that 'Impossible' should be the default -fallthrough when a function is known to be total, and ErrorCAse otherwise.--> data SimpleCase = SCase ViewTerm [CaseAlt]->                 | Tm ViewTerm->                 | ErrorCase->                 | Impossible->    deriving (Show, Eq)--> data CaseAlt = Alt Name Int [Name] SimpleCase->              | ConstAlt Constant SimpleCase->              | Default SimpleCase->    deriving (Show, Eq)--> instance Ord CaseAlt where->   compare (Alt _ t _ _) (Alt _ u _ _) = compare t u->   compare (ConstAlt c _) (ConstAlt d _) = compare c d->   compare (Default _) (Default _) = EQ->   compare (Alt _ _ _ _) _ = LT->   compare (ConstAlt _ _) (Alt _ _ _ _) = GT->   compare (ConstAlt _ _) (Default _) = LT->   compare (Default _) _ = GT--> data CS = CS Int--> pmcomp :: Ctxt IvorFun -> Context -> ->           Bool -> -- erasure on->           Name -> ViewTerm -> Patterns -> ->           ([Name], SimpleCase)-> pmcomp raw ctxt erase n ty (Patterns ps) ->       = pm' n (map mkPat (deIOpats erase ps))->    where mkPat (PClause args _ rv) ->            = Clause (map (toPat ctxt) args) rv->          pm' n ps = evalState (doCaseComp raw ctxt ps) (CS 0)--It's easier if we can distinguish syntactically between constructor forms-and variables (and constants)--> data Pat = PCon Name Int [Pat]->          | PVar Name->          | PConst Constant->          | PNK Name Constant -- n+k pattern->          | PAny->   deriving Show--> data Clause = Clause [Pat] ViewTerm->   deriving Show--FIXME: If an argument is repeated in the patterns, turn the later ones-into underscores (since type checking will verify they are the same,-and if we don't matching can get confused).--> toPat :: Context -> ViewTerm -> Pat-> toPat ctxt tm = toPat' tm [] where->     toPat' (Name ty n) []->         | ty /= DataCon = PVar n->         | isVar n = PVar n->         | not (isCon n) = PAny->     toPat' (Name DataCon n) args ->         | isCon n = case getConstructorTag ctxt n of->                       Right i -> PCon n i args->                       Left _ -> error "Can't happen: no tag"->         | otherwise = error $ "Can't happen: variable applied to arguments " ++ show (n,args)->     toPat' (App (Name _ plus) (App (Name _ n) (Constant c))) []->         | plus == opFn Plus ->             = case (cast c)::Maybe Int of->                   Just i -> PNK n (Num i)->                   Nothing -> PAny->     toPat' (App f a) args = toPat' f ((toPat' a []):args)->     toPat' (Constant c) []->             = case (cast c)::Maybe Int of->                   Just i -> PConst (Num i)->                   Nothing -> ->                      case (cast c)::Maybe String of->                         Just s -> PConst (Str s)->                         Nothing ->->                             case (cast c)::Maybe Char of->                               Just c -> PConst (Num (fromEnum c))->     toPat' (Constant _) args ->                = error "Can't happen: constant applied to arguments"->     toPat' _ _ = PAny-->     isVar n = case nameType ctxt n of->                 Left _ -> True->                 Right Bound -> True->                 _ -> False->     isCon n = case nameType ctxt n of->                 Right DataCon -> True->                 _ -> False--> isVarPat (Clause ((PVar _):ps) _) = True-> isVarPat (Clause (PAny:ps) _) = True-> isVarPat _ = False--> isConPat (Clause ((PCon _ _ _):ps) _) = True-> isConPat (Clause ((PConst _):ps) _) = True-> isConPat _ = False--> data Partition = Cons [Clause]->                | Vars [Clause]--> partition :: Ctxt IvorFun -> Context -> [Clause] -> [Partition]-> partition raw ctxt [] = []-> partition raw ctxt ms@(m:_)->    | isVarPat m = let (vars, rest) = span isVarPat ms in->                            (Vars vars):partition raw ctxt rest ->    | isConPat m = let (cons, rest) = span isConPat ms in->                            (Cons cons):(partition raw ctxt rest)-> partition raw ctxt x = error (show x)--> doCaseComp :: Ctxt IvorFun -> Context ->->               [Clause] -> State CS ([Name], SimpleCase)-> doCaseComp raw ctxt cs = do vs <- newVars cs->                             let (cs', vs') = reOrder cs vs->                             sc <- match raw ctxt (map mkVT vs') cs' ErrorCase->                             -- return names in original order (this is the->                             -- argument list we're making)->                             return (map (name.show) vs, sc)->    where newVars [] = return []->          newVars ((Clause ps _):_)->               = do CS i <- get->                    put (CS (i+(length ps)))->                    return $ map (MN "cvar") [i..(i+(length ps)-1)]->          mkVT x = Name Unknown (name (show x))--Reorder variables so that one with most disjoint cases is first.-(Actually, quick hack, just reverse them, since then the dependent things-will at least be looked at last, and we'll be matching on the real arguments-rather than indices.)-->          reOrder cs vs = let djs = (reverse.sort.(mapI 0 dj).transpose.allArgs) cs in->                              (pickAll (map snd djs) cs, pick (map snd djs) vs)->          pickAll _ [] = []->          pickAll djs ((Clause args rest):cs) ->                       = (Clause (pick djs args) rest):(pickAll djs cs)->          allArgs [] = []->          allArgs ((Clause args rest):cs) = args:(allArgs cs)-->          pick [] _ = []->          pick (i:is) xs = if (i<length xs) then xs!!i : (pick is xs)->                              else error ("ARGH! pick " ++ show (i,xs,cs))--Count the number of different constructor forms in xs-->          dj xs = dj' [] xs->          dj' acc [] = length (nub acc)->          dj' acc (PCon n i p:xs) = dj' (n:acc) xs->          dj' acc (_:xs) = dj' acc xs-->          mapI i f [] = []->          mapI i f (x:xs) = (f x, i):(mapI (i+1) f xs)--> match :: Ctxt IvorFun -> Context -> ->          [ViewTerm] -> -- arguments->          [Clause] -> -- clauses->          SimpleCase -> -- fallthrough (error case)->          State CS SimpleCase-> match raw ctxt [] ((Clause [] ret):_) err ->           = return $ Tm ret -- run out of arguments-> match raw ctxt vs cs err ->       = mixture raw ctxt vs (partition raw ctxt cs) err--> mixture :: Ctxt IvorFun -> Context -> ->            [ViewTerm] ->->            [Partition] -> SimpleCase -> State CS SimpleCase-> mixture raw ctxt vs [] err = return err-> mixture raw ctxt vs ((Cons ms):ps) err ->     = do fallthrough <- (mixture raw ctxt vs ps err)->          conRule raw ctxt vs ms fallthrough-> mixture raw ctxt vs ((Vars ms):ps) err ->     = do fallthrough <- (mixture raw ctxt vs ps err)->          varRule raw ctxt vs ms fallthrough--In the constructor rule:--For each distinct constructor (or constant) create a group of possible-patterns in ConType and Group--> data ConType = CName Name Int -- ordinary named constructor->              | CConst Constant -- constant pattern->    deriving (Show, Eq)--> data Group = ConGroup ConType -- constructor->              -- arguments and rest of alternative for each instance->                    [([Pat], Clause)] ->    deriving Show---> conRule :: Ctxt IvorFun -> Context -> [ViewTerm] ->->            [Clause] -> SimpleCase -> State CS SimpleCase-> conRule raw ctxt (v:vs) cs err = ->    do groups <- groupCons cs->       caseGroups raw ctxt (v:vs) groups err--> caseGroups :: Ctxt IvorFun -> Context -> [ViewTerm] ->->               [Group] -> SimpleCase ->->               State CS SimpleCase-> caseGroups raw ctxt (v:vs) gs err->    = do g <- altGroups gs->         return $ SCase v g->   where altGroups [] = return [Default err]->         altGroups ((ConGroup (CName n i) args):cs)->           = do g <- altGroup n i args->                rest <- altGroups cs->                return (g:rest)->         altGroups ((ConGroup (CConst cval) args):cs)->           = do g <- altConstGroup cval args->                rest <- altGroups cs->                return (g:rest)-->         altGroup n i gs ->            = do (newArgs, nextCs) <- argsToAlt gs->                 matchCs <- match raw ctxt (map (Name Unknown) newArgs++vs)->                                           nextCs err->                 return $ Alt n i newArgs matchCs->         altConstGroup n gs->            = do (_, nextCs) <- argsToAlt gs->                 matchCs <- match raw ctxt vs nextCs err->                 return $ ConstAlt n matchCs--Find out how many new arguments we need to generate for the next step-of matching (since we're going to be matching further on the arguments-of each group for the constructor, and we'll need to give them names)--Return the new variables we've added to do case analysis on, and the-new set of clauses to match.--> argsToAlt :: [([Pat], Clause)] -> State CS ([Name], [Clause])-> argsToAlt [] = return ([],[])-> argsToAlt rs@((r,m):_) ->       = do newArgs <- getNewVars r->            -- generate new match alternatives, by combining the arguments->            -- matched on the constructor with the rest of the clause->            return (newArgs, addRs rs)->     where getNewVars [] = return []->           getNewVars ((PVar n):ns) = do nsv <- getNewVars ns->                                         return (n:nsv)->           getNewVars (_:ns) = do v <- getVar->                                  nsv <- getNewVars ns->                                  return (v:nsv)->           addRs [] = []->           addRs ((r,(Clause ps res) ):rs)->               = (Clause (r++ps) res):(addRs rs)--> getVar :: State CS Name-> getVar = do (CS var) <- get->             put (CS (var+1))->             return (name (show (MN "pvar" var)))--> groupCons :: Monad m => [Clause] -> m [Group]-> groupCons cs = gc [] cs->    where gc acc [] = return acc->          gc acc ((Clause (p:ps) res):cs) = do->            acc' <- addGroup p ps res acc->            gc acc' cs-->          addGroup p ps res acc = case p of->             PCon con i args -> return $ addg con i args (Clause ps res) acc->             PConst cval -> return $ addConG cval (Clause ps res) acc->             pat -> fail $ show pat ++ " is not a constructor or constant (can't happen)"-          ->          addg con i conargs res [] ->                   = [ConGroup (CName con i) [(conargs, res)]]->          addg con i conargs res (g@(ConGroup (CName n j) cs):gs)->               | i == j = (ConGroup (CName n i) (cs ++ [(conargs, res)])):gs->               | otherwise = g:(addg con i conargs res gs)-->          addConG con res [] = [ConGroup (CConst con) [([],res)]]->          addConG con res (g@(ConGroup (CConst n) cs):gs)->               | con == n = (ConGroup (CConst n) (cs ++ [([], res)])):gs->               | otherwise = g:(addConG con res gs)--In the variable rule:--case v args of-   p pats -> r1-   ...-   pn patsn -> rn--====>--case args of-   pats -> r1[p/v]-   ...-   patsn -> rn[p/v]--> varRule :: Ctxt IvorFun -> Context -> [ViewTerm] ->->            [Clause] -> SimpleCase -> State CS SimpleCase-> varRule raw ctxt (v:vs) alts err = do->     let alts' = map (repVar v) alts->     match raw ctxt vs alts' err->   where repVar v (Clause ((PVar p):ps) res) ->                    = let nres = subst p v res in->                      {- trace (show v ++ " for " ++ dbgshow p ++ " in " ++ show res ++ " gives " ++ show nres) $ -}->                          Clause ps nres->         repVar v (Clause (PAny:ps) res) = Clause ps res----Remove IO gubbins, make actions and ordering explicit--bind : IO A -> (A -> IO B) -> IO B-becomes -bind : A -> (A -> B) -> B--bind _ _ val fn ==> let newv = [[val]]-                        in [[fn newv]]--similarly for unsafeBind-unsafePerformIO becomes id--IOReturn _ a ==> [[a]]-IODo _ c k ==> [[k]] [[c]]--FIXME: Currently requires bind, iodo, etc to be fully applied. Need -intermediate functions for when this isn't the case--> bname i = name (show (MN "bname" i))--We don't care about the bound argument names any more, so don't bother deIOing-them, just put an empty list in.--> deIOpats :: Bool -> [PClause] -> [PClause]-> deIOpats erase cs = evalState (dp cs) 0->     where dp [] = return []->           dp ((PClause args _ rv):ps) = do args' <- mapM (deIO erase) args->                                            rv' <- deIO erase rv->                                            ps' <- dp ps->                                            return ((PClause args' [] rv'):ps')--> deIO :: Bool -> ViewTerm -> State Int ViewTerm-> deIO erase t = deIO' t where-->  deIO' (App (App (App (App (Name _ bind) _) _) v) k)->      | bind == bindNamei || ->        bind == ibindNamei->           = do i <- get->                put (i+1)->                v' <- deIO' v->                k' <- deIO' k->                return $ Let (bname i) Star -- type irrelevant->                          (App (App (Name Unknown (name "__effect")) Placeholder) v')->                              (quickSimpl (App k' (Name Unknown (bname i))))->      | bind == (name "unsafeBind") ->           = do i <- get->                put (i+1)->                return $ Let (bname i) Star -- type irrelevant->                             v (quickSimpl (App k (Name Unknown (bname i))))->  deIO' (App (App (Name _ ret) _) a) -- (without forcing)->      | (not erase) && ret == ioretNamei = deIO' a->  deIO' (App (Name _ ret) a) -- (with forcing)->      | erase && ret == ioretNamei = deIO' a->  deIO' (App (App (Name _ upio) _) a)->      | upio == (name "unsafePerformIO") = deIO' a->  deIO' (App (App (Name _ iolift) _) io)->      | iolift == ioliftNamei  -- Just skip this->         = deIO' io->  deIO' (App (App (App (Name _ iodo) _) c) k) -- (without forcing)->      | (not erase) && iodo == iodoNamei->         = do k' <- deIO' k->              c' <- deIO' c->              i <- get->              put (i+1)->              return $ Let (bname i) Star->                         (App (App (Name Unknown (name "__effect")) Placeholder) c')->                            (quickSimpl (App k' (Name Unknown (bname i))))->  deIO' (App (App (Name _ iodo) c) k) -- (with forcing)->      | erase && iodo == iodoNamei->         = do k' <- deIO' k->              c' <- deIO' c->              i <- get->              put (i+1)->              return $ Let (bname i) Star->                         (App (App (Name Unknown (name "__effect")) Placeholder) c')->                           (quickSimpl (App k' (Name Unknown (bname i))))->  deIO' (App f a) = do f' <- deIO' f->                       a' <- deIO' a->                       return (App f' a')->  deIO' (Lambda n ty sc) = do sc' <- deIO' sc->                              return (Lambda n ty sc')->  deIO' (Let n ty v sc) = do v' <- deIO' v->                             sc' <- deIO' sc->                             return (Let n ty v' sc')->  deIO' x = return x--Simplify the common case in bind/IODo--> quickSimpl (App (Lambda x ty sc) val)->    = subst x val sc-> quickSimpl x = x
− Idris/Parser.y
@@ -1,833 +0,0 @@-{ -- -*-Haskell-*--{-# OPTIONS_GHC -fglasgow-exts #-}--module Idris.Parser where--import Data.Char-import Ivor.TT-import System.IO.Unsafe-import List-import Control.Monad--import Idris.AbsSyntax-import Idris.Lexer-import Idris.Lib--import Debug.Trace--}--%name mkparse Program-%name mkparseTerm Term-%name mkparseTactic Tactic--%tokentype { Token }-%monad { P } { thenP } { returnP }-%lexer { lexer } { TokenEOF }---- %expect 0--%token-      name            { TokenName $$ }-      userinfix       { TokenInfixName $$ }-      brackname       { TokenBrackName $$ }-      string          { TokenString $$ }-      int             { TokenInt $$ }-      float           { TokenFloat $$ }-      char            { TokenChar $$ }-      bool            { TokenBool $$ }-      metavar         { TokenMetavar $$ }-      ':'             { TokenColon }-      ';'             { TokenSemi }-      '|'             { TokenBar }-      stars           { TokenStars }-      '\\'            { TokenLambda }-      hashbrack       { TokenHashOB }-      '('             { TokenOB }-      ')'             { TokenCB }-      '{'             { TokenOCB }-      '}'             { TokenCCB }-      '['             { TokenOSB }-      ']'             { TokenCSB }-      oid             { TokenOId }-      cid             { TokenCId }-      lpair           { TokenLPair }-      rpair           { TokenRPair }-      exists          { TokenExists }-      '~'             { TokenTilde }-      '+'             { TokenPlus }-      '-'             { TokenMinus }-      '*'             { TokenTimes }-      '/'             { TokenDivide }-      '='             { TokenEquals }-      mightbe         { TokenMightEqual }-      '<'             { TokenLT }-      '>'             { TokenGT }-      ellipsis        { TokenEllipsis }-      '_'             { TokenUnderscore }-      ','             { TokenComma }-      '&'             { TokenTuple }-      '!'             { TokenBang }-      concat          { TokenConcat }---      eq              { TokenEQ }-      ge              { TokenGE }-      le              { TokenLE }-      or              { TokenOr }-      and             { TokenAnd }-      arrow           { TokenArrow }-      fatarrow        { TokenFatArrow }-      transarrow      { TokenTransArrow }-      leftarrow       { TokenLeftArrow }-      inttype         { TokenIntType }-      chartype        { TokenCharType }-      floattype       { TokenFloatType }-      stringtype      { TokenStringType }-      handletype      { TokenHandleType }-      ptrtype         { TokenPtrType }-      locktype        { TokenLockType }-      type            { TokenType }-      ltype           { TokenLType }-      lazybracket     { TokenLazyBracket }-      data            { TokenDataType }-      codata          { TokenCoDataType }-      infix           { TokenInfix }-      infixl          { TokenInfixL }-      infixr          { TokenInfixR }-      using           { TokenUsing }-      idiom           { TokenIdiom }-      params          { TokenParams }-      namespace       { TokenNamespace }-      public          { TokenPublic }-      private         { TokenPrivate }-      abstract        { TokenAbstract }-      noelim          { TokenNoElim }-      collapsible     { TokenCollapsible }-      where           { TokenWhere }-      with            { TokenWith }-      partial         { TokenPartial }-      syntax          { TokenSyntax }-      hide            { TokenHide }-      lazy            { TokenLazy }-      static          { TokenStatic }-      refl            { TokenRefl }-      empty           { TokenEmptyType }-      unit            { TokenUnitType }-      include         { TokenInclude }-      export          { TokenExport }-      inline          { TokenInline }-      do              { TokenDo }-      return          { TokenReturn }-      if              { TokenIf }-      then            { TokenThen }-      else            { TokenElse }-      let             { TokenLet }-      in              { TokenIn }-      proof           { TokenProof }-      try             { TokenTryProof }-      intro           { TokenIntro }-      refine          { TokenRefine }-      generalise      { TokenGeneralise }-      reflp           { TokenReflP }-      rewrite         { TokenRewrite }-      rewriteall      { TokenRewriteAll }-      compute         { TokenCompute }-      unfold          { TokenUnfold }-      undo            { TokenUndo }-      induction       { TokenInduction }-      fill            { TokenFill }-      trivial         { TokenTrivial }-      simplesearch    { TokenSimpleSearch }-      mktac           { TokenMkTac }-      believe         { TokenBelieve }-      use             { TokenUse }-      decide          { TokenDecide }-      abandon         { TokenAbandon }-      proofterm       { TokenProofTerm }-      qed             { TokenQED }-      latex           { TokenLaTeX }-      nocg            { TokenNoCG }-      eval            { TokenEval }-      spec            { TokenSpec }-      freeze          { TokenFreeze }-      thaw            { TokenThaw }-      transform       { TokenTransform }-      cinclude        { TokenCInclude }-      clib            { TokenCLib }--%nonassoc LAM-%nonassoc let in-%nonassoc '!' '@'-%nonassoc NEG-%left or-%left and '&'-%left '=' -- eq-%left userinfix-%left '<' le '>' ge-%left '+' '-'-%left '*' '/'-%left concat-%left '\\'-%right arrow-%left '(' '{' lazybracket '['-%nonassoc '.'-%right IMP-%nonassoc CONST--- All the things I don't want to cause a reduction inside a lam...-%nonassoc name inttype chartype floattype stringtype int char string float bool refl do type ltype-          empty unit '_' ptrtype handletype locktype metavar NONE brackname lazy-          oid '~' lpair PAIR return transarrow exists proof-%left APP-%nonassoc if then else--%%--Program :: { [ParseDecl] }-Program: { [] }-       | Declaration Program { $1:$2 }-       | Fixity Program { map RealDecl $1 ++ $2 }-       | include string ';' Program { RealDecl (PInclude $2) : $4 }--{--{%-	     let rest = $4 in-	     let pt = unsafePerformIO (readLib defaultLibPath $2) in-		case (mkparse pt $2 1 []) of-		   Success x -> returnP (x ++ rest)-		   Failure err file ln -> failP err-	  }--}--Declaration :: { ParseDecl }-Declaration: Function { $1 }-           | Datatype { RealDecl (DataDecl $1) }-           | Latex { RealDecl $1 }-           | freeze name File Line ';' { RealDecl (Freeze $3 $4 [] $2) }-           | Using '{' Program '}' { PUsing $1 $3 }-           | DoUsing '{' Program '}' { PDoUsing $1 $3 } -           | Idiom '{' Program '}' { PIdiom $1 $3 }-           | Params '{' Program '}' { PParams $1 $3 }-           | Namespace '{' Program '}' { PNamespace $1 $3 }-           | Transform { RealDecl $1 }-           | syntax Name NamesS '=' Term ';' { RealDecl (SynDef $2 $3 $5) }-           | hide Name File Line ';'-                 { RealDecl (SynDef $2 [] (RVar $3 $4 (mkhidden $2) Unknown)) }-           | cinclude string { RealDecl (CInclude $2) }-           | clib string { RealDecl (CLib $2) }--Transform :: { Decl }-Transform : transform Term fatarrow Term ';' { Transform $2 $4 }--Function :: { ParseDecl }-Function : Name ':' Type ';' Flags File Line { FunType $1 $3 (nub $5) $6 $7 }-         | Name ProofScript ';' { ProofScript $1 $2 }---         | DefTerm '=' Term Flags ';' { FunClause (mkDef $1) [] $3 $4 }-         | DefTerm WithTerms WithP Term '{' Functions '}' File Line-              { WithClause (mkDef $8 $9 $1) $2 $3 $4 $6 }-         | DefTerm WithTerms mightbe Term ';' '[' Name ']' File Line-              { FunClauseP (mkDef $9 $10 $1) $2 $4 $7 }-         | DefTerm WithTerms '=' Term ';' Flags File Line -              { FunClause (mkDef $7 $8 $1) $2 $4 (nub $6) }-         | '|' WithTerm '=' Term ';' { FunClause RPlaceholder [$2] $4 [] }-         | '|' WithTerm mightbe Term ';' '[' Name ']' -              { FunClauseP RPlaceholder [$2] $4 $7 }-         | '|' WithTerm WithP Term '{' Functions '}'-              { WithClause RPlaceholder [$2] $3 $4 $6 }--Visibility :: { CGFlag }-Visibility : public { Vis Public }-           | private { Vis Private }-           | abstract { Vis Abstract }-           | { Vis Public }--WithP :: { Bool }-WithP : with { False }-      | with proof { True }--WithTerms :: { [RawTerm] }-WithTerms : '|' WithTerm WithTerms { $2:$3 }-          | { [] }--WithTerm :: { RawTerm }-WithTerm : SimpleAppTerm { $1 }-         | SigmaTerm { $1 }-         | '(' Term ')' { $2 }-         | '(' TermList ')' File Line { pairDesugar $4 $5 (RVar $4 $5 (UN "mkPair") Unknown) $2 }--Functions :: { [ParseDecl] }-Functions : Function Functions { $1:$2 }-          | Function { [$1] }--Flags :: { [CGFlag] }-Flags : '[' FlagList ']' { $2 }-      | { [] }--FlagList :: { [CGFlag] }-FlagList : { [] }-      | Flag FlagList { $1 ++ $2 }--Flag :: { [CGFlag] }-Flag : nocg { [NoCG] }-     | eval { [CGEval, Inline] }-     | spec '(' NameInts ')' { [CGSpec $3] }-     | spec { [CGSpec []] }-     | inline { [Inline] }-     | export string { [CExport $2] }----         | Nameproof Script { ProofScript $2 }----         | proof '{' Tactics '}' { error "Foo" }---- Tactics :: { [(ITactic] }--- Tactics : ----         | Name '=' Term ';' { RealDecl (TermDef $1 $3) }--Fixity :: { [Decl] }-Fixity : FixDec int UserInfixes ';' { map (\x -> Fixity x $1 $2) $3 }--UserInfixes :: { [String] }-UserInfixes : UserInfix { [$1] }-            | UserInfix ',' UserInfixes { $1:$3 }---- some annoying special cases so we can have operators with other meanings.--UserInfix :: { String }-UserInfix : userinfix { $1 }-          | '-' { "-" }-          | '<' { "<" }-          | '>' { ">" }--FixDec :: { Fixity }-FixDec : infixl { LeftAssoc }-       | infixr { RightAssoc }-       | infix { NonAssoc }--Latex :: { Decl }-Latex : latex '{' LatexDefs '}' { LatexDefs $3 }--LatexDefs :: { [(Id,String)] }-LatexDefs : Name '=' string { [($1,$3)] }-          | Name '=' string ',' LatexDefs { ($1,$3):$5 }--DefTerm :: { (Id, [(RawTerm, Maybe Id)]) }-DefTerm : Name ArgTerms { ($1, $2) }--ArgTerms :: { [(RawTerm,Maybe Id)] }-ArgTerms : { [] }-      | NoAppTerm ArgTerms { ($1,Nothing):$2 }-      | brackname '}' ArgTerms File Line { (RVar $4 $5 $1 Unknown, Just $1):$3 }-      | brackname '=' Term '}' ArgTerms { ($3, Just $1):$5 }--Datatype :: { Datatype }-Datatype : Data DataOpts Name DefinedData File Line-             { mkDatatype $1 $5 $6 $3 $4 $2 }--Data :: { Bool }-Data : data { False }-     | codata { True }--DefinedData :: { Either RawTerm ((RawTerm, [(Id, RawTerm)]), [ConParse]) }-DefinedData : DType Constructors ';' { Right ($1,$2) }-            | ':' Type ';' { Left $2 }-            | ';' File Line { Left (RConst $2 $3 TYPE) }---- Currently just whether to generate an elim rule, this'll need to be--- a list of options if we ever expand this.--DataOpts :: { [TyOpt] }-DataOpts : { [] }-         | '[' DataOptList ']' { $2 }--DataOptList :: { [TyOpt] }-DataOptList : DataOpt { [$1] }-            | DataOpt ',' DataOptList { $1:$3 }--DataOpt :: { TyOpt }-DataOpt : noelim { NoElim }-        | collapsible { Collapsible }--Name :: { Id }-Name : name { $1 }-     | '(' UserInfix ')' { useropFn $2 }--SimpleAppTerm :: { RawTerm }-SimpleAppTerm : SimpleAppTerm File Line NoAppTerm  %prec APP { RApp $2 $3 $1 $4 }-              | SimpleAppTerm ImplicitTerm '}' File Line %prec APP -                   { RAppImp $4 $5 (fst $2) $1 (snd $2) }-              | Name File Line { RVar $2 $3 $1 Unknown }-              | Constant File Line { RConst $2 $3 $1 }-              | '_' { RPlaceholder }-              | empty File Line { RVar $2 $3 (UN "__Empty") TypeCon }-              | unit File Line { RVar $2 $3 (UN "__Unit") TypeCon }--Term :: { RawTerm }-Term : NoAppTerm { $1 }-     | hashbrack Type ')' { $2 }-     | Term File Line NoAppTerm  %prec APP { RApp $2 $3 $1 $4 }-     | Term ImplicitTerm '}' File Line %prec APP -                   { RAppImp $4 $5 (fst $2) $1 (snd $2) }-     | lazy Term File Line { RApp $3 $4 (RApp $3 $4 (RVar $3 $4 (UN "__lazy") Free) RPlaceholder) $2 }-     | '\\' Binds fatarrow Term %prec LAM-                { doBind Lam $2 $4 }-     | let LetBinds in Term-                { doLetBind $2 $4 }-     | InfixTerm { $1 }-     | if Term then Term else Term File Line-       { mkApp $7 $8 (RVar $7 $8 (UN "if_then_else") Free) [$2,$4,$6] }--Binds :: { [(Id, RawTerm)] }-Binds : Name MaybeType { [($1,$2)] }-      | Name MaybeType ',' Binds { ($1,$2):$4 }--TypedBinds :: { [(Id, RawTerm)] }-TypedBinds : TypedBind ',' TypedBinds { $1 ++ $3 }-           | TypedBind { $1 }--TypedBind :: { [(Id, RawTerm)] }-TypedBind : Name ':' Type { map ( \x -> (x,$3)) [$1] }--Names :: { [Id] }-Names : Name { [$1] }-      | Name ',' Names { $1:$3 }--NameInts :: { [(Id, Int)] }-NameInts : Name int { [($1,$2)] }-         | Name { [($1, 0)] }-         | Name ',' NameInts { ($1,0):$3 }-         | Name int ',' NameInts { ($1,$2):$4 }--BrackNames :: { [Id] }-BrackNames : brackname { [$1] }-      | brackname ',' Names { $1:$3 }--NamesS :: { [Id] }-NamesS : { [] }-       | Name NamesS { $1:$2 }--LetBinds :: { [(Id, RawTerm, RawTerm)] }-LetBinds : Name MaybeType '=' Term { [($1,$2,$4)] }-         | Name MaybeType '=' Term ',' LetBinds { ($1,$2,$4):$6 }--ImplicitTerm :: { (Id, RawTerm) }-ImplicitTerm : brackname File Line { ($1, RVar $2 $3 $1 Unknown) }-             | brackname '=' Term { ($1, $3) }--InfixTerm :: { RawTerm }-InfixTerm : '-' Term File Line %prec NEG { RInfix $3 $4 Minus (RConst $3 $4 (Num 0)) $2 }---          | Term '+' Term File Line { RInfix $4 $5  Plus $1 $3 }-          | Term '-' Term File Line %prec userinfix { RUserInfix $4 $5 False "-" $1 $3 }---          | Term '*' Term File Line { RInfix $4 $5  Times $1 $3 }---          | Term '/' Term File Line { RInfix $4 $5  Divide $1 $3 }---          | Term and Term File Line { RInfix $4 $5  OpAnd $1 $3 }-          | Term '&' Term File Line { mkApp $4 $5 (RVar $4 $5 (UN "Pair") TypeCon) [$1, $3] }---          | Term or Term File Line { RInfix $4 $5  OpOr $1 $3 }---          | Term concat Term File Line { RInfix $4 $5  Concat $1 $3 }---          | Term eq Term File Line { RInfix $4 $5  OpEq $1 $3 }-          | Term '<' Term File Line { RUserInfix $4 $5 False "<" $1 $3 }---          | Term le Term File Line { RInfix $4 $5  OpLEq $1 $3 }-          | Term '>' Term File Line { RUserInfix $4 $5 False ">" $1 $3 }---          | Term ge Term File Line { RInfix $4 $5  OpGEq $1 $3 }-          | Term arrow Term File Line { RBind (MN "X" 0) (Pi Ex [] $1) $3 }-          | UserInfixTerm { $1 }-          | NoAppTerm '=' NoAppTerm File Line { RInfix $4 $5 JMEq $1 $3 }--UserInfixTerm :: { RawTerm }-UserInfixTerm : Term userinfix Term File Line { RUserInfix $4 $5 False $2 $1 $3 }--Section :: { RawTerm }-Section : '(' userinfix Term File Line ')'-               { RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix $4 $5 False $2 (RVar $4 $5 (MN "X" 0) Unknown) $3) }-        | '(' Term userinfix File Line ')'-               { RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix $4 $5 False $3 $2 (RVar $4 $5 (MN "X" 0) Unknown)) }-        | '(' BuiltinOp Term File Line ')'-               { RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix $4 $5 False $2 (RVar $4 $5 (MN "X" 0) Unknown) $3) }-        | '(' Term BuiltinOp File Line ')'-               { RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix $4 $5 False $3 $2 (RVar $4 $5 (MN "X" 0) Unknown)) }-        | '(' Term '-' File Line ')'-               { RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix $4 $5 False "-" $2 (RVar $4 $5 (MN "X" 0) Unknown)) }---- Special cases for ->--        | '(' Term arrow File Line ')'-               { RBind (MN "X" 0) (Lam RPlaceholder) -                       (RBind (MN "X" 1) (Pi Ex [] $2) (RVar $4 $5 (MN "X" 0) Unknown)) }-        | '(' arrow Term File Line ')'-               { RBind (MN "X" 0) (Lam RPlaceholder) -                       (RBind (MN "X" 1) (Pi Ex [] (RVar $4 $5 (MN "X" 0) Unknown)) $3) }       -        | '(' arrow File Line ')'-               { RBind (MN "X" 0) (Lam RPlaceholder)-                       (RBind (MN "X" 1) (Lam RPlaceholder)-                    (RBind (MN "X" 2) (Pi Ex [] (RVar $3 $4 (MN "X" 0) Unknown))-                       (RVar $3 $4 (MN "X" 1) Unknown))) }-- -- Special cases for pairing--        | '(' ',' File Line ')' -              {  RBind (MN "X" 0) (Lam RPlaceholder)-                   (RBind (MN "X" 1) (Lam RPlaceholder)-                       (pairDesugar $3 $4 (RVar $3 $4 (UN "mkPair") DataCon)-                                    [RVar $3 $4 (MN "X" 0) Unknown,-                                     RVar $3 $4 (MN "X" 1) Unknown])) }-        | '(' Term ',' File Line ')' -              {  RBind (MN "X" 0) (Lam RPlaceholder)-                       (pairDesugar $4 $5 (RVar $4 $5 (UN "mkPair") DataCon)-                                    [$2,-                                     RVar $4 $5 (MN "X" 0) Unknown]) }-        | '(' ',' Term File Line ')' -              {  RBind (MN "X" 0) (Lam RPlaceholder)-                       (pairDesugar $4 $5 (RVar $4 $5 (UN "mkPair") DataCon)-                                    [RVar $4 $5 (MN "X" 0) Unknown, $3]) }---BuiltinOp :: { String }-BuiltinOp : '<' { "<" }-          | '>' { ">" }--MaybeType :: { RawTerm }-MaybeType : { RPlaceholder}-          | ':' TypeTerm { $2 }--MaybeAType :: { RawTerm }-MaybeAType : { RPlaceholder}-          | ':' TypeTerm { $2 }---- Term representing a type may begin with implicit argument list--Type :: { RawTerm }-Type : BrackNames MaybeAType '}' arrow Type-               { doBind (Pi Im []) (map (\x -> (x, $2)) $1) $5 }-     | TypeTerm { $1 }--TypeTerm :: { RawTerm }-TypeTerm : TypeTerm arrow TypeTerm { RBind (MN "X" 0) (Pi Ex [] $1) $3 }-         | '(' TypedBinds ')' ArgOpts arrow TypeTerm-                { doBind (Pi Ex $4) $2 $6 }-         | lazybracket TypedBinds ')' arrow TypeTerm-                { doBind (Pi Ex [Lazy]) $2 $5 }-         | '(' TypeTerm ')' { bracket $2 }-         | '(' TypeTerm '=' TypeTerm File Line ')' { RInfix $5 $6 JMEq $2 $4 }-         | SimpleAppTerm { $1 }-         | hashbrack Term ')' { $2 }-         | TypeTerm userinfix TypeTerm File Line { RUserInfix $4 $5 False $2 $1 $3 }-         | TypeTerm '-' TypeTerm File Line { RUserInfix $4 $5 False "-" $1 $3 }-         | '(' TypeList ')' File Line { pairDesugar $4 $5 (RVar $4 $5 (UN "Pair") TypeCon) $2 }-         | SigmaType { $1 }--ArgOpt :: { ArgOpt }-ArgOpt : lazy { Lazy }-       | static { Static }--ArgOpts :: { [ArgOpt] }-ArgOpts : '[' ArgOptList ']' { $2 }-        | { [] }--ArgOptList :: { [ArgOpt] }-ArgOptList : ArgOpt ',' ArgOptList { $1:$3 }-           | ArgOpt { [$1] }--SigmaType :: { RawTerm }-SigmaType : '(' Name MaybeType stars TypeTerm ')' File Line -                  { sigDesugar $7 $8 ($2, $3) $5 }---          | exists Name MaybeType fatarrow SimpleAppTerm File Line---                  { sigDesugar $6 $7 ($2, $3) $5 }--TypeList :: { [RawTerm] }-         : TypeTerm '&' TypeTerm { $1:$3:[] }-         | TypeTerm '&' TypeList { $1:$3 }--NoAppTerm :: { RawTerm }-NoAppTerm : Name File Line { RVar $2 $3 $1 Unknown }-          | return File Line { RReturn $2 $3 }-          | '(' Term ')' { bracket $2 }-          | '~' NoAppTerm { RPure $2 }-          | metavar { RMetavar $1 }-          | '[' proof Tactics ']' { RMetavarPrf (UN "") $3 False }-          | '[' try Tactics ']' { RMetavarPrf (UN "") $3 True }-          | '!' Name File Line { RExpVar $3 $4 $2 }---          | '{' TypedBind '}' arrow NoAppTerm---                { doBind (Pi Im) $2 $5 }-          | Constant File Line { RConst $2 $3 $1 }-          | refl { RRefl }-          | empty File Line { RVar $2 $3 (UN "__Empty") TypeCon }-          | unit File Line { RVar $2 $3 (UN "__Unit") TypeCon }-          | '_' { RPlaceholder }-          | DoBlock { RDo $1 }-          | oid Term cid { RIdiom $2 }-          | '(' TermList ')' File Line { pairDesugar $4 $5 (RVar $4 $5 (UN "mkPair") DataCon) $2 }---          | '[' TermList ']' File Line { pairDesugar $4 $5 (RVar $4 $5 (UN "Exists")) $2 }---          | '(' TypeList ')' File Line { pairDesugar $4 $5 (RVar $4 $5 (UN "Pair")) $2 }-          | SigmaType { $1 } -          | Section { $1 }-          | SigmaTerm { $1 }-          | '[' File Line TermListZ ']' { mkConsList $2 $3 $4 }--SigmaTerm :: { RawTerm }-SigmaTerm : lpair Term ',' Term rpair File Line %prec PAIR-                { RApp $6 $7 (RApp $6 $7 (RVar $6 $7 (UN "Exists") DataCon) $2) $4 }-          | lpair Term rpair File Line %prec PAIR-                { RApp $4 $5 (RApp $4 $5 (RVar $4 $5 (UN "Exists") DataCon) RPlaceholder) $2 }--TermList :: { [RawTerm] }-         : Term ',' Term { $1:$3:[] }-         | Term ',' TermList { $1:$3 }--TermListZ :: { [RawTerm] }-         : { [] }-         | Term { [$1] }-         | Term ',' TermListZ { $1:$3 }---DoBlock :: { [Do] }-DoBlock : do '{' DoBindings '}' { $3 }--- Next rule is a TMP HACK! So that we can open brackets then have a name immediately.-        | do brackname MaybeType leftarrow Term File Line ';' DoBindings '}'-             { DoBinding $6 $7 $2 $3 $5 : $9 }--DoBindings :: { [Do] }-DoBindings : DoBind DoBindings { $1:$2}-           | DoBind { [$1] }--DoBind :: { Do }-DoBind : Name MaybeType leftarrow Term File Line ';' { DoBinding $5 $6 $1 $2 $4 }-       | let Name MaybeType '=' Term File Line ';' { DoLet $6 $7 $2 $3 $5 }-       | Term File Line ';' { DoExp $2 $3 $1 }--Constant :: { Constant }-Constant : type { TYPE }-         | ltype { LTYPE }-         | stringtype { StringType }-         | inttype { IntType }-         | chartype { CharType }-         | floattype { FloatType }-         | ptrtype { PtrType }-         | handletype { Builtin "Handle" }-         | locktype { Builtin "Lock" }-         | int { Num $1 }-         | char { Ch $1 }-         | string { Str $1 }-         | bool { Bo $1 }-         | float { Fl $1 }---- Whitespace separated term sequences; must be NoAppTerms since obviously--- application is space separated...--Terms :: { [RawTerm] }-Terms : { [] }-      | NoAppTerm Terms { $1:$2 }--DType :: { (RawTerm, [(Id, RawTerm)]) }-DType : ':' Type Using where { ($2, $3) }-      | '=' File Line { (RConst $2 $3 TYPE, []) }-      | VarList '=' File Line { (mkTyParams $3 $4 $1, []) }--Using :: { [(Id, RawTerm)] }-      : { [] }-      | using '(' UseList ')' { $3 }--DoUsing ::{ (Id,Id) }-        : do using '(' Name ',' Name ')' { ($4,$6) }--Idiom ::{ (Id,Id) }-        : idiom '(' Name ',' Name ')' { ($3,$5) }--        -Params :: { [(Id, RawTerm)] }-       : params '(' UseList ')' { $3 }--Namespace :: { Id }-          : namespace Name { $2 }--UseList :: { [(Id, RawTerm)] }-        : Name ':' Type { [($1, $3)] }-        | Name ':' Type ',' UseList { ($1,$3):$5 }--VarList :: { [Id] }-VarList : Name { [$1] }-        | Name VarList { $1:$2 }--Where : where { $1 }-      | '=' { $1 }--Constructors :: { [ConParse] }-Constructors : { [] } -- None-             | Constructor { [$1] }-             | Constructor '|' Constructors { $1:$3 }--Constructor :: { ConParse }-Constructor : Name CType { Full $1 $2 }-            | Name Terms { Simple $1 $2 }---            | Name { Simple $1 [] }--CType :: { RawTerm }-CType : ':' Type { $2 }--Tactic :: { ITactic }-Tactic : intro Names { Intro $2 }-       | intro { Intro [] }-       | refine Name { Refine $2 }-       | exists Term { Exists $2 }-       | generalise Term { Generalise $2 }-       | reflp { ReflP }-       | rewrite Term { Rewrite False False $2 }-       | rewrite leftarrow Term { Rewrite False True $3 }-       | rewriteall Term { Rewrite True False $2 }-       | rewriteall leftarrow Term { Rewrite True True $3 }-       | compute { Compute }-       | unfold Name { Unfold $2 }-       | undo { Undo }-       | induction Term { Induction $2 }-       | fill Term { Fill $2 }-       | trivial { Trivial }-       | simplesearch { SimpleSearch }-       | mktac Term { RunTactic $2 }-       | believe Term { Believe $2 }-       | use Term { Use $2 }-       | decide Term { Decide $2 }-       | abandon { Abandon }-       | proofterm { ProofTerm }-       | qed { Qed }--ProofScript :: { [ITactic] }-ProofScript : proof '{' Tactics '}' { $3 }--Tactics :: { [ITactic] }-Tactics : Tactic ';' { [$1] }-        | Tactic { [$1] }-        | Tactic ';' Tactics { $1:$3 }--TacticList :: { [ITactic] }-TacticList : Tactic { [$1] }-           | Tactic ',' Tactics { $1:$3 }--Line :: { LineNumber }-     : {- empty -}      {% getLineNo }--File :: { String } -     : {- empty -} %prec NONE  {% getFileName }--Ops :: { Fixities } -     : {- empty -} %prec NONE  {% getOps }--{--data ConParse = Full Id RawTerm-              | Simple Id [RawTerm]--parse :: String -> FilePath -> Result [Decl]-parse s fn = do ds <- mkparse s fn 1 []-                collectDecls ds--processImports :: [Opt] -> [FilePath] -> Result [Decl] -> -                  IO ([Decl], [FilePath])-processImports opts imped (Success ds) = pi imped [] ds-  where pi imps decls ((PInclude fp):xs)-           | fp `elem` imps = pi imps decls xs-           | otherwise = do-                 f <- readLibFile defaultLibPath fp-                 when (Verbose `elem` opts) $ putStrLn ("Reading " ++ fp)-                 case parse f fp of-                   Success t -> pi (fp:imps) decls (t++xs)-                   Failure e f l ->-                     fail $ f ++ ":" ++ show l ++ ":" ++ e-        pi imps decls ((Using t ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Using t ds']) xs-        pi imps decls ((Params t ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Params t ds']) xs-        pi imps decls ((DoUsing b r ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[DoUsing b r ds']) xs-        pi imps decls ((Idiom b r ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Idiom b r ds']) xs-        pi imps decls ((Namespace n ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Namespace n ds']) xs-        pi imps decls (x:xs) = pi imps (decls++[x]) xs-        pi imps decls [] = return (decls, imps)--processImports _ imped (Failure e f l) -    = fail $ show f ++ ":" ++ show l ++ ":" ++ show e---parseTerm :: String -> Result RawTerm-parseTerm s = mkparseTerm s "(input)" 0 []--parseTactic :: String -> Result ITactic-parseTactic s = mkparseTactic s "(tactic)" 0 []---- Make a constructor type, and make arguments lazy if it's codata--mkCon :: Bool -> RawTerm -> ConParse -> (Id,RawTerm)-mkCon co _ (Full n t) = (n,if co then lazify t else t)-mkCon co ty (Simple n args) = (n, mkConTy args ty)-   where mkConTy [] ty = ty-         mkConTy (a:as) ty = let opts = if co then [Lazy] else [] in-                                 RBind (MN "X" 0) (Pi Ex opts a) (mkConTy as ty)---- Make sure all arguments are lazy--lazify :: RawTerm -> RawTerm-lazify (RBind n (Pi p opts a) sc) -    = RBind n (Pi p (nub (Lazy:opts)) a) (lazify sc)-lazify t = t--mkDef file line (n, tms) = mkImpApp (RVar file line n Unknown) tms-   where mkImpApp f [] = f-         mkImpApp f ((tm,Just n):ts) = mkImpApp (RAppImp file line n f tm) ts-         mkImpApp f ((tm, Nothing):ts) = mkImpApp (RApp file line f tm) ts--doBind :: (RawTerm -> RBinder) -> [(Id,RawTerm)] -> RawTerm -> RawTerm-doBind b [] t = t-doBind b ((x,ty):ts) tm = RBind x (b ty) (doBind b ts tm)--doLetBind :: [(Id,RawTerm,RawTerm)] -> RawTerm -> RawTerm-doLetBind [] t = t-doLetBind ((x,ty,val):ts) tm = RBind x (RLet val ty) (doLetBind ts tm)--mkTyApp :: String -> Int -> Id -> RawTerm -> RawTerm-mkTyApp file line n ty = mkApp file line (RVar file line n Unknown) (getTyArgs ty)-   where getTyArgs (RBind n _ t) = (RVar file line n Unknown):(getTyArgs t)-         getTyArgs x = []--mkTyParams :: String -> Int -> [Id] -> RawTerm-mkTyParams f l [] = RConst f l TYPE-mkTyParams f l (x:xs) = RBind x (Pi Ex [] (RConst f l TYPE)) (mkTyParams f l xs)--mkDatatype :: Bool -> String -> Int ->-              Id -> Either RawTerm ((RawTerm, [(Id, RawTerm)]), [ConParse]) -> -                    [TyOpt] -> Datatype-mkDatatype co file line n (Right ((t, using), cons)) opts-    = let opts' = if co then nub (Codata:opts) else opts in-          Datatype n t (map (mkCon co (mkTyApp file line n t)) cons) using opts' file line -mkDatatype co file line n (Left t) opts-    = Latatype n t file line--bracket (RUserInfix f l _ op x y) = RUserInfix f l True op x y-bracket x = x--pairDesugar :: String -> Int -> RawTerm -> [RawTerm] -> RawTerm-pairDesugar file line pair [x,y] = mkApp file line pair [x,y]-pairDesugar file line pair (x:y:xs) -    = pairDesugar file line pair ((mkApp file line pair [x,y]):xs)--sigDesugar :: String -> Int -> (Id, RawTerm) -> RawTerm -> RawTerm-sigDesugar file line (n, tm) sc-    = mkApp file line (RVar file line (UN "Sigma") TypeCon) [tm, lam]-   where lam = RBind n (Lam tm) sc--mkConsList :: String -> Int -> [RawTerm] -> RawTerm-mkConsList f l [] = RVar f l (UN "Nil") Unknown-mkConsList f l (x:xs) = RApp f l (RApp f l (RVar f l (UN "Cons") Unknown) x)-                                 (mkConsList f l xs)--mkhidden (UN n) = MN (n++" is hidden") 0--}-
− Idris/PartialEval.lhs
@@ -1,310 +0,0 @@-Various bits and pieces to help do partial evaluation better.--This module doesn't do PE itself - rather, it sets up the %transform, %spec-and %freeze annotations.--> module Idris.PartialEval(partialeval, addPEdefs, staticDecls, ->                          getNewDefs) where--> import Idris.AbsSyntax-> import Ivor.TT as TT--> import Maybe-> import List-> import Control.Monad.State-> import Debug.Trace--> type NewTrans = [(ViewTerm, ViewTerm)]-> type NewFreeze = [Name]-> type NewDefs = [(Name, ViewTerm, Patterns, NewFreeze, (ViewTerm, ViewTerm))]--> type StaticState = (NewDefs, StaticUsed, NewTrans, NewFreeze, Int)--For everything in the context, look for applications of PEable functions,-with 'findStatic' below.-For each one, add a new definition, %spec it, %freeze it and add a-%transform rule that applies the new definition backwards.--For a definition d which uses PEable functions, add the new definitions -to the new context *before* adding d, followed by the %transform and %freeze -for each new definition, followed by d.-- addPEdefs :: Statics -> IdrisState -> Ctxt IvorFun -> Ctxt IvorFun- addPEdefs sts ist raw = addpes newCtxt [] (ctxtAlist raw)-   where addpes acc stu [] = acc-         addpes acc stu ((n,i):is) =-             let (i', defs, stu', _, _) = getPEdefs n sts ist raw stu i in-                 addpes (addEntry acc [] n i') stu' is--> getPEdefs :: Id -> Statics -> IdrisState ->->              Ctxt IvorFun -> StaticUsed -> IvorFun -> ->              (IvorFun, NewDefs, StaticUsed, NewTrans, NewFreeze)-> getPEdefs n sts ist raw stu i = ->     case ivorDef i of->       Just d -> let (def', (nds, stused, ts, fs, _)) = runState (getPEdef n sts ist raw stu d) ([], stu, [], [], 0) in->                     (i { ivorDef = Just def' }, nds, stused, ts, fs)->       Nothing -> (i, [], stu, [], [])--> getNewDefs :: Id -> Statics -> IdrisState ->->               Ctxt IvorFun -> StaticUsed -> IvorDef -> ->               (IvorDef, NewDefs, StaticUsed, NewTrans, NewFreeze)-> getNewDefs n sts ist raw stu d = ->     let (d', (sts', stu', ts, fs, _)) = runState (getPEdef n sts ist raw stu d) ([],stu,[],[],0) in->         (d', sts', stu', ts, fs)--> getPEdef :: Id -> Statics -> IdrisState -> Ctxt IvorFun -> ->             StaticUsed -> IvorDef ->->             State StaticState IvorDef-> getPEdef n sts ist raw stu (PattDef (Patterns ps)) =->     do ps' <- mapM pepat ps->        return (PattDef (Patterns ps'))->       where->           pepat (PClause args bs ret) ->                 = do ret' <- findStatic n sts ist raw ret->                      return (PClause args bs ret')->           pepat (PWithClause p args sc (Patterns ps)) ->                 = do sc' <- findStatic n sts ist raw sc->                      ps' <- mapM pepat ps->                      return (PWithClause p args sc' (Patterns ps'))-> getPEdef n sts ist raw stu (SimpleDef p) = ->     do p' <- findStatic n sts ist raw p->        return (SimpleDef p')-> getPEdef _ _ _ _ _ x = return x---Given a list of functions with static arguments, and a term...-Look for applications of that function in the term. --Replace them with a partially evaluated version (look in StaticsUsed first-to see if it's already been done.)--Return: the new term, the new definitions added, and an updated cached of PEed-functions.--> findStatic :: Id -> Statics -> IdrisState -> Ctxt IvorFun -> ViewTerm -> ->               State StaticState ViewTerm-> findStatic n sts ist raw vt = fs [] vt->    where->      fs stk (App f a) = do a' <- fs [] a->                            fs (a':stk) f->      fs stk (Lambda n ty sc) = do sc' <- fs [] sc->                                   freturn (Lambda n ty sc') stk->      fs stk (Let n ty v sc) = do v' <- fs [] v->                                  sc' <- fs [] sc->                                  freturn (Let n ty v' sc') stk->      fs stk (Annotation a vt) = do vt' <- fs stk vt->                                    return (Annotation a vt') --Don't bother with PE inside types-->      fs stk x = freturn x stk-->      freturn (Name _ f) args->         | Just (sts,arity,ty) <- lookup f sts->              = if length args == arity->                    then papply sts f ty args->                    else if length args > arity ->                            then do let (args', rest) = (take arity args,->                                                         drop arity args)->                                    app <- papply sts f ty args'->                                    return (apply app rest)->                            else return (apply (Name Unknown f) args)->      freturn f args = return (apply f args)--Check the arguments in static position are indeed statically known.-->      papply sts f ty args ->          | all (known args) sts = -- trace (show (f, args, ty)) $ ->              do let knownArgs = mkArgs sts 0 args->                 let ty' = newTy ty knownArgs->                 addDef f ty' knownArgs->                 return (apply (Name Unknown f) args)->      papply sts f ty args = return (apply (Name Unknown f) args)--Pull out the arguments that are statically known-->      mkArgs sts _ [] = []->      mkArgs sts i (a:args) | i `elem` sts = Right a : (mkArgs sts (i+1) args)->                            | otherwise = Left a : mkArgs sts (i+1) args-->      newTy (Forall n ty sc) (Left _ : rest) ->          = Forall n ty (newTy sc rest)->      newTy (Forall n ty sc) (Right val : rest)->          = newTy (subst n val sc) rest->      newTy (Annotation a x) rest = Annotation a (newTy x rest)->      newTy x _ = x-->      known args i = all nknown (namesTypesIn (args!!!(i,"known fail")))->      nknown x@(_,Free) = True->      nknown x@(_,DataCon) = True->      nknown x@(_,TypeCon) = True->      nknown x = False-->      addDef f ty args = ->         do (nds, used, ts, fs, name) <- get->            let defname = toIvorName $ MN ("PE"++show n) name->            let sargs = mapMaybe getRight args->            let idx = (f, sargs)->            if (idx `elem` used) then return () else->              do->                 let dargs = getDargs args nameSupply->                 let rhs = reImplicit ist raw $->                             apply (Name Unknown f) (mkAppArgs args sargs dargs)->                 let dargs' = map (dused (namesIn rhs)) dargs->                 let used' = idx:used->                 let transFrom = mktrans (getMVs args dargs') rhs->                 let transTo = mktrans (getMVs args dargs') (apply (Name Unknown defname) dargs')->                 let trans = (transFrom, transTo)->                 let freeze = getFrozen transFrom->                 let newdef = (defname, ty, Patterns [PClause dargs' [] rhs], freeze, trans)->                 let nds' = newdef:nds->                 put (nds', used', trans:ts, freeze ++ fs, name+1)-->      nameSupply = map (toIvorName.(MN "parg")) [0..]->      dused xs (Name _ n) | not (n `elem` xs) = Placeholder->      dused xs x = x-->      -- getDargs ((Left n@(Name _ _)):xs) ns = n : getDargs xs ns->      getDargs ((Left _):xs) (n:ns) = (Name Unknown n) : getDargs xs ns->      getDargs (_:xs) ns = getDargs xs ns->      getDargs [] _ = []-->      getRight (Right x) = Just x->      getRight _ = Nothing--Make a list of arguments for the specialisable application-->      mkAppArgs [] _ _ = []->      mkAppArgs (Left _:xs) ss (d:ds) = d:(mkAppArgs xs ss ds)->      mkAppArgs (Right v:xs) (s:ss) ds = s:(mkAppArgs xs ss ds)->      mkAppArgs _ _ _ = []--Make the LHS and RHS of a transformation rule for the new definition-->      getMVs (Left _:xs) (Name _ n:ds) = n:(getMVs xs ds)->      getMVs (Left _:xs) (_:ds) = getMVs xs ds->      getMVs (Right v:xs) ds = getMVs xs ds->      getMVs _ _ = []-->      mktrans (n:ns) tm = mktrans ns (subst n (Metavar n) tm)->      mktrans [] tm = tm-->      getFrozen tm = map fst (filter (\ (n, ty) -> ty == Free) (namesTypesIn tm))--Re-add _s for implicit arguments in PE definitions (because the type checker-will make a better job of working out what they should be than we will...)--The terms will just be simple applications--> reImplicit :: IdrisState -> Ctxt IvorFun -> ViewTerm -> ViewTerm-> reImplicit ist raw tm = reImp tm []->   where reImp fn@(Name _ n) stk->               = case getName n of->                   Right ifn -> let imps = implicitArgs ifn ->                                    stk' = take imps (repeat Placeholder)->                                             ++ drop imps stk in->                                    apply fn stk'->                   _ -> apply fn stk->         reImp (App f a) stk = reImp f ((reImp a []):stk)->         reImp (Annotation a t) stk = Annotation a (reImp t stk)->         reImp x stk = apply x stk-->         names = mkNameMap raw->         getName n = case lookup n names of->                       Just x -> ctxtLookup raw [] x->                       Nothing -> fail "No name"---Get a list of functions with static arguments, and their arities.--> staticDecls :: Ctxt IvorFun -> Statics-> staticDecls ctx = mapMaybe getStatic (ctxtAlist ctx)->    where getStatic (n,i) ->             = if null (staticArgs i) || fwdDef (rawDecl i)->                  then Nothing->                  else let statics = (map (+ (implicitArgs i)) (staticArgs i))->                           ar = arity (ivorDef i)->                           extras = getExtras statics ar (ivorFType i) ->                         in Just (toIvorName n, ->                                  (nub (extras ++ statics), ar, ->                                   getType (ivorFType i)))-->          fwdDef (Fwd _ _ _) = True->          fwdDef _ = False->          getType (Just t) = t-->          arity (Just (PattDef ps)) = parity ps->          arity _ = 0->          parity (Patterns []) = 0->          parity (Patterns ((PClause xs _ _):_)) = length xs->          parity (Patterns ((PWithClause _ xs _ _):_)) = length xs--Look for dependencies on the static arguments. Keep going until there are-no more. Add any dependencies on static arguments which are dependencies on-*no* dynamic arguments.-->          getExtras _ _ Nothing = []->          getExtras ss ar (Just t) ->             = let ds = [0..ar-1] \\ ss->                   args = TT.getArgTypes t->                   stypes = map (\x -> snd (args!!!(x,"extra 1"))) ss->                   dtypes = map (\x -> snd (args!!!(x,"extra 2"))) ds->                   stnames = concatMap namesIn stypes ->                   dnames = concatMap namesIn dtypes ->                   newss_in = nub (ss ++ (mapMaybe (\x -> lookupIdx 0 x args) stnames)) ->                   newds = mapMaybe (\x -> lookupIdx 0 x args) dnames->                   newss = sort $ newss_in \\ newds in->                   if (ss==newss) then ss else getExtras newss ar (Just t)->          lookupIdx i x ((n,v):xs) | n==x = Just i->                                   | otherwise = lookupIdx (i+1) x xs->          lookupIdx i x [] = Nothing--> addPEdefs :: Ctxt IvorFun -> Context -> Statics -> UserOps -> NewDefs -> ->              TTM (Context, UserOps, [Id])-> addPEdefs raw ctxt sts uo nds = tryAdd ctxt uo [] nds->    where tryAdd ctxt uo frz [] = return (ctxt, uo, frz)->          tryAdd ctxt uo frz (d:ds) ->               = case addPEdef ctxt uo d of->                   Right (ctxt', uo', frz') -> -- trace ("WIN: " ++ show d) $->                       tryAdd ctxt' uo' (frz++frz') ds->                   Left err -> trace ("FAIL: " ++ show d ++ "\n" ++ show err) $->                       tryAdd ctxt uo frz ds-->          addPEdef ctxt (UO fix trans frz syn) (n, ty, pdef, frz', trans') =->              do (ctxt, []) <- addPatternDef ctxt n ty pdef ->                               [Specialise (map (\x -> (x,1)) frz'),->                                SpecStatic (map getst sts)]->                 return (ctxt, UO fix (trans':trans) ->                                  (map getName frz'++frz) syn, ->                               map getName frz')-->          getst (n, (args, arity, ty)) = (n,(args,arity))->          names = mkNameMap raw->          getName n = case lookup n names of->                         Just x -> x->                         Nothing -> UN (show n)--Go through the context, evaluating enough to work out what the transform-rules need to be. Return a new set of transform rules, and specialised versions-of PEable functions.--Algorithm is:--In a definition f, PE(f):--For each static function I, with static positions s1...sn:-* If it appears in a pattern clause,  -    make a new function Ispec di = mkSpec (I di si)-       repeat PE(Ispec)-    add a transform I ?di si => Ispec ?di-          if any si is a name, freeze it--mkSpec(I di si):--* Evaluate I di si. Any si which is a name, expand only once.-  After the top level I, do not evaluate any static arguments of any I --    either they are all expanded, or we'll PE them separately.--> partialeval :: Ctxt IvorFun -> Context -> Statics -> UserOps -> ->                (Context, UserOps)-> partialeval raw ctxt sts uos = (ctxt, uos)
− Idris/Prover.lhs
@@ -1,333 +0,0 @@-> module Idris.Prover(doProof, runScript, doIvor, ioTac) where--> import System.Console.Readline-> import Control.Monad hiding ((>=>))-> import Data.Typeable--> import Idris.AbsSyntax-> import Idris.Parser--> import Ivor.Shell-> import Ivor.TT-> import Ivor.Construction--> import Debug.Trace--> ioTac :: TTM a -> IO a-> ioTac (Left a) = fail (show a)-> ioTac (Right v) = return v--> doProof :: Ctxt IvorFun -> Context -> UserOps -> Id -> IO Context-> doProof raw ctxt uo nm = ->     do ctxt' <- ioTac $ resume ctxt (toIvorName nm)->        ctxt' <- ioTac $ attack defaultGoal ctxt'->        putStrLn $ showCtxtState raw ctxt'->        (ctxt', script, ok) <- proofShell (show nm) raw uo [] ctxt'->        if ok then do->            return ctxt'->          else do putStrLn "Proof abandoned"->                  return ctxt--> runScript :: Ctxt IvorFun -> Context -> UserOps -> Id -> [ITactic] -> ->              TTM Context-> runScript raw ctxt uo nm tacs =->     do ctxt <- resume ctxt (toIvorName nm)->        ctxt <- attack defaultGoal ctxt->        execScript raw ctxt uo tacs--This function assumes that it can plough on knowing the proof is fine.-If it isn't, it'll break, but with an error. We probably ought to check-properly, if only for useful diagnostics.--> execScript :: Ctxt IvorFun -> Context -> UserOps -> [ITactic] -> TTM Context-> execScript raw ctxt uo [] = return ctxt-> execScript raw ctxt uo (t:ts) ->      = do (ctxt,_,_) <- applyTac raw ctxt uo [] t->           ctxt <- keepSolving defaultGoal ctxt->           ctxt <- if ((numUnsolved ctxt) > 0)->                     then beta defaultGoal ctxt->                     else return ctxt->           execScript raw ctxt uo ts--> showScript :: String -> [String] -> IO ()-> showScript nm sc ->    = do putStrLn $ nm ++ " proof {"->         putStr $ concat (map (\line -> "\t" ++ line ++ ";\n") (sc++["%qed"]))->         putStrLn "};"--Remember the proof script (that's the [String]) and output it, without the-undone bits, after a Qed--> proofShell :: String -> Ctxt IvorFun -> UserOps -> [String] -> Context -> ->               IO (Context, [String], Bool)-> proofShell nm raw uo script ctxt = do->     inp <- readline (nm ++ "> ")->     res <- case inp of->              Nothing -> return ""->              Just ":q" -> return "abandon"->              Just tac -> do addHistory tac->                             return tac->     case parseTactic ("%"++res) of->            Failure err f l -> do putStrLn err->                                  proofShell nm raw uo script ctxt->            Success tac -> ->                do let script' = script ++ ["%"++res]->                   when (tac == Qed) $ ->                        showScript nm script->                   case applyTac raw ctxt uo script' tac of->                     Left err -> do print err->                                    proofShell nm raw uo script ctxt->                     Right (ctxt, script, True) -> do->                       ctxt <- ioTac $ keepSolving defaultGoal ctxt->                       ctxt <- ioTac $ if ((numUnsolved ctxt) > 0)->                                 then beta defaultGoal ctxt->                                 else return ctxt->                       if (proving ctxt)->                          then do putStrLn $ showCtxtState raw ctxt->                                  proofShell nm raw uo script ctxt->                          else return (ctxt, script, True)->                     _ -> return (ctxt, script, False)--> applyTac :: Ctxt IvorFun -> Context -> UserOps -> [String] -> ITactic -> ->             TTM (Context, [String], Bool)-> applyTac raw ctxt uo script Abandon = return (ctxt, script, False)-> applyTac raw ctxt uo script Undo = do ctxt <- restore ctxt->                                    -- remove the undo and the command->                                       let script' = init (init script)->                                       return (ctxt, script', True)-> applyTac raw ctxt uo script tac = do ctxt <- at (save ctxt) tac ->                                      return (ctxt, script, True)->   where->     at ctxt (Intro []) = intros defaultGoal ctxt->     at ctxt (Intro ns) = introsNames (map toIvorName ns) defaultGoal ctxt->     at ctxt (Refine n) = refine (Name Unknown (toIvorName n)) defaultGoal ctxt->     at ctxt (Generalise t) = generalise (ivor t) defaultGoal ctxt->     at ctxt (Exists t) = refine (App (App (App (Name Unknown (name "Exists"))->                                           Placeholder) Placeholder)->                                           (ivor t)) defaultGoal ctxt->     at ctxt ReflP = refine reflN defaultGoal ctxt->     at ctxt (Fill t) = fill (ivor t) defaultGoal ctxt->     at ctxt Trivial = (trivial >|> refine reflN) defaultGoal ctxt->     at ctxt SimpleSearch = (trivial >|> refine reflN >|> simplesearch raw uo) defaultGoal ctxt->     at ctxt (Believe t) = suspend_disbelief raw (ivor t) defaultGoal ctxt->     at ctxt (Use t) = prove_belief raw (ivor t) defaultGoal ctxt->     at ctxt (Decide t) = decide raw uo t defaultGoal ctxt->     at ctxt (Induction t) = induction (ivor t) defaultGoal ctxt->     at ctxt (Rewrite False f t) = rewrite (ivor t) f defaultGoal ctxt->     at ctxt (Rewrite True f t) = rewriteAll (ivor t) f defaultGoal ctxt->     at ctxt Compute = compute defaultGoal ctxt->     at ctxt (Unfold n) = unfold (toIvorName n) defaultGoal ctxt->     at ctxt (RunTactic tm) = runtac raw uo (ivor tm) defaultGoal ctxt->     at ctxt ProofTerm = do tm <- proofterm ctxt->                            fail (showVT raw (view tm))->     at ctxt Qed = qed ctxt-->     ivor t = makeIvorTerm noImplicit defDo uo (UN "__prf") raw t--> eqN = Name Unknown $ name "Eq"-> replN = Name Unknown $ toIvorName (UN "__eq_repl")-> symN = Name Unknown $ toIvorName (UN "__eq_sym")-> reflN = Name Unknown $ name "refl"-> eqP x y = apply eqN [Placeholder,Placeholder,x,y]-> believe x y = apply (Name Unknown (toIvorName (UN "__Suspend_Disbelief")))->                     [Placeholder,x,y]--> rewrite :: ViewTerm -> Bool -> Tactic-> rewrite = replace eqN replN symN--Given a rewrite rule, find all places where it can be applied (in the given -direction), and apply it. Search for points where the goal matches the LHS-of the rule's type, and apply rewrite.--> rewriteAll :: ViewTerm -> Bool -> Tactic-> rewriteAll (Name _ n) dir goal ctxt ->   = do tyin <- getType ctxt n->        let ty = view tyin->        rule <- getRule dir (getReturnType ty)->        let argNames = map fst (Ivor.TT.getArgTypes ty)->        fail $ "Not finished yet " ++ show rule->   where getRule dir (App (App (App (App ->                       (Name _ eq) Placeholder) Placeholder) l) r)->             | eq == opFn JMEq = if dir then return (l, r) else return (r,l)->         getRule _ _ = fail "Not a rewrite rule"--> rewriteAll tm dir _ _ = fail "Not a rewrite rule name"--> showCtxtState :: Ctxt IvorFun -> Context -> String-> showCtxtState raw ctxt->     | not (proving ctxt) = ""->     | null (getGoals ctxt) = "\nNo more goals\n"->     | otherwise = let (g:gs) = getGoals ctxt in->                      "\n" ++ showGoalState g ++->                      -- "\nOther goals: " ++ show gs ++ ->                      "\n\n"->  where->    showTm t = showImp False (unIvor raw (view t))->    showGoalState :: Goal -> String->    showGoalState g = let (Right gd) = goalData ctxt True g->                          env = bindings gd->                          ty = goalType gd->                          nm = goalName gd in->                        showEnv (reverse env) ++ "\n" ++->                        "--------------------------------\n" ++->                        show nm ++ " ? " ++ showTm ty ++ "\n"->    showEnv [] = ""->    showEnv ((n,ty):xs) = show n ++ " : " ++ showTm ty ++ "\n" ++->                          showEnv xs--Apply a tactic computed by an ivor function (see libs/tactics.idr for construction-of these tactics)--> doIvor :: Context -> IO Context-> doIvor ctxt = do s <- runShell "Ivor> " (newShell ctxt)->                  return (getContext s)----------- Specialised tactics for Idris ----------Given a term of type T args and a goal of type T args', look for the-first difference between args and args', and rewrite by-Suspend_Disbelief arg arg'. Keep doing this until the value solves the goal,-or there is nothing to rewrite.--At least make sure arg and arg' and not Types, so that we're only -suspending disbelief about value equalities, not polymorphic values.--> suspend_disbelief :: Ctxt IvorFun -> ViewTerm -> Tactic-> suspend_disbelief raw val goal ctxt->     = do ty <- checkCtxt ctxt goal val->          gd <- goalData ctxt True goal->          let gtype = view (goalType gd)->          let vtype = viewType ty->          let (gfn, gargs) = (getApp gtype, getFnArgs gtype)->          let (vfn, vargs) = (getApp vtype, getFnArgs vtype)->          when (gfn/=vfn) $ fail ((show gfn) ++ " and " ++ (show vfn) ++ ->                                  " are different types")->          let diffs = filter (\ (x,y) -> x/=y) (zip gargs vargs)->          ctxt <- rewriteDiffs diffs goal ctxt->          fill val goal ctxt->    where rewriteDiffs [] goal ctxt = idTac goal ctxt->          rewriteDiffs ((arg1, arg2):ds) goal ctxt->               = do let rt = believe arg1 arg2->                    rty <- checkCtxt ctxt goal arg1->                    when (viewType rty == Star) $->                         fail ((show arg1) ++ " is a type")->                    ctxt' <- rewrite rt False goal ctxt->                    rewriteDiffs ds goal ctxt'--As above, but instead of just believing the value, insert subgoals for-the required equality proofs--> prove_belief :: Ctxt IvorFun -> ViewTerm -> Tactic-> prove_belief raw val goal ctxt->     = do ty <- checkCtxt ctxt goal val->          gd <- goalData ctxt True goal->          let gtype = view (goalType gd)->          let vtype = viewType ty->          let (gfn, gargs) = (getApp gtype, getFnArgs gtype)->          let (vfn, vargs) = (getApp vtype, getFnArgs vtype)->          when (gfn/=vfn) $ fail ((show gfn) ++ " and " ++ (show vfn) ++ ->                                  " are different types")->          let diffs = filter (\ (x,y) -> x/=y) (zip gargs vargs)->          ctxt <- rewriteDiffs diffs goal ctxt->          fill val goal ctxt->    where rewriteDiffs [] goal ctxt = idTac goal ctxt->          rewriteDiffs ((arg1, arg2):ds) goal ctxt->               = do let claimTy = eqP arg2 arg1->                    claimName <- uniqueName ctxt (name "equality")->                    ctxt <- claim claimName claimTy goal ctxt->                    rty <- checkCtxt ctxt goal arg1->                    when (viewType rty == Star) $->                         fail ((show arg1) ++ " is a type")->                    ctxt' <- rewrite (Name Unknown claimName) False goal ctxt->                    rewriteDiffs ds goal ctxt'--decide; given a goal of the form X a b c, and a function x of type-x : a:A -> b:B -> c:C -> (Maybe (X a b c), apply the function to-a b c, and send the result to Ivor's isItJust tactic--_or_; given a goal of the form X a b c, and a function x of type-x: a:A -> b:B -> c:C -> Tactic, send x a b c to runtac below.--> decide :: Ctxt IvorFun -> UserOps -> RawTerm -> Tactic-> decide raw uo dproc goal ctxt = do->    gd <- goalData ctxt True goal->    let idgoal = unIvor raw ((view.goalType) gd)->    let args = getExplicitArgs idgoal->    let dapp = makeIvorTerm noImplicit defDo uo (UN "__prf") raw ->                            (mkApp "[proof]" 0 dproc args)->    (isItJust dapp >|> runtac raw uo dapp) goal ctxt--Try to solve a goal by looking through the global context. Obviously, this is-a bit dumb.--This is intended for type classes, so perhaps eventually what we'll want is-a way of just searching for dictionaries.--> simplesearch :: Ctxt IvorFun -> UserOps -> Tactic-> simplesearch raw uo goal ctxt = tryAll 5 allns goal ctxt->    where tryAll 0 _ _ _  = ttfail "Can't find a solution"->          tryAll d [] g c = ttfail "Can't find a solution"->          tryAll d ((i,fn):rest) g c | isFun (ivorDef fn) && take 8 (show i) == "instance"->                 = (tryRefine d (show i) >|> tryAll d rest) g c->          tryAll d (_:rest) g c = tryAll d rest g c-->          isFun (Just (SimpleDef _)) = True->          isFun (Just (PattDef _)) = True->          isFun _ = False->          allns = ctxtAlist raw-->          tryRefine d n g c = do goald <- goalData c False defaultGoal->                                 c <- refine n g c->                                 if (allSolved c) then return c else->                                     (beta >-> tryAll (d-1) allns) defaultGoal c----Run a tactic computed by mkTac--Check the term actually computes a tactic, then evaluate it, then run the actual tactics-the result term tells us to run.--> runtac :: Ctxt IvorFun -> UserOps -> ViewTerm -> Tactic-> runtac raw uo tmin goal ctxt = ->    do tm <- checkCtxt ctxt goal tmin->       checkTac (viewType tm)->       tm' <- evalCtxt ctxt goal tm->       exect (view tm') goal ctxt-->   where checkTac (Name _ n) | n == (name "Tactic") = return ()->         checkTac ty = fail $ (show ty) ++ " is not of type Tactic"-->         exect t g c = do c' <- exect' t g c->                          c' <- keepSolving defaultGoal c'->                          if ((numUnsolved c') > 0)->                             then beta defaultGoal c'->                             else return c'-->         exect' (App (App (Name _ tthen) x) y) | tthen == name "TThen" ->               = exect x >+> exect y->         exect' (App (App (Name _ tseq) x) y) | tseq == name "TSeq" ->               = exect x >-> exect y->         exect' (App (App (Name _ tthen) x) y) | tthen == name "TThenAll" ->               = exect x >=> exect y->         exect' (App (App (Name _ ttry) x) y) | ttry == name "TTry" ->               = exect x >|> exect y->         exect' (App (App (Name _ tfill) _) y) | tfill == name "TFill" ->               = fill y >+> keepSolving->         exect' (App (App (Name _ tdecide) _) y) | tdecide == name "TDecide" ->               = isItJust y >+> keepSolving->         exect' (App (Name _ trefine) (Constant s)) | trefine == name "TRefine" =->                  case cast s :: Maybe String of->                    Just str -> refine str->         exect' (App (Name _ tfail) (Constant s)) | tfail == name "TFail" =->                  \ g c -> case cast s :: Maybe String of->                              Just err -> ttfail err ->         exect' (Name _ ttrivial) | ttrivial == name "TTrivial" = trivial >|> refine reflN->         exect' (Name _ ttrivial) | ttrivial == name "TSearchContext" = trivial >|> simplesearch raw uo >|> refine reflN->         exect' tm = \ g c -> ttfail $ "Couldn't compute tactic " ++ show tm--XXX: Auto-rewrite: user can add rewrite rules, auto-rewrite repeatedly-rewrites by these rules until there's no more to rewrite, or until a-threshold is reached. Effectively looking for some kind of normal-form. Can we do this in any reasonable way?
− Idris/RunIO.hs
@@ -1,185 +0,0 @@-{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances -fallow-overlapping-instances #-}-{-# LANGUAGE MagicHash, UndecidableInstances, OverlappingInstances #-}--module Idris.RunIO where---- import SimplDSL--import Ivor.TT-import Ivor.Shell-import Ivor.Construction-import Idris.AbsSyntax--import Data.Typeable-import Data.IORef-import System.IO.Unsafe-import System.IO-import Control.Monad.Error-import Control.Concurrent-import Debug.Trace--newtype Lock = Lock QSem--instance Typeable Lock where-    typeOf a = mkTyConApp (mkTyCon "Lock") []--instance Show Lock where-    show x = "<<Lock>>"--instance Eq Lock where-    (==) x y = False -- Hmm--instance ViewConst Handle where-    typeof x = (name "Handle")--instance ViewConst Lock where-    typeof x = (name "Lock")--exec :: Context -> Term -> IO ()-exec ctxt wurzel = do res <- runIO ctxt (view (whnf ctxt wurzel))-                      putStrLn $ show res--runIO :: Context -> ViewTerm -> IO ViewTerm-runIO ctxt (App (App (App (Name _ d) _) act) k)-    | d == name "IO.IODo" = runAction ctxt (parseAction act) k-runIO ctxt (App (App (Name _ l) _) res)-    | l == name "IO.IOReturn" = return res-runIO _ x = fail $ "Not an IO action: " ++ show x--data Action = ReadStr-            | WriteStr String-            | Fork ViewTerm-            | NewLock Int-            | DoLock Lock-            | DoUnlock Lock-            | NewRef-            | ReadRef Int-            | WriteRef Int ViewTerm-            | CantReduce ViewTerm--parseAction x = parseAction' x [] where-  parseAction' (App f a) args = parseAction' f (a:args)-  parseAction' (Name _ n) args = (getAction n args)--getAction n []-    | n == name "IO.GetStr" = ReadStr-getAction n [Constant str]-    | n == name "IO.PutStr"-        = case cast str of-             Just str' -> WriteStr str'-getAction n [_,t]-    | n == name "IO.Fork"-        = Fork t-getAction n [Constant i]-    | n == name "IO.NewLock" -        = case cast i of-             Just i' -> NewLock i'-getAction n [lock]-    | n == name "IO.DoLock"-        = DoLock (getLock lock)-    | n == name "IO.DoUnlock"-        = DoUnlock (getLock lock)-getAction n []-    | n == name "IO.NewRef" = NewRef-getAction n [_,Constant i]-    | n == name "IO.ReadRef" -        = case cast i of-             Just i' -> ReadRef i'-getAction n [_,Constant i,val]-    | n == name "IO.WriteRef"-        = case cast i of-             Just i' -> WriteRef i' val--getAction n args = CantReduce (apply (Name Unknown n) args)--getHandle  (App _ (Constant h)) = case cast h of-                                   Just h' -> h'-getLock (Constant h) = case cast h of-                         Just h' -> h'-                         Nothing -> error ("Lock error in constant " ++ show h)-getLock x = error ("Lock error " ++ show x)--continue ctxt k arg = case fastCheck ctxt (App k arg) of-                        t -> let next = whnf ctxt t in-                             runIO ctxt (view next)-{-                          Right t -> let next = whnf ctxt t in-                                         runIO ctxt (view next)-                          Left err -> fail $ "Can't happen - continue " ++ err ++ "\n" ++ show k ++ "\n" ++ show arg--}--unit = Name Unknown (name "II")--runAction ctxt (WriteStr str) k-      -- Print the string, then run the continuation with the argument 'II'-        = do putStr str-             hFlush stdout-             continue ctxt k unit-runAction ctxt ReadStr k-      -- Read a string then run the continuation with the constant str-      = do str <- getLine-           continue ctxt k (Constant str)-runAction ctxt (Fork t) k-      = do forkIO (do x <- runIO ctxt t-                      return ())-           continue ctxt k unit-runAction ctxt (NewLock n) k-      = do mv <- newQSem n-           continue ctxt k (Constant (Lock mv))-runAction ctxt (DoLock l) k-      = do primLock l-           continue ctxt k unit-runAction ctxt (DoUnlock l) k-      = do primUnlock l-           continue ctxt k unit-runAction ctxt NewRef k-      = do i <- newRef-           continue ctxt k (Constant i)-runAction ctxt (ReadRef i) k-      = do v <- getMem i-           continue ctxt k v-runAction ctxt (WriteRef i val) k-      = do putMem i val-           continue ctxt k unit-runAction ctxt (CantReduce t) k-      = do fail $ "Stuck at: " ++ show t-           -- hFlush stdout--primLock :: Lock -> IO ()-primLock (Lock lock) = do waitQSem lock--primUnlock :: Lock -> IO ()-primUnlock (Lock lock) = signalQSem lock----- Some mutable memory, for implementing IORefs idris side.--type Value = ViewTerm-defaultVal = (Constant (0xDEADBEEF::Int))--data MemState = MemState (IORef (Int, [Value]))--memory :: MemState-memory = unsafePerformIO -               (do mem <- newIORef (0, (take 100 (repeat defaultVal)))-                   return (MemState mem))--newRef :: IO Int-newRef = do let (MemState mem) = memory-            (p,ref) <- readIORef mem-            writeIORef mem (p+1, ref)-            return p--putMem :: Int -> Value -> IO ()-putMem loc val = do let (MemState mem) = memory-                    (p,content) <- readIORef mem-                    writeIORef mem (p, update content loc val)--getMem :: Int -> IO Value-getMem loc = do let (MemState mem) = memory-                (p, content) <- readIORef mem-                return (content!!!(loc, "getMem fail"))--update :: [a] -> Int -> a -> [a]-update [] _ _ = []-update (x:xs) 0 v = (v:xs)-update (x:xs) n v = x:(update xs (n-1) v)
− Idris/SCTrans.lhs
@@ -1,175 +0,0 @@-> {-# OPTIONS_GHC -fglasgow-exts #-}--Transformations at the supercombinator level.--Includes transforming data types into special case more efficient versions.-e.g. Nat -> Int, possibly List -> Block of memory, etc.--NOTE: Anything which has the shape of Nat, e.g. Fin could be converted to Nat -at an earlier stage, e.g. in ConTrans phase, then these transformations-would take effect.--> module Idris.SCTrans(transformSC, applyTransformsSC, SCTrans(..)) where--> import Idris.AbsSyntax-> import Idris.LambdaLift--> import Ivor.TT--> import Maybe-> import Debug.Trace--> data SCTrans = SCTrans String (SCBody -> SCBody)--> allSCTrans = [cfold, natCons, natCase, boolCons, boolCase, natArith, cfold]--Easier to take 'erasure' as an argument here - don't do constructor-transformations if we're not doing erasure (could do others).--> transformSC :: Bool -> SCFun -> SCFun-> transformSC erasure (SCFun c ns b) = SCFun c ns (tr b) where->     tr tm = if erasure then applyTransformsSC allSCTrans tm->                else tm--> applyTransformsSC :: [SCTrans] -> SCBody -> SCBody-> applyTransformsSC ts tm = foldl (flip doTrans) tm ts--Built-in transformations.--* Constant folding--> cfold = SCTrans "Constant Folding" con where->    con (SInfix op (SConst (Num x)) (SConst (Num y)))->        | Just r <- runOp op x y = SConst (Num r)->    con x = x->    runOp Plus x y = Just $ x+y->    runOp Minus x y = Just $ x-y->    runOp Times x y = Just $ x*y->    runOp Divide x y = Just $ x `div` y->    runOp _ x y = Nothing--* Nat constructors--> natCons = SCTrans "NatCons" ncon where->    ncon (SApp (SCon succ t) [arg]) ->           | succ == name "S" = SInfix Plus (SConst (Num 1)) arg->    ncon (SCon zero t) ->           | zero == name "O" = SConst (Num 0)->    ncon x = x--* Nat function special cases--> natArith = SCTrans "NatArith" narith where->    narith (SApp (SVar op) [x,y]) --Arithmetic can use machine operations-->           | op == name "plus" = SInfix Plus x y->           | op == name "mult" = SInfix Times x y--Conversions between nat and int are just no-ops-->    narith (SApp (SVar op) [x]) ->           | op == name "natToInt" = x->           | op == name "intToNat" = x-->    narith x = x--* Nat destructor (case)--> natCase = SCTrans "NatCase" ncase where->    ncase x@(SCCase t alts) ->     = case getNatAlts alts of->              (Just z, Just (arg, s), _) -> mkNatRHS t z (doSuc arg t s)->              (Just z, Nothing, Just d) -> mkNatRHS t z d->              (Nothing, Just (arg, s), Just d) -> mkNatRHS t d (doSuc arg t s)->              (Nothing, Nothing, Just d) -> x->              _ -> x->    ncase x = x--if t==0 then z else s-->    mkNatRHS t z s = SIfZero t z s--let arg = t - 1 in s-->    doSuc arg t s = SLet arg (SInfix Minus t (SConst (Num 1))) s-->    getNatAlts alts = let zs = mHead (mapMaybe getZeroAlt alts)->                          ss = mHead (mapMaybe getSuccAlt alts)->                          defs = mHead (mapMaybe getDefault alts) in->                                 (zs, ss, defs)->                 ->    mHead [x] = Just x->    mHead [] = Nothing->    getZeroAlt (SAlt zero t [] zrhs) ->                 | zero == name "O" = return zrhs->    getZeroAlt _ = fail "no O"->    getSuccAlt (SAlt succ t [arg] srhs) ->                 | succ == name "S" = return (arg, srhs)->    getSuccAlt _ = fail "no S"->    getDefault (SDefault drhs) = return drhs->    getDefault _ = fail "no default"---[SAlt zero t [] zrhs]]-[SAlt succ t [arg] shrs]-[SAlt zero t [] zrhs, SAlt succ t [arg] shrs, _]--* Bool constructors--> boolCons = SCTrans "BoolCons" ncon where->    ncon (SCon true t)->           | true == name "True" = SConst (Num 1)->    ncon (SCon false t) ->           | false == name "False" = SConst (Num 0)->    ncon x = x--* Bool destructor (case)--> boolCase = SCTrans "BoolCase" bcase where->    bcase x@(SCCase t alts) ->     = case getBoolAlts alts of->              (Just fc, Just tc, _) -> mkBoolRHS t fc tc->              (Just fc, Nothing, Just d) -> mkBoolRHS t fc d->              (Nothing, Just tc, Just d) -> mkBoolRHS t d tc->              (Nothing, Nothing, Just d) -> x->              _ -> x->    bcase x = x-->    mkBoolRHS t z s = SIfZero t z s-->    getBoolAlts alts = let fs = mHead (mapMaybe getFalseAlt alts)->                           ts = mHead (mapMaybe getTrueAlt alts)->                           defs = mHead (mapMaybe getDefault alts) in->                                  (fs, ts, defs)->                 ->    mHead [x] = Just x->    mHead [] = Nothing-->    getFalseAlt (SAlt false t [] frhs) ->                 | false == name "False" = return frhs->    getFalseAlt _ = fail "no O"->    getTrueAlt (SAlt true t [] trhs) ->                 | true == name "True" = return trhs->    getTrueAlt _ = fail "no True"->    getDefault (SDefault drhs) = return drhs->    getDefault _ = fail "no default"--> doTrans :: SCTrans -> SCBody -> SCBody-> doTrans (SCTrans _ trans) tm = tr tm where->     tr (SApp b bs) = trans (SApp (tr b) (map tr bs))->     tr (SLet n v sc) = trans (SLet n (tr v) (tr sc))->     tr (SCCase b alts) = trans (SCCase (tr b) (map tralt alts))->     tr (SInfix op l r) = trans (SInfix op (tr l) (tr r))->     tr (SLazy s) = trans (SLazy (tr s))->     tr (SIf i t e) = trans (SIf (tr i) (tr t) (tr e))->     tr (SIfZero i t e) = trans (SIfZero (tr i) (tr t) (tr e))->     tr s = trans s-->     tralt (SAlt n t args rhs) = SAlt n t args (tr rhs)->     tralt (SConstAlt c rhs) = SConstAlt c (tr rhs)->     tralt (SDefault rhs) = SDefault (tr rhs)---
− Idris/Serialise.lhs
@@ -1,406 +0,0 @@-> {-# OPTIONS_GHC -fglasgow-exts #-}--Binary instances for idris data structures, and saving and loading -typechecked forms to disk.--> module Idris.Serialise where--> import Idris.AbsSyntax-> import Idris.ConTrans-> import Ivor.ViewTerm-> import Ivor.TT--> import Data.Binary-> import Data.Typeable-> import Control.Monad--> import Debug.Trace--> instance Binary ViewTerm where->     put (Name t x) = do put (0 :: Word8)->                         put t; put x->     put (App f a) = do put (1 :: Word8)->                        put f; put a->     put (Lambda v ty sc) = do put (2 :: Word8)->                               put v; put ty; put sc->     put (Forall v ty sc) = do put (3 :: Word8)->                               put v; put ty; put sc->     put (Let n v ty sc) = do put (4 :: Word8)->                              put n; put v; put ty; put sc->     put Star = put (5 :: Word8)->     put Placeholder = put (6 :: Word8)->     put (Annotation a t) = do put (7 :: Word8)->                               put a; put t->     put (Metavar m) = do put (8 :: Word8)->                          put m->     put (Constant c) = case cast c :: Maybe String of->                          Just v -> do put (9 :: Word8)->                                       put v->                          Nothing -> case cast c :: Maybe Int of->                            Just v -> do put (10 :: Word8)->                                         put v->                            Nothing -> case cast c :: Maybe Double of->                               Just v -> do put (11 :: Word8)->                                            put v->                               Nothing -> case cast c :: Maybe Char of->                                 Just v -> do put (12 :: Word8)->                                              put v->                                 Nothing -> fail "Unknown constant type"-->     get = do tag <- getWord8->              case tag of->                0 -> liftM2 Name get get->                1 -> liftM2 App get get->                2 -> liftM3 Lambda get get get->                3 -> liftM3 Forall get get get->                4 -> liftM4 Let get get get get->                5 -> return Star->                6 -> return Placeholder->                7 -> liftM2 Annotation get get->                8 -> liftM Metavar get->                9 -> do s <- get->                        return (Constant (s :: String))->                10 -> do i <- get->                         return (Constant (i :: Int))->                11 -> do d <- get->                         return (Constant (d :: Double))->                12 -> do d <- get->                         return (Constant (d :: Char))---> instance Binary RBinder where->     put (Pi p l r) = do put (0 :: Word8)->                         put p; put l; put r->     put (Lam t) = do put (1 :: Word8); put t->     put (RLet t ty) = do put (2 :: Word8); put t; put ty-->     get = do tag <- getWord8->              case tag of->                0 -> liftM3 Pi get get get->                1 -> liftM Lam get->                2 -> liftM2 RLet get get--> instance Binary Op where->     put x = put (fromEnum x)->     get = do t <- get->              return (toEnum t)--> instance Binary Plicit where->     put x = put (fromEnum x)->     get = do t <- get->              return (toEnum t)--> instance Binary Fixity where->     put x = put (fromEnum x)->     get = do t <- get->              return (toEnum t)--> instance Binary Opt where->     put x = put (fromEnum x)->     get = do t <- get->              return (toEnum t)--> instance Binary TyOpt where->     put x = put (fromEnum x)->     get = do t <- get->              return (toEnum t)--> instance Binary ArgOpt where->     put x = put (fromEnum x)->     get = do t <- get->              return (toEnum t)--> instance Binary Do where->     put (DoBinding f l i t y) = do put (0 :: Word8)->                                    put f; put l; put i; put t; put y->     put (DoLet a b c d e) = do put (1 :: Word8)->                                put a; put b; put c; put d; put e->     put (DoExp a b c) = do put (2 :: Word8); put a; put b; put c-->     get = do tag <- getWord8->              case tag of->                0 -> liftM5 DoBinding get get get get get->                1 -> liftM5 DoLet get get get get get->                2 -> liftM3 DoExp get get get--> instance Binary RawTerm where->     put (RVar a b c d) = do put (0 :: Word8); put a; put b; put c; put d->     put (RExpVar a b c) = do put (1 :: Word8); put a; put b; put c->     put (RApp a b c d) = do put (2 :: Word8); put a; put b; put c; put d->     put (RAppImp a b c d e) ->        = do put (3 :: Word8); put a; put b; put c; put d; put e->     put (RBind a b c) = do put (4 :: Word8); put a; put b; put c->     put (RConst a b c) = do put (5 :: Word8); put a; put b; put c->     put RPlaceholder = put (6 :: Word8)->     put (RMetavar i) = do put (7 :: Word8); put i->     put (RInfix a b c d e) ->        = do put (8 :: Word8); put a; put b; put c; put d; put e->     put (RUserInfix a b c d e f) ->        = do put (9 :: Word8); put a; put b; put c; put d; put e; put f->     put (RDo xs) = do put (10 :: Word8); put xs->     put (RReturn a b) = do put (11 :: Word8); put a; put b->     put (RIdiom i) = do put (12 :: Word8); put i->     put (RPure i) = do put (13 :: Word8); put i->     put RRefl = do put (14 :: Word8)->     put (RError f l i) = do put (15 :: Word8); put f; put l; put i-->     get = do tag <- getWord8->              case tag of->                0 -> liftM4 RVar get get get get->                1 -> liftM3 RExpVar get get get->                2 -> liftM4 RApp get get get get->                3 -> liftM5 RAppImp get get get get get->                4 -> liftM3 RBind get get get->                5 -> liftM3 RConst get get get->                6 -> return RPlaceholder->                7 -> liftM RMetavar get->                8 -> liftM5 RInfix get get get get get->                9 -> do a <- get; b <- get; c <- get; d <- get; e <- get;->                        f <- get;->                        return $ RUserInfix a b c d e f->                10 -> liftM RDo get->                11 -> liftM2 RReturn get get->                12 -> liftM RIdiom get->                13 -> liftM RPure get->                14 -> return RRefl->                15 -> liftM3 RError get get get--> instance Binary Constant where->     put (Num i) = do put (0 :: Word8); put i->     put (Str i) = do put (1 :: Word8); put i->     put (Bo b) = do put (2 :: Word8); put b->     put (Ch c) = do put (3 :: Word8); put c->     put (Fl f) = do put (4 :: Word8); put f->     put TYPE = put (5 :: Word8)->     put StringType = put (6 :: Word8)->     put IntType = put (7 :: Word8)->     put FloatType = put (8 :: Word8)->     put CharType = put (9 :: Word8)->     put PtrType = put (10 :: Word8)->     put (Builtin i) = do put (11 :: Word8); put i-->     get = do tag <- getWord8->              case tag of->                0 -> liftM Num get->                1 -> liftM Str get->                2 -> liftM Bo get->                3 -> liftM Ch get->                4 -> liftM Fl get->                5 -> return TYPE->                6 -> return StringType->                7 -> return IntType->                8 -> return FloatType->                9 -> return CharType->                10 -> return PtrType->                11 -> liftM Builtin get--> instance Binary TransData where->     put (Force a b c d e f) = do put (0 :: Word8)->                                  put a; put b; put c; put d; put e; put f->     put (Collapse a b c d) = do put (1 :: Word8)->                                 put a; put b; put c; put d->     put (Drop a b c d) = do put (2 :: Word8)->                             put a; put b; put c; put d->     get = do tag <- getWord8->              case tag of->                0 -> do a <- get; b <- get; c <- get; d <- get;->                        e <- get; f <- get;->                        return (Force a b c d e f)->                1 -> liftM4 Collapse get get get get->                2 -> liftM4 Drop get get get get--> instance Binary Transform where->     put (Trans n _ a) = do put n; put a->     get = do n <- get; a <- get->              let trans = case a of->                            Nothing -> Nothing->                            Just a' -> Just (rebuildTrans a')->              return (Trans n trans a)--> instance Binary Syntax where->     put (Syntax f n t) = do put f; put n; put t->     get = liftM3 Syntax get get get--> instance Binary UserOps where->     put (UO ds ts f s) = do put ds; put ts; put f; put s->     get = do ds <- get; ts <- get; f <- get; s <- get;->              return (UO ds ts f s)--> instance Binary IvorFun where->     put (IvorFun a b c d e f g h) = ->         do trace ("Put " ++ show (a, d)) $ put a; put b; put c; put d; put e; put f; put g; put h->     get = do a <- get; b <- trace (show a) $ get; c <- get; d <- get; e <- get; f <- get; g <- get; h <- get->              trace ("Got " ++ show (a, d)) $ return (IvorFun a b c d e f g h)--> instance Binary CGFlag where->     put NoCG = put (0 :: Word8)->     put CGEval = put (1 :: Word8)->     put (CExport s) = do put (2 :: Word8); put s->     put Inline = put (3 :: Word8)->     put (CGSpec x) = do put (4 :: Word8); put x-->     get = do tag <- getWord8->              case tag of->                0 -> return NoCG->                1 -> return CGEval->                2 -> liftM CExport get->                3 -> return Inline->                4 -> liftM CGSpec get--> instance Binary Decl where->     put (DataDecl d) = do put (0 :: Word8); put d->     put (Fwd a b c) = do put (1 :: Word8); put a; put b; put c->     put (Fun a b) = do put (2 :: Word8); put a; put b->     put (TermDef a b c) = do put (3 :: Word8); put a; put b; put c->     put Constructor = put (4 :: Word8)->     put (Prf d f) = do put (5 :: Word8); put d; put f->     put (LatexDefs d) = do put (6 :: Word8); put d->     put (Using a b) = do put (7 :: Word8); put a; put b->     put (Params a b) = do put (8 :: Word8); put a; put b->     put (DoUsing a b c) = do put (9 :: Word8); put a; put b; put c->     put (Idiom a b c) = do put (10 :: Word8); put a; put b; put c->     put (CLib d) = do put (11 :: Word8); put d->     put (CInclude d) = do put (12 :: Word8); put d->     put (Fixity a b c) = do put (13 :: Word8); put a; put b; put c->     put (Transform a b) = do put (14 :: Word8); put a; put b->     put (Freeze a b c d) = do put (15 :: Word8); put a; put b; put c; put d->     put (SynDef a b c) = do put (16 :: Word8); put a; put b; put c->     put (PInclude a) = do put (17 :: Word8); put a->     put (Namespace a b) = do put (18 :: Word8); put a; put b-->     get = do tag <- getWord8->              case tag of->                0 -> liftM DataDecl get->                1 -> liftM3 Fwd get get get->                2 -> liftM2 Fun get get->                3 -> liftM3 TermDef get get get->                4 -> return Constructor->                5 -> liftM2 Prf get get->                6 -> liftM LatexDefs get->                7 -> liftM2 Using get get->                8 -> liftM2 Params get get->                9 -> liftM3 DoUsing get get get->                10 -> liftM3 Idiom get get get->                11 -> liftM CLib get->                12 -> liftM CInclude get->                13 -> liftM3 Fixity get get get->                14 -> liftM2 Transform get get->                15 -> liftM4 Freeze get get get get->                16 -> liftM3 SynDef get get get->                17 -> liftM PInclude get->                18 -> liftM2 Namespace get get--> instance Binary Datatype where->     put (Datatype a b c d e f g) = do put (0 :: Word8)->                                       put a; put b; put c; put d; put e;->                                       put f; put g;->     put (Latatype a b c d) = do put (1 :: Word8)->                                 put a; put b; put c; put d->     get = do tag <- getWord8->              case tag of->                0 -> do a <- get; b <- get; c <- get; d <- get;->                        e <- get; f <- get; g <- get;->                        return (Datatype a b c d e f g)->                1 -> liftM4 Latatype get get get get--> instance Binary Function where->     put (Function a b c d e) = do put a; put b; put c; put d; put e->     get = liftM5 Function get get get get get--> instance Binary Proof where->     put (Proof a b c) = do put a; put b; put c->     get = liftM3 Proof get get get--> instance Binary RawClause where->     put (RawClause a b) = do put (0 :: Word8); put a; put b->     put (RawWithClause a b c d) = do put (1 :: Word8); put a; put b; put c; put d->     get = do tag <- getWord8->              case tag of->                0 -> liftM2 RawClause get get->                1 -> liftM4 RawWithClause get get get get--> instance Binary Patterns where->     put (Patterns p) = put p->     get = liftM Patterns get--> instance Binary PClause where->     put (PClause a b c) = do put (0 :: Word8); put a; put b; put c->     put (PWithClause a b c d) = do put (1 :: Word8); put a; put b; put c; put d->     get = do tag <- getWord8->              case tag of->                0 -> liftM3 PClause get get get->                1 -> liftM4 PWithClause get get get get--> instance Binary Inductive where->     put (Inductive a b c d e) = do put a; put b; put c; put d; put e->     get = liftM5 Inductive get get get get get--> instance Binary ITactic where->     put (Intro a) = do put (0 :: Word8); put a->     put (Refine a) = do put (1 :: Word8); put a->     put (Generalise a) = do put (2 :: Word8); put a->     put ReflP = put (3 :: Word8)->     put (Induction a) = do put (4 :: Word8); put a->     put (Fill a) = do put (5 :: Word8); put a->     put Trivial = put (6 :: Word8)->     put (Idris.AbsSyntax.Case a) = do put (7 :: Word8); put a->     put (Rewrite a b c) = do put (8 :: Word8); put a; put b; put c->     put (Unfold a) = do put (9 :: Word8); put a->     put Compute = put (10 :: Word8)->     put (Equiv a) = do put (11 :: Word8); put a->     put (Believe a) = do put (12 :: Word8); put a->     put (Use a) = do put (13 :: Word8); put a->     put (Decide a) = do put (14 :: Word8); put a->     put (RunTactic a) = do put (15 :: Word8); put a->     put Qed = put (16 :: Word8)-->     get = do tag <- getWord8->              case tag of->                0 -> liftM Intro get->                1 -> liftM Refine get->                2 -> liftM Generalise get->                3 -> return ReflP->                4 -> liftM Induction get->                5 -> liftM Fill get->                6 -> return Trivial->                7 -> liftM Idris.AbsSyntax.Case get->                8 -> liftM3 Rewrite get get get->                9 -> liftM Unfold get->                10 -> return Compute->                11 -> liftM Equiv get->                12 -> liftM Believe get->                13 -> liftM Use get->                14 -> liftM Decide get->                15 -> liftM RunTactic get->                16 -> return Qed--> instance Binary IvorDef where->     put (PattDef ps) = do put (0 :: Word8); put ps->     put ITyCon = put (1 :: Word8)->     put IDataCon = put (2 :: Word8)->     put (SimpleDef t) = do put (3 :: Word8); put t->     put (DataDef a b) = do put (4 :: Word8); put a; put b->     put (IProof ts f) = do put (5 :: Word8); put ts; put f->     put Later = put (6 :: Word8)->     put LataDef = put (7 :: Word8)-->     get = do tag <- getWord8->              case tag of->                0 -> liftM PattDef get->                1 -> return ITyCon->                2 -> return IDataCon->                3 -> liftM SimpleDef get->                4 -> liftM2 DataDef get get->                5 -> liftM2 IProof get get->                6 -> return Later->                7 -> return LataDef--> instance Binary IdrisState where->     put (IState a b c d e f g h i j k) ->        = do put a; put b; put c; put d; put e; put f; put g; put h; ->             put i; put j; put k->     get = do a <- get; b <- get; c <- get;->              d <- get; e <- get; f <- get; g <- get; h <- get; i <- get->              j <- get; k <- get->              return (IState a b c d e f g h i j k)-
− Idris/SimpleCase.lhs
@@ -1,135 +0,0 @@-> {-# OPTIONS_GHC -fglasgow-exts #-}--> module Idris.SimpleCase(liftCases, addPatternDefSC, addMeta) where--> import Idris.AbsSyntax--> import Ivor.ViewTerm-> import Ivor.TT--> import Control.Monad.State-> import Debug.Trace--> type LCState = (Int, [(Name, ViewTerm, Patterns)])--> liftCases :: Name -> Patterns -> (Patterns, [(Name, ViewTerm, Patterns)])-> liftCases n ps ->      = let (ps', (i, ns)) = runState (liftCasePatts n ps) (10000, []) in->            {- trace (show (ps', ns)) $ -} (ps', ns)--> liftCasePatts :: Name -> Patterns -> ->                  State LCState Patterns-> liftCasePatts n (Patterns ps) ->               = do ps' <- liftPs ps []->                    (_, ns) <- get->                    return (Patterns ps')->    where liftPs [] acc = return acc->          liftPs ((PClause args bs rv):ps) acc->                    = do rv' <- lc n bs rv->                         liftPs ps (acc ++ [PClause args bs rv'])->          liftPs ((PWithClause p args sc pdefs):ps) acc->                    = do sc' <- lc n [] sc->                         pdefs' <- liftCasePatts n pdefs->                         liftPs ps (acc ++ [PWithClause p args sc' pdefs'])---> lc :: Name -> [(Name, ViewTerm)] -> ViewTerm -> State LCState ViewTerm -> lc root bs = lc' where->  lc' tm | Name nty fn <- getApp tm->       = let args = getFnArgs tm in->            if (fn == name "__CASE" && length args == 4)then ->                 do (i, fns) <- get->                    let params = bs->                    let paramArgs = map (Name Unknown) (map fst params)->                    let newdef = Patterns (getNewDef paramArgs (deAnnot (args!!!(3,"FAIL3"))))->                    let argtype = args!!!(0, "FAIL0")->                    let rettype = args!!!(1, "FAIL1")->                    let scrutinee = args!!!(2, "FAIL2")->                    let newty = getNewType params argtype rettype->                    let newname = name (show (MN (show root) i))->                    let newfn = (newname, newty, newdef)->                    put (i+1, newfn:fns)->                    -- trace (show (newname, params, newdef)) $->                    return (apply (Name Unknown newname) (paramArgs++[scrutinee]))->                 else return tm->  lc' (App f a) = do f' <- lc' f; a' <- lc' a; return (App f' a')->  lc' (Lambda n t sc) ->    = do t' <- lc' t; sc' <- lc' sc; return (Lambda n t' sc')->  lc' (Forall n t sc) ->    = do t' <- lc' t; sc' <- lc' sc; return (Forall n t' sc')->  lc' (Let n t v sc) ->    = do t' <- lc' t; v' <- lc' v; ->         sc' <- lc' sc; return (Let n t' v' sc')->  lc' (Annotation a t) = do t' <- lc' t; return (Annotation a t')->  lc' x = return x--> getNewDef :: [ViewTerm] -> ViewTerm -> [PClause]-> getNewDef ps (Let _ _ _ sc) = getNewDef ps sc-> getNewDef ps (App (App (App (App (App (Name _ branch) _) _) patt) ret) next)->           | branch == name "__BRANCH"->                = PClause (ps++[patt]) [] ret ->                    : getNewDef ps next-> getNewDef ps x = []--> getParams :: ViewTerm -> [(Name, ViewTerm)]-> getParams (App (App (App (Name _ is) ty) (Name _ n)) rest)->           | is == name "__IS" = (n, ty):getParams rest-> getParams _ = []--> getNewType :: [(Name, ViewTerm)] -> ViewTerm -> ViewTerm -> ViewTerm-> getNewType [] arg ret = Forall (name "__X") arg ret-> getNewType ((n,ty):ns) arg ret = Forall n ty (getNewType ns arg ret)--> deAnnot :: ViewTerm -> ViewTerm-> deAnnot (Annotation a t) = deAnnot t-> deAnnot (App f a) = App (deAnnot f) (deAnnot a)-> deAnnot x = x--> addPatternDefSC :: Context -> Name -> ViewTerm -> Patterns -> ->                    Maybe [(Name, Int)] -> Statics ->->                    TTM (Context, [(Name, ViewTerm)])-> addPatternDefSC ctxt nm ty ps specopts sts = do->     -- just allow general recursion for now->     let opts = [Holey, Partial, GenRec]--case specopts of-                  Nothing -> [Holey, Partial, GenRec]-                  Just fns -> trace ("Specialising " ++ show nm ++ " with " ++ show (map mkss sts)) $ -                              [Holey, Partial, GenRec], Specialise fns,-                               SpecStatic (map mkss sts)]-->     (ctxt', newdefs) <- addPatternDef ctxt nm ty ps opts->     ctxt' <- case specopts of->                Nothing -> return ctxt'->                Just fns -> trace ("Specialising " ++ show nm ++ " with " ++ show (map mkss sts)) $ ->                            spec ctxt' nm (map mkss sts) (map fst fns)->     (_, patts) <- getPatternDef ctxt' nm->     let (ps', ds) = liftCases nm patts->     if (null ds) then return (ctxt', newdefs)->        else do->          (ctxt', newdefs) <- addAll ctxt ds []->          (ctxt', newdefs') <- addPatternDef ctxt' nm ty ps' [Holey,Partial,GenRec]->          return (ctxt', newdefs++newdefs')->  where addAll ctxt [] nds = return (ctxt, nds)->        addAll ctxt ((n,ty,ps):rs) nds = do->          (ctxt', newdefs') <- addPatternDefSC ctxt n ty ps specopts sts->          addAll ctxt' rs (newdefs'++nds) ->        mkss (n, (statics, arity, ty)) = (n, (statics, arity))--> addMeta :: Bool ->->            Ctxt IvorFun -> Context -> ->           [(Name, ViewTerm)] -> [(Name, ViewTerm)] -> ->            TTM (Context, [(Name, ViewTerm)])-> addMeta verbose raw ctxt metas newdefs->       = let ans = (ctxt, metas ++ newdefs) in->                   if verbose then trace ("Metavariables are:\n" ++  concat (map showDef newdefs)) $ return ans->                              else return ans->    where->          showDef (n,ty) = "  " ++ show n ++ " : " ++ dumpMeta (unIvor raw ty)->                           ++ "\n"->          dumpMeta tm = showImp False (Idris.AbsSyntax.getRetType tm) ++ ->                        "\n  in environment\n" ++ ->                        dumpArgs (Idris.AbsSyntax.getArgTypes tm)->          dumpArgs [] = ""->          dumpArgs ((n,ty):xs) = "    " ++ show n ++ " : " ++showImp False ty->                                 ++ "\n" ++ dumpArgs xs
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2006-2010 Edwin Brady+Copyright (c) 2011 Edwin Brady     School of Computer Science, University of St Andrews All rights reserved. 
− Main.lhs
@@ -1,719 +0,0 @@-> module Main where--> import Ivor.TT hiding (transform)-> import Ivor.Shell--> import System-> import System.Environment-> import System.Time-> import System.Locale-> import System.IO-> import System.Console.Readline-> import Data.Typeable-> import Data.Binary-> import Char-> import Control.Monad-> import Control.Exception-> import List-> import Maybe-> import Debug.Trace-> import Distribution.Version-> import Prelude hiding (catch)--> import Idris.AbsSyntax-> import Idris.MakeTerm-> import Idris.Lib-> import Idris.Parser-> import Idris.Latex-> import Idris.Compiler-> import Idris.Prover-> import Idris.ConTrans-> import Idris.Fontlock-> import Idris.Serialise-> import Idris.RunIO-> import Idris.PartialEval--> import Paths_idris--Load things in this order:--* Introduce equality-* Load builtins (which don't rely on primitive types)-* Add primitives-* Load prelude-* Load users program--> idris_version = showV (versionBranch version)->   where->     showV [] = ""->     showV [a] = show a->     showV (x:xs) = show x ++ "." ++ showV xs--> data Args = Batch [String]->           | NoArgs--> main :: IO ()-> main = do args <- getArgs->           (infile, (batch, opts)) <- usage args->           ctxt <- ioTac $ addEquality emptyContext (name "Eq") (name "refl")->           (ctxt, defs) <- processInput ctxt (initState opts) "builtins.idr"->           ctxt <- ioTac $ prims ctxt->           (ctxt, defs) <- processInput ctxt defs "prelude.idr"->           (ctxt, defs) <- processInput ctxt defs infile->           let vars = idris_metavars defs->           when (not (null vars)) $->               do putStr "Proof obligations:\n\t"->                  print (map fst vars)->                  putStr "\n"->           repl defs ctxt batch--> usage opts@(('-':_):_) = do o <- mkArgs opts->                             putStrLn "No input file"->                             umessage-> usage [fname] = return (fname, (NoArgs, []))-> usage (fname:opts) = do o <- mkArgs opts->                         return (fname, o)-> usage _ = umessage--> umessage = ->   do putStrLn $ "Idris version " ++ idris_version->      putStrLn $ "--------------" ++ take (length idris_version) (repeat '-')->      putStrLn $ "Usage:"->      putStrLn $ "\tidris <source file> [options]"->      putStrLn $ "\n\tAvailable options:"->      putStrLn $ "\t\t -o <executable>   Compile to an executable"->      putStrLn $ "\t\t --run             Compile and run"->      putStrLn $ "\t\t --nospec          Turn off specialisation and transformation rules"->      putStrLn $ "\t\t --noerasure       Turn off erasure optimisations"->      putStrLn $ "\t\t --cmd <command>   Run a command in batch mode"->      putStrLn $ "\t\t --dir             Show support file location"->      putStrLn $ "\t\t --verbose         Debugging output"->      putStrLn $ "\n"->      exitWith (ExitFailure 1)--> mkArgs xs = mkA' [] [] xs where->     mkA' [] opts [] = return (NoArgs, opts)->     mkA' args opts [] = return (Batch (reverse args), opts)->     mkA' args opts ("-o":output:xs) ->           = mkA' ((":c " ++ output):args) opts xs->     mkA' args opts ("--run":xs) ->           = mkA' (":e":args) opts xs->     mkA' args opts ("-v":xs)->           = mkA' args (Verbose:opts) xs->     mkA' args opts ("--verbose":xs)->           = mkA' args (Verbose:opts) xs->     mkA' args opts ("--nospec":xs)->           = mkA' args (NoSpec:opts) xs->     mkA' args opts ("--noerasure":xs)->           = mkA' args (NoErasure:opts) xs->     mkA' args opts ("--cmd":b:xs)->           = mkA' (b:args) opts xs->     mkA' args opts ("--dir":xs)->           = do d <- getDataDir->                putStrLn d->                exitWith ExitSuccess->     mkA' args opts (x:xs) = do putStrLn $ "Unrecognised option " ++ x ++ "\n"->                                umessage--Time functions-FIXME: These use System.Time which is deprecated. Find out what to use-these days instead...--> picosec = 1000000000000-> mins = picosec*60-> hours = mins*60-> days = hours*24--> getTime :: IO Integer -> getTime = do (TOD sec pico) <- getClockTime->              return $ sec*picosec+pico-> diffTime t1 t2 = t1-t2-> showTime t = show (t `div` picosec) ++ "." ++ ->              (take 6 (zeros (show (t `mod` picosec)))) ++->              " seconds"->          -- add leading zeros->    where zeros t = (take (12 - length t) (repeat '0')) ++ t --> processInput :: Context -> IdrisState -> FilePath ->->                 IO (Context, IdrisState)-> processInput ctxt ist file = do->     let defs = idris_context ist->     let decls = idris_decls ist->     let opts = idris_options ist->     let fixes = idris_fixities ist->     let static = idris_static ist->     let sts = idris_static_used ist->     content <- readLibFile defaultLibPath file->     (ptree, imps) <- processImports opts (idris_imports ist) (parse content file)->     let (defsin, ops) = makeIvorFuns opts defs ptree fixes->     let static' = staticDecls defsin ++ static->     let defs' = defsin -- addPEdefs static' defsin->     let alldefs = appCtxt defs defs'->     ((ctxt, metas), fixes', sts') <- ->         case (addIvor opts ist alldefs defs' ctxt ops static' sts) of->             OK x fixes' sts' -> return (x, fixes', sts')->             Err x fixes' sts' err -> do putStrLn err ->                                         return (x, fixes', sts')->     let ist = addTransforms (IState alldefs (decls ++ ptree) metas opts ops [] newCtxt imps (mkNameMap alldefs) static' sts') ctxt ->     return (ctxt, ist { idris_fixities = fixes' })--> data REPLRes = Quit | Continue | NewCtxt IdrisState Context--Command; minimal abbreviation; function to run it; description; visibility--> commands->    = [("quit", "q", quit, "Exits the top level",True),->       ("type", "t", tmtype, "Print the type of a term",True),->       ("prove", "p", prove, "Begin a proof of an undefined name",True),->       ("metavars", "m", metavars, ->                    "Show remaining proof obligations",True),->       ("ivor", "i", ivor, "Drop into the Ivor shell",True),->       ("compile", "c", tcomp, "Compile a definition (of type IO ()", True),->       ("execute", "e", texec, "Compile and execute 'main'", True),->       ("LATEX", "L", latex, "Render a source file as LaTeX",False),->       ("HTML","H", html, "Render a source file as html", False),->       ("normalise", "n", norm, "Normalise a term (without executing)", True),->       ("definition", "d", showdef, "Show the erased version of a function or type", True),->       ("options","o", options, "Set options", True),->       ("help", "h", help, "Show help text",True),->       ("save", "s", ssave, "Save system state",True),->       ("load", "l", sload, "Load system state",True),->       ("xdebug", "xd", debug, "Show some internal stuff", False),->       ("?", "?", help, "Show help text",True)]--> type Command = IdrisState -> Context -> [String] -> IO REPLRes--> quit, tmtype, prove, metavars, tcomp, texec :: Command -> debug, norm, help, options, showdef, html, ssave :: Command--> quit _ _ _ = do return Quit-> tmtype (IState raw _ _ _ uo _ _ _ _ _ _) ctxt tms ->            = do icheckType raw uo ctxt (unwords tms)->                 return Continue-> prove ist ctxt (nm:[]) ->           = do let raw = idris_context ist->                ctxt' <- doProof raw ctxt (idris_fixities ist) (UN nm)->                let imv = filter (\ (x,y) -> x /= toIvorName (UN nm))->                              (idris_metavars ist)->                let ist' = ist { idris_metavars = imv }->                return (NewCtxt ist' ctxt')-> prove ist ctxt _ = do putStrLn "What do you want to prove?"->                       return Continue-> metavars ist ctxt _->           = do let vars = idris_metavars ist->                if (null vars)->                   then putStrLn "All proofs complete."->                   else ->                     do putStr "Proof obligations:\n\t"->                        print (map fst vars)->                        putStr "\n"->                return Continue-> ivor ist ctxt _ = do ctxt' <- doIvor ctxt->                      return (NewCtxt ist ctxt')-- latex ist ctxt (nm:defs) -           = do latexDump (idris_context ist) (latexDefs defs) (UN nm)-                return Continue--> html ist ctxt (nm:onm:style:_)->           = do htmlise (idris_context ist) nm onm (Just style)->                return Continue-> html ist ctxt (nm:onm:_)->           = do htmlise (idris_context ist) nm onm Nothing->                return Continue-> html ist ctxt _->           = do putStrLn "Please give input and output files"->                return Continue-> ssave ist ctxt (nm:_)->           = do encodeFile nm ist->                return Continue-> ssave ist ctxt _->           = do putStrLn "Please give an output file name"->                return Continue-> sload ist ctxt (nm:_)->           = do ist' <- decodeFile nm->                return (NewCtxt ist' ctxt)-> sload ist ctxt _->           = do putStrLn "Please give an input file name"->                return Continue-> latex ist ctxt (nm:onm:_)->           = do latexise (idris_context ist) nm onm->                return Continue-> latex ist ctxt _->           = do putStrLn "Please give input and output files"->                return Continue-> debug ist ctxt []->           = do putStrLn "Fixities/transforms\n"->                print (idris_fixities ist)->                putStrLn "\nStatic args:\n"->                print (idris_static ist)->                print (idris_static_used ist)->                return Continue-> tcomp ist ctxt [] ->           = do putStrLn "Please give an output filename"->                return Continue-> tcomp ist ctxt (top:[]) ->           = do let raw = idris_context ist->                comp ist ctxt (UN top) top->                -- putStrLn $ "Output " ++ top->                return Continue-> tcomp ist ctxt (top:exec:_) ->           = do comp ist ctxt (UN top) exec->                return Continue-> texec ist ctxt _ ->           = do time <- getTime->                res <- comp ist ctxt (UN "main") "main"->                ctime <- getTime->                let cdiff = diffTime ctime time->                when (ShowRunTime `elem` (idris_options ist))->                     (putStrLn $ "Compile time: " ++ showTime cdiff ++ "\n")->                when res (do system "./main"->                             return ())->                rtime <- getTime->                let rdiff = diffTime rtime ctime->                when (ShowRunTime `elem` (idris_options ist))->                     (putStrLn $ "\nRun time: " ++ showTime rdiff)->                return Continue-> norm ist ctxt tms ->          = do let raw = idris_context ist->               termInput False raw (idris_fixities ist) ctxt (unwords tms)->               return Continue-> options ist ctxt []->          = do putStrLn $ "Options: " ++ show (idris_options ist)->               return Continue-> options ist ctxt tms ->          = do let opts = idris_options ist->               let ist' = addTransforms (ist { idris_options = processOpts opts tms }) ctxt->               return $ NewCtxt ist' ctxt--> help _ _ _ ->    = do putStrLn $ "\nIdris version " ++ idris_version->         putStrLn $ "----------------" ++ take (length idris_version) (repeat '-')->         putStrLn "Commands available:\n"->         putStrLn "\t<expression>     Execute the given expression"->         mapM_ (\ (com, _, _, desc,vis) -> ->                    if vis ->                       then putStrLn $ "\t:" ++ com ++ (take (16-length com) (repeat ' ')) ++ desc->                       else return ()) commands->         putStrLn "\nCommands may be given the shortest unambiguous abbreviation (e.g. :q, :l)\n"->         return Continue--> repl :: IdrisState -> Context -> Args -> IO ()-> repl ist ctxt (Batch []) = return () -> repl ist@(IState raw decls metas opts fixes trans syns imps nms st stu) ctxt inp' ->          = do (inp, next) <- case inp' of ->                        Batch (b:bs) -> return (Just b, Batch bs)->                        _ -> do x <- readline ("Idris> ")->                                return (x, NoArgs)->               res <- case inp of->                        Nothing ->->                            do putChar '\n'->                               return Quit->                        Just (':':command) -> ->                            do addHistory (':':command)->                               runCommand' (words command) commands->                        Just exprinput -> ->                            do termInput' raw fixes ctxt exprinput->                               addHistory exprinput->                               return Continue->               case res of->                      Continue -> repl ist ctxt next->                      NewCtxt ist' ctxt' -> repl ist' ctxt' next->                      Quit -> return ()-->   where->      runCommand (c:args) ((_, abbr, fun, _, _):xs) ->         | matchesAbbrev abbr c = fun ist ctxt args->         | otherwise = runCommand (c:args) xs->      runCommand _ _ = do putStrLn "Unrecognised command"->                          help ist ctxt []->                          return Continue->      matchesAbbrev [] _ = True->      matchesAbbrev (a:xs) (c:cs) | a == c = matchesAbbrev xs cs->                                  | otherwise = False->      matchesAbbrev _ _ = False-->      termInput' r f c inp = handle handler $ termInput True r f c inp->         where handler StackOverflow = putStrLn "Stack overflow"->               handler UserInterrupt = putStrLn "Interrupted"->               handler e             = print e -- throwIO e->      runCommand' w c = handle handler $ runCommand w c->         where handler e = do print (e :: IOError)->                              return Continue--> termInput runio raw uo ctxt tm ->         = case getTerm tm of->                Right tm -> execEval runio raw ctxt (tm, viewType tm)->                Left err -> print err->   where getTerm tm = do let parsed' = parseTerm tm->                         case parsed' of->                           Success parsed -> do->                              let itm = makeIvorTerm noImplicit defDo uo (UN "__main") raw parsed->                              check ctxt itm->                           Failure err f l -> ttfail err--If it is an IO type, execute it, otherwise just eval it.--> execEval :: Bool -> Ctxt IvorFun -> Context -> (Term, ViewTerm) -> IO ()-> execEval True ivs ctxt (tm, (App (Name _ io) _))->          | io == name "IO.IO" = do catch (exec ctxt tm)->                                       (\e -> print (e :: IOError))->                                 -- putStrLn $ show (whnf ctxt tm)-> execEval runio ivs ctxt (tm, _) ->         = do let res = (evalnew ctxt tm)->              -- print res->              -- putStrLn (showImp True (unIvor ivs (view res)))->              putStr (showImp False (unIvor ivs (view res)))->              putStrLn $ " : " ++ showImp False (unIvor ivs (viewType res))--> icheckType :: Ctxt IvorFun -> UserOps -> Context -> String -> IO ()-> icheckType ivs uo ctxt tmin->         = case parseTerm tmin of ->               Success tm -> ->                    do let itm = makeIvorTerm noImplicit defDo uo (UN "__main") ivs tm->                       gtm <- ioTac $ check ctxt itm->                       putStrLn $ showImp False (unIvor ivs (viewType gtm))->               Failure err _ _ -> putStrLn err---> processOpts :: [Opt] -> [String] -> [Opt]-> processOpts opts [] = opts-> processOpts opts (x:xs) = processOpts (processOpt opts x) xs--> processOpt opts "f-" = nub (NoErasure:opts)-> processOpt opts "r+" = nub (ShowRunTime:opts)--> processOpt opts "f+" = (nub opts) \\ [NoErasure]-> processOpt opts "r-" = (nub opts) \\ [ShowRunTime]--> processOpt opts _ = opts -- silently ignore (FIXME)--Look up the name as a pattern definition, then as an inductive, and show-the appropriate thing, after applying the relevant transformations.--> showdef ist ctxt []->      = do putStrLn "Please give a name"->           return Continue-> showdef ist ctxt (n:_)->     = do case getPatternDef ctxt (name n) of->            Right (ty, pats) -> do showPDefs n (idris_context ist) (transform ctxt [] (transforms (idris_fixities ist)) (name n) pats)->                                   putStrLn "Compiles as:\n"->                                   showPats n (idris_context ist) (transform ctxt ->                                              (idris_transforms ist)->                                              (transforms (idris_fixities ist))->                                               (name n) pats)->                                   -- let Right (args, sc) = getCompiledPatternDef ctxt (name n)->                                   -- putStrLn "\nInternally compiled as:\n"->                                   -- print (args, sc)->            _ -> case getInductive ctxt (name n) of->                   Right ind -> showInductive n ctxt (idris_transforms ist) ->                                               (constructors ind)->                   _ -> putStrLn $ n ++ " not defined"->          return Continue--> showPats :: String -> Ctxt IvorFun -> Patterns -> IO ()-> showPats n ivs (Patterns ps) = putStrLn $ concat (map (\x -> showp' x ++ "\n") ps)->   where showp' (PClause args _ ty) ->                    = n ++ " " ++ concat (map (\x -> showarg (show x)) args) ++ "= " ++ showId ty->         showarg x = if (' ' `elem` x) then "(" ++ x ++ ") " else x ++ " "->         showId res = show res -- showImp True (unIvor ivs res)--> showPDefs :: String -> Ctxt IvorFun -> Patterns -> IO ()-> showPDefs n ivs (Patterns ps) = putStrLn $ concat (map (\x -> showp' x ++ "\n") ps)->   where showp' (PClause args _ ty) ->                    = n ++ " " ++ concat (map (\x -> showarg (show x)) args) ++ "= " ++ showId ty->         showarg x = if (' ' `elem` x) then "(" ++ x ++ ") " else x ++ " "->         showId res = showImp False (unIvor ivs res)--> showInductive :: String -> Context -> [Transform] -> ->                  [(Name, ViewTerm)] -> IO ()-> showInductive n ctxt trans cons ->    = do putStrLn $ n ++ " constructors:"->         putStrLn $ concat (map (\x -> "  " ++ showc x ++ "\n") cons)->  where showc (n, ty) = let atys = Ivor.TT.getArgTypes ty ->                            args = map mkName atys->                            app = apply (Name DataCon n) args in->                            show (applyTransforms ctxt trans app)->        mkName (n, ty) = Name Unknown (name (showarg (useName (show n) ty)))->        useName ('_':'_':_) ty = show ty->        useName n ty = n ++ " : " ++ show ty->        showarg x = if (' ' `elem` x) then "(" ++ x ++ ")" else x--> prims c = do c <- addPrimitive c (name "Int")->              c <- addPrimitive c (name "Char")->              c <- addPrimitive c (name "Float")->              c <- addPrimitive c (name "String")->              c <- addPrimitive c (name "Lock")->              c <- addPrimitive c (name "Handle")->              c <- addPrimitive c (name "Ptr")->              c <- addBinOp c (opFn Plus) ((+)::Int->Int->Int) "Int->Int->Int"->              c <- addBinOp c (opFn Minus) ((-)::Int->Int->Int)->                                "Int->Int->Int"->              c <- addBinOp c (opFn Times) ((*)::Int->Int->Int)->                                "Int->Int->Int"->              c <- addBinOp c (opFn Divide) (div::Int->Int->Int)->                                "Int->Int->Int"->              c <- addBinOp c (opFn Modulo) (mod::Int->Int->Int)->                                "Int->Int->Int"->              c <- addBinOp c (opFn FPlus) ((+)::Double->Double->Double) "Float->Float->Float"->              c <- addBinOp c (opFn FMinus) ((-)::Double->Double->Double)->                                "Float->Float->Float"->              c <- addBinOp c (opFn FTimes) ((*)::Double->Double->Double)->                                "Float->Float->Float"->              c <- addBinOp c (opFn FDivide) ((/)::Double->Double->Double)->                                "Float->Float->Float"->              c <- addBinOp c (opFn Concat) ((++)::String->String->String)->                                "String->String->String"->              c <- addBinOp c (opFn StringGetIndex) ->                       ((\str i -> str!!!(i,"stringGetIndex fail"))::String->Int->Char)->                                "String->Int->Char"->              c <- addBinOp c (opFn ShL) (shl::Int->Int->Int) "Int->Int->Int"->              c <- addBinOp c (opFn ShR) (shr::Int->Int->Int) "Int->Int->Int"->              c <- addExternalFn c (opFn OpEq) 2 constEq "Int->Int->Bool"->              c <- addExternalFn c (name "__charEq") 2 constEq "Char->Char->Bool"->              c <- addExternalFn c (name "__strEq") 2 constEq "String->String->Bool"->              c <- addExternalFn c (name "__strLT") 2 constLT "String->String->Bool"->              c <- addExternalFn c (opFn OpLT) 2 intlt "Int->Int->Bool"->              c <- addExternalFn c (opFn OpLEq) 2 intle "Int->Int->Bool"->              c <- addExternalFn c (opFn OpGT) 2 intgt "Int->Int->Bool"->              c <- addExternalFn c (opFn OpGEq) 2 intge "Int->Int->Bool"-->              c <- addExternalFn c (opFn OpFEq) 2 constEq "Float->Float->Bool"->              c <- addExternalFn c (opFn OpFLT) 2 floatlt "Float->Float->Bool"->              c <- addExternalFn c (opFn OpFLEq) 2 floatle "Float->Float->Bool"->              c <- addExternalFn c (opFn OpFGT) 2 floatgt "Float->Float->Bool"->              c <- addExternalFn c (opFn OpFGEq) 2 floatge "Float->Float->Bool"-->              c <- addExternalFn c (opFn FloatToString) 1 floatToString "Float->String"->              c <- addExternalFn c (opFn ToString) 1 intToString "Int->String"->              c <- addExternalFn c (opFn ToInt) 1 stringToInt "String->Int"->              c <- addExternalFn c (opFn StringToFloat) 1 stringToFloat "String->Float"->              c <- addExternalFn c (opFn IntToChar) 1 intToChar "Int->Char"->              c <- addExternalFn c (opFn CharToInt) 1 charToInt "Char->Int"->              c <- addExternalFn c (opFn StringLength) 1 stringLen "String->Int"->              c <- addExternalFn c (opFn StringHead) 1 stringHead "String->Char"->              c <- addExternalFn c (opFn StringTail) 1 stringTail "String->String"->              c <- addExternalFn c (opFn StringCons) 2 stringCons "Char->String->String"->              c <- addExternalFn c (opFn StringRev) 1 stringRev "String->String"->              c <- addExternalFn c (opFn StringSub) 3 stringSub "String->Int->Int->String"->              c <- addExternalFn c (opFn StringFind) 2 stringFind "String->Char->Int"->              c <- addExternalFn c (name "__Prove_Anything") 3 proveAnything->                                   "(A:*)->(B:*)->A->B"->              c <- addExternalFn c (name "__lazy") 1 runLazy "(A:*)A->A"->              c <- addExternalFn c (name "__effect") 1 runEffect "(A:*)A->A"->              return c--> shl :: Int -> Int -> Int-> shl x 0 = x-> shl x n = shl (x*2) (n-1)--> shr :: Int -> Int -> Int-> shr x 0 = x-> shr x n = shr (x `div` 2) (n-1)--> constEq :: [ViewTerm] -> Maybe ViewTerm-> constEq [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")->           _ -> Nothing-> constEq _ = Nothing--> constLT :: [ViewTerm] -> Maybe ViewTerm-> constLT [Constant x, Constant y]->       = case (cast x, cast y) :: (Maybe String, Maybe String) of->           (Just x', Just y') -> if (x'<y')->                        then Just $ Name DataCon (name "True")->                        else Just $ Name DataCon (name "False")->           _ -> Nothing -- Just $ Name DataCon (name "False")-- constEq [_, x, y] = if (x == y) then Just $ Name DataCon (name "True")-                        else Just $ Name DataCon (name "False")--> constLT _ = Nothing--> intlt :: [ViewTerm] -> Maybe ViewTerm-> intlt [Constant x, Constant y]->       = case (cast x, cast y) of->           (Just x', Just y') -> if (x'<(y'::Int))->                            then Just $ Name DataCon (name "True")->                            else Just $ Name DataCon (name "False")->           _ -> Nothing-> intlt _ = Nothing--> intle :: [ViewTerm] -> Maybe ViewTerm-> intle [Constant x, Constant y]->       = case (cast x, cast y) of->           (Just x', Just y') -> if (x'<=(y'::Int))->                        then Just $ Name DataCon (name "True")->                        else Just $ Name DataCon (name "False")->           _ -> Nothing-> intle _ = Nothing--> intgt :: [ViewTerm] -> Maybe ViewTerm-> intgt [Constant x, Constant y]->       = case (cast x, cast y) of->           (Just x', Just y') -> if (x'>(y'::Int))->                        then Just $ Name DataCon (name "True")->                        else Just $ Name DataCon (name "False")->           _ -> Nothing-> intgt _ = Nothing--> intge :: [ViewTerm] -> Maybe ViewTerm-> intge [Constant x, Constant y]->       = case (cast x, cast y) of->           (Just x', Just y') -> if (x'>=(y'::Int))->                        then Just $ Name DataCon (name "True")->                        else Just $ Name DataCon (name "False")->           _ -> Nothing-> intge _ = Nothing--> floatlt :: [ViewTerm] -> Maybe ViewTerm-> floatlt [Constant x, Constant y]->       = case (cast x, cast y) of->           (Just x', Just y') -> if (x'<(y'::Double))->                            then Just $ Name DataCon (name "True")->                            else Just $ Name DataCon (name "False")->           _ -> Nothing-> floatlt _ = Nothing--> floatle :: [ViewTerm] -> Maybe ViewTerm-> floatle [Constant x, Constant y]->       = case (cast x, cast y) of->           (Just x', Just y') -> if (x'<=(y'::Double))->                        then Just $ Name DataCon (name "True")->                        else Just $ Name DataCon (name "False")->           _ -> Nothing-> floatle _ = Nothing--> floatgt :: [ViewTerm] -> Maybe ViewTerm-> floatgt [Constant x, Constant y]->       = case (cast x, cast y) of->           (Just x', Just y') -> if (x'>(y'::Double))->                        then Just $ Name DataCon (name "True")->                        else Just $ Name DataCon (name "False")->           _ -> Nothing-> floatgt _ = Nothing--> floatge :: [ViewTerm] -> Maybe ViewTerm-> floatge [Constant x, Constant y]->       = case (cast x, cast y) of->           (Just x', Just y') -> if (x'>=(y'::Double))->                        then Just $ Name DataCon (name "True")->                        else Just $ Name DataCon (name "False")->           _ -> Nothing-> floatge _ = Nothing--> intToString :: [ViewTerm] -> Maybe ViewTerm-> intToString [Constant x]->             = case cast x of->                 (Just s) -> Just (Constant (iToS s))->                 _ -> Nothing->    where iToS :: Int -> String->          iToS x = show x-> intToString _ = Nothing--> floatToString :: [ViewTerm] -> Maybe ViewTerm-> floatToString [Constant x]->             = case cast x of->                 (Just s) -> Just (Constant (fToS s))->                 _ -> Nothing->    where fToS :: Double -> String->          fToS x = show x-> floatToString _ = Nothing--> stringToInt :: [ViewTerm] -> Maybe ViewTerm-> stringToInt [Constant x]->             = case cast x of->                 (Just s) -> Just (Constant (sToI s))->                 _ -> Nothing->     where sToI :: String -> Int->           sToI ('-':s) | all isDigit s = -(read s)->           sToI s | all isDigit s = read s->                  | otherwise = 0-> stringToInt _ = Nothing--> stringToFloat :: [ViewTerm] -> Maybe ViewTerm-> stringToFloat [Constant x]->             = case cast x of->                 (Just s) -> Just (Constant (sToF s))->                 _ -> Nothing->     where sToF :: String -> Int->           sToF ('-':s) = -(read s)->           sToF s = read s-> stringToFloat _ = Nothing--> intToChar :: [ViewTerm] -> Maybe ViewTerm-> intToChar [Constant x] = case cast x :: Maybe Int of->                            Just i -> Just (Constant (toEnum i :: Char))->                            _ -> Nothing-> intToChar _ = Nothing--> charToInt :: [ViewTerm] -> Maybe ViewTerm-> charToInt [Constant x] = case cast x :: Maybe Char of->                            Just i -> Just (Constant (fromEnum i :: Int))->                            _ -> Nothing-> charToInt _ = Nothing--> stringLen :: [ViewTerm] -> Maybe ViewTerm-> stringLen [Constant x] = case cast x :: Maybe String of->                            (Just s) -> Just (Constant (length s))->                            _ -> Nothing-> stringLen _ = Nothing--> stringHead :: [ViewTerm] -> Maybe ViewTerm-> stringHead [Constant x] = case cast x :: Maybe String of->                            (Just (s:ss)) -> Just (Constant s)->                            _ -> Nothing-> stringHead _ = Nothing--> stringTail :: [ViewTerm] -> Maybe ViewTerm-> stringTail [Constant x] = case cast x :: Maybe String of->                            (Just (s:ss)) -> Just (Constant ss)->                            _ -> Nothing-> stringTail _ = Nothing--> stringCons :: [ViewTerm] -> Maybe ViewTerm-> stringCons [Constant x, Constant y] ->             = case (cast x, cast y) of->                   (Just s, Just ss) -> Just (Constant ((s:ss) :: String))->                   _ -> Nothing-> stringCons _ = Nothing--> stringRev :: [ViewTerm] -> Maybe ViewTerm-> stringRev [Constant x] = case cast x :: Maybe String of->                            Just s -> Just (Constant (reverse s))->                            _ -> Nothing-> stringRev _ = Nothing--> stringSub :: [ViewTerm] -> Maybe ViewTerm-> stringSub [Constant x, Constant start, Constant len] ->         = case (cast x, cast start, cast len) :: ->                    (Maybe String, Maybe Int, Maybe Int) of->               (Just str, Just st, Just l) -> ->                   Just (Constant (take l (drop st str) :: String))->               _ -> Nothing-> stringSub _ = Nothing--> stringFind :: [ViewTerm] -> Maybe ViewTerm-> stringFind [Constant x, Constant y] ->             = case (cast x, cast y) :: (Maybe String, Maybe Char) of->                   (Just s, Just c) -> ->                     case findIndex (==c) s of->                       Just v -> Just (Constant v)->                       Nothing -> Just (Constant ((-1) :: Int))->                   _ -> Nothing-> stringFind _ = Nothing--> proveAnything :: [ViewTerm] -> Maybe ViewTerm-> proveAnything [_,_,x] = Just x-> proveAnything _ = Nothing--> runLazy :: [ViewTerm] -> Maybe ViewTerm-> runLazy [_,x] = Just x-> runLazy _ = Nothing--> runEffect :: [ViewTerm] -> Maybe ViewTerm-> runEffect [_,x] = Just x-> runEffect _ = Nothing
+ Setup.hs view
@@ -0,0 +1,39 @@+import Distribution.Simple+import Distribution.Simple.InstallDirs as I+import Distribution.Simple.LocalBuildInfo as L+import Distribution.PackageDescription++import System.Exit+import System.Process++-- After Idris is built, we need to check and install the prelude and other libs++system' cmd = do +    exit <- system cmd+    case exit of+      ExitSuccess -> return ()+      ExitFailure _ -> exitWith exit++postCleanLib args flags desc _+    = system' "make -C lib clean"++addPrefix pfx var c = "export " ++ var ++ "=" ++ show pfx ++ "/" ++ c ++ ":$" ++ var++postInstLib args flags desc local+    = do let pkg = localPkgDescr local+         let penv = packageTemplateEnv (package pkg)+         let cenv = compilerTemplateEnv (compilerId (compiler local))+         let dirs_pkg = substituteInstallDirTemplates penv (installDirTemplates local)+         let dirs = substituteInstallDirTemplates cenv dirs_pkg+         let datad = datadir dirs+         let datasubd = datasubdir dirs+         let bind = fromPathTemplate (bindir dirs)+         let idir = fromPathTemplate (datadir dirs) ++ "/" ++ +                    fromPathTemplate (datasubdir dirs)+         putStrLn $ "Installing libraries in " ++ idir+         system' $ "make -C lib install TARGET=" ++ idir ++ " BINDIR=" ++ bind++main = defaultMainWithHooks (simpleUserHooks { postInst = postInstLib,+                                               postClean = postCleanLib })++
− Setup.lhs
@@ -1,38 +0,0 @@-> import Distribution.Simple-> import Distribution.Simple.InstallDirs-> import Distribution.Simple.LocalBuildInfo-> import Distribution.PackageDescription--> import System--After Idris is built, we need to check and install the .idr library files,-and the C support they need.--FIXME: This is probably all done the wrong way, I don't really understand-Cabal properly... This is all stolen from the Epic build system.--> buildLib args flags desc local ->     = do exit <- system "make -C lib"->          return ()--This is a hack. I don't know how to tell cabal that a data file needs-installing but shouldn't be in the distribution. And it won't make the-distribution if it's not there, so instead I just delete-the file after configure.--> postConfLib args flags desc local->    = do exit <- system "make -C lib clean"->         return ()--> addPrefix pfx var c = "export " ++ var ++ "=" ++ show pfx ++ "/" ++ c ++ ":$" ++ var--> postInstLib args flags desc local->     = do let pfx = prefix (installDirTemplates local)->          exit <- system $ "make -C lib install PREFIX=" ++ show pfx->          return ()--> main = defaultMainWithHooks (simpleUserHooks { postBuild = buildLib,->                                                postConf = postConfLib,->                                                postInst = postInstLib })--
− dist/build/Idris/Parser.hs
@@ -1,3973 +0,0 @@-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}-{-# OPTIONS -fglasgow-exts -cpp #-}--- -*-Haskell-*--{-# OPTIONS_GHC -fglasgow-exts #-}--module Idris.Parser where--import Data.Char-import Ivor.TT-import System.IO.Unsafe-import List-import Control.Monad--import Idris.AbsSyntax-import Idris.Lexer-import Idris.Lib--import Debug.Trace-import qualified Data.Array as Happy_Data_Array-import qualified GHC.Exts as Happy_GHC_Exts---- parser produced by Happy Version 1.18.5--newtype HappyAbsSyn t74 = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn6 :: ([ParseDecl]) -> (HappyAbsSyn t74)-happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn6 #-}-happyOut6 :: (HappyAbsSyn t74) -> ([ParseDecl])-happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut6 #-}-happyIn7 :: (ParseDecl) -> (HappyAbsSyn t74)-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn7 #-}-happyOut7 :: (HappyAbsSyn t74) -> (ParseDecl)-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut7 #-}-happyIn8 :: (Decl) -> (HappyAbsSyn t74)-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn8 #-}-happyOut8 :: (HappyAbsSyn t74) -> (Decl)-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut8 #-}-happyIn9 :: (ParseDecl) -> (HappyAbsSyn t74)-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn9 #-}-happyOut9 :: (HappyAbsSyn t74) -> (ParseDecl)-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut9 #-}-happyIn10 :: (CGFlag) -> (HappyAbsSyn t74)-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn10 #-}-happyOut10 :: (HappyAbsSyn t74) -> (CGFlag)-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut10 #-}-happyIn11 :: (Bool) -> (HappyAbsSyn t74)-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn11 #-}-happyOut11 :: (HappyAbsSyn t74) -> (Bool)-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut11 #-}-happyIn12 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn12 #-}-happyOut12 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut12 #-}-happyIn13 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn13 #-}-happyOut13 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut13 #-}-happyIn14 :: ([ParseDecl]) -> (HappyAbsSyn t74)-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn14 #-}-happyOut14 :: (HappyAbsSyn t74) -> ([ParseDecl])-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut14 #-}-happyIn15 :: ([CGFlag]) -> (HappyAbsSyn t74)-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn t74) -> ([CGFlag])-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: ([CGFlag]) -> (HappyAbsSyn t74)-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn t74) -> ([CGFlag])-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: ([CGFlag]) -> (HappyAbsSyn t74)-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn t74) -> ([CGFlag])-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: ([Decl]) -> (HappyAbsSyn t74)-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn t74) -> ([Decl])-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: ([String]) -> (HappyAbsSyn t74)-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn t74) -> ([String])-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: (String) -> (HappyAbsSyn t74)-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn t74) -> (String)-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: (Fixity) -> (HappyAbsSyn t74)-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn t74) -> (Fixity)-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: (Decl) -> (HappyAbsSyn t74)-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn t74) -> (Decl)-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: ([(Id,String)]) -> (HappyAbsSyn t74)-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn t74) -> ([(Id,String)])-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: ((Id, [(RawTerm, Maybe Id)])) -> (HappyAbsSyn t74)-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn t74) -> ((Id, [(RawTerm, Maybe Id)]))-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: ([(RawTerm,Maybe Id)]) -> (HappyAbsSyn t74)-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn t74) -> ([(RawTerm,Maybe Id)])-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: (Datatype) -> (HappyAbsSyn t74)-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn t74) -> (Datatype)-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: (Bool) -> (HappyAbsSyn t74)-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn t74) -> (Bool)-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: (Either RawTerm ((RawTerm, [(Id, RawTerm)]), [ConParse])) -> (HappyAbsSyn t74)-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn t74) -> (Either RawTerm ((RawTerm, [(Id, RawTerm)]), [ConParse]))-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: ([TyOpt]) -> (HappyAbsSyn t74)-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn t74) -> ([TyOpt])-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: ([TyOpt]) -> (HappyAbsSyn t74)-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn t74) -> ([TyOpt])-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: (TyOpt) -> (HappyAbsSyn t74)-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn t74) -> (TyOpt)-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (Id) -> (HappyAbsSyn t74)-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn t74) -> (Id)-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: ([Id]) -> (HappyAbsSyn t74)-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn t74) -> ([Id])-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: ([(Id, Int)]) -> (HappyAbsSyn t74)-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn t74) -> ([(Id, Int)])-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: ([Id]) -> (HappyAbsSyn t74)-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn t74) -> ([Id])-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: ([Id]) -> (HappyAbsSyn t74)-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn t74) -> ([Id])-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: ([(Id, RawTerm, RawTerm)]) -> (HappyAbsSyn t74)-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn t74) -> ([(Id, RawTerm, RawTerm)])-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: ((Id, RawTerm)) -> (HappyAbsSyn t74)-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn t74) -> ((Id, RawTerm))-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (String) -> (HappyAbsSyn t74)-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn t74) -> (String)-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyIn48 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn48 #-}-happyOut48 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut48 #-}-happyIn49 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn49 #-}-happyOut49 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut49 #-}-happyIn50 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn50 #-}-happyOut50 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut50 #-}-happyIn51 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn51 #-}-happyOut51 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut51 #-}-happyIn52 :: (ArgOpt) -> (HappyAbsSyn t74)-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn52 #-}-happyOut52 :: (HappyAbsSyn t74) -> (ArgOpt)-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut52 #-}-happyIn53 :: ([ArgOpt]) -> (HappyAbsSyn t74)-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn53 #-}-happyOut53 :: (HappyAbsSyn t74) -> ([ArgOpt])-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut53 #-}-happyIn54 :: ([ArgOpt]) -> (HappyAbsSyn t74)-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn54 #-}-happyOut54 :: (HappyAbsSyn t74) -> ([ArgOpt])-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut54 #-}-happyIn55 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn55 #-}-happyOut55 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut55 #-}-happyIn56 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn56 #-}-happyOut56 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut56 #-}-happyIn57 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn57 #-}-happyOut57 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut57 #-}-happyIn58 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn58 #-}-happyOut58 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut58 #-}-happyIn59 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn59 #-}-happyOut59 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut59 #-}-happyIn60 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn60 #-}-happyOut60 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut60 #-}-happyIn61 :: ([Do]) -> (HappyAbsSyn t74)-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn61 #-}-happyOut61 :: (HappyAbsSyn t74) -> ([Do])-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut61 #-}-happyIn62 :: ([Do]) -> (HappyAbsSyn t74)-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn62 #-}-happyOut62 :: (HappyAbsSyn t74) -> ([Do])-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut62 #-}-happyIn63 :: (Do) -> (HappyAbsSyn t74)-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn63 #-}-happyOut63 :: (HappyAbsSyn t74) -> (Do)-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut63 #-}-happyIn64 :: (Constant) -> (HappyAbsSyn t74)-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn64 #-}-happyOut64 :: (HappyAbsSyn t74) -> (Constant)-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut64 #-}-happyIn65 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn65 #-}-happyOut65 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut65 #-}-happyIn66 :: ((RawTerm, [(Id, RawTerm)])) -> (HappyAbsSyn t74)-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn66 #-}-happyOut66 :: (HappyAbsSyn t74) -> ((RawTerm, [(Id, RawTerm)]))-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut66 #-}-happyIn67 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn67 #-}-happyOut67 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut67 #-}-happyIn68 :: ((Id,Id)) -> (HappyAbsSyn t74)-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn68 #-}-happyOut68 :: (HappyAbsSyn t74) -> ((Id,Id))-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut68 #-}-happyIn69 :: ((Id,Id)) -> (HappyAbsSyn t74)-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn69 #-}-happyOut69 :: (HappyAbsSyn t74) -> ((Id,Id))-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut69 #-}-happyIn70 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn70 #-}-happyOut70 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut70 #-}-happyIn71 :: (Id) -> (HappyAbsSyn t74)-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn71 #-}-happyOut71 :: (HappyAbsSyn t74) -> (Id)-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut71 #-}-happyIn72 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn72 #-}-happyOut72 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut72 #-}-happyIn73 :: ([Id]) -> (HappyAbsSyn t74)-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn73 #-}-happyOut73 :: (HappyAbsSyn t74) -> ([Id])-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut73 #-}-happyIn74 :: t74 -> (HappyAbsSyn t74)-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn74 #-}-happyOut74 :: (HappyAbsSyn t74) -> t74-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut74 #-}-happyIn75 :: ([ConParse]) -> (HappyAbsSyn t74)-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn75 #-}-happyOut75 :: (HappyAbsSyn t74) -> ([ConParse])-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut75 #-}-happyIn76 :: (ConParse) -> (HappyAbsSyn t74)-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn76 #-}-happyOut76 :: (HappyAbsSyn t74) -> (ConParse)-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut76 #-}-happyIn77 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn77 #-}-happyOut77 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut77 #-}-happyIn78 :: (ITactic) -> (HappyAbsSyn t74)-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn78 #-}-happyOut78 :: (HappyAbsSyn t74) -> (ITactic)-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut78 #-}-happyIn79 :: ([ITactic]) -> (HappyAbsSyn t74)-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn79 #-}-happyOut79 :: (HappyAbsSyn t74) -> ([ITactic])-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut79 #-}-happyIn80 :: ([ITactic]) -> (HappyAbsSyn t74)-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn80 #-}-happyOut80 :: (HappyAbsSyn t74) -> ([ITactic])-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut80 #-}-happyIn81 :: ([ITactic]) -> (HappyAbsSyn t74)-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn81 #-}-happyOut81 :: (HappyAbsSyn t74) -> ([ITactic])-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut81 #-}-happyIn82 :: (LineNumber) -> (HappyAbsSyn t74)-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn82 #-}-happyOut82 :: (HappyAbsSyn t74) -> (LineNumber)-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut82 #-}-happyIn83 :: (String) -> (HappyAbsSyn t74)-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn83 #-}-happyOut83 :: (HappyAbsSyn t74) -> (String)-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut83 #-}-happyIn84 :: (Fixities) -> (HappyAbsSyn t74)-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn84 #-}-happyOut84 :: (HappyAbsSyn t74) -> (Fixities)-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut84 #-}-happyInTok :: (Token) -> (HappyAbsSyn t74)-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn t74) -> (Token)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x1d\x00\x5e\x05\x18\x02\x00\x00\x49\x04\x5e\x05\x37\x01\x37\x01\x5e\x05\x00\x00\x48\x03\xef\x02\x00\x00\x37\x01\x00\x00\x5e\x05\x5e\x05\x00\x00\x00\x00\x5e\x05\x5e\x05\x5e\x05\x5e\x05\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x01\x91\x09\x3d\x02\xc3\x01\x5e\x05\x5e\x05\xae\x08\x5e\x05\x00\x00\x37\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x05\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x5e\x05\x02\x01\x48\x04\x01\x00\x00\x00\x00\x00\x01\x00\xbc\x04\x00\x00\xa2\x04\x00\x00\x87\x04\xe2\x01\xab\x04\xa6\x04\xa5\x04\xa4\x04\x97\x04\x08\x0a\x75\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x04\x88\x04\x84\x04\x02\x01\x02\x01\x02\x01\x8e\x04\x54\x04\x7f\x04\x8f\x04\x5e\x05\x8b\x04\x8a\x04\x00\x00\x00\x00\xbd\x02\x00\x00\x02\x01\x72\x04\x75\x04\x00\x00\x02\x01\x00\x00\x02\x01\x02\x01\x02\x01\x70\x04\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x02\x00\x00\x00\x00\x00\x96\x02\x00\x00\x00\x00\x00\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x00\x00\x69\x08\x74\x04\x50\x01\x91\x09\x68\x04\x02\x01\xdc\x01\x5f\x00\x08\x0a\x75\x01\x00\x00\x00\x00\x6f\x04\x16\x04\x0e\x03\x00\x00\x6d\x04\x05\x05\x00\x00\x00\x00\x6c\x04\x00\x00\x6c\x04\x00\x00\x7a\x04\x6f\x03\x00\x00\x18\x02\x18\x02\xb8\x01\x1a\x04\xac\x04\x65\x04\xac\x04\xac\x04\x63\x04\x61\x04\xac\x04\xac\x04\x26\x0a\x62\x04\x59\x04\x1e\x00\x00\x00\x47\x04\xac\x04\x56\x09\x02\x01\x5e\x04\x37\x04\x00\x00\xae\x08\x51\x04\x00\x00\xac\x04\x45\x04\xac\x04\xac\x04\xac\x04\xac\x04\xac\x04\x00\x00\xa6\x01\x91\x01\x7c\x01\x67\x01\x52\x01\x3d\x01\x00\x00\x28\x01\xac\x04\x13\x01\xac\x04\xfe\x00\x00\x00\x3a\x04\x00\x00\xe9\x00\x02\x01\xc7\x00\x65\x00\x00\x00\x5a\x04\x5a\x04\x5a\x04\x5a\x04\x5a\x04\x00\x00\xac\x04\x5a\x04\xae\x08\x00\x00\x00\x00\x00\x00\xac\x04\x2f\x04\xcc\x09\x46\x04\x3e\x04\x28\x04\xa5\x01\x39\x04\x8b\x00\x36\x04\x53\x09\x02\x01\xcc\x09\xcc\x09\xcc\x09\x00\x00\x32\x04\xcc\x09\x31\x04\x00\x00\xd8\x05\x00\x00\xd8\x05\x00\x00\xd8\x05\x00\x00\xd8\x05\x00\x00\xac\x04\x00\x00\xac\x04\xac\x04\xac\x04\xac\x04\xac\x04\x2b\x04\x38\x04\x2d\x04\x24\x04\xac\x04\x00\x00\x00\x00\xac\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\xd8\x05\x23\x04\x53\x04\x02\x01\xf6\x03\x00\x00\xfa\x03\xfa\x03\x08\x04\x1b\x04\x04\x04\x19\x04\xfa\x03\xfa\x03\xfa\x03\xc6\x03\x0c\x04\xfd\x03\x00\x00\x00\x00\xd3\x05\x18\x02\x15\x04\x69\x08\xfa\x03\x00\x00\x00\x00\x0b\x04\x06\x04\x05\x04\x03\x04\x01\x04\x00\x00\x00\x00\x18\x04\x02\x04\x00\x00\x00\x00\xfa\x03\xfa\x03\xfa\x03\x00\x00\x07\x04\xfe\x03\xe6\x03\xfc\x03\x02\x01\xeb\x03\x00\x00\x01\x00\x02\x01\xf4\x03\xe5\x03\x00\x00\xfa\x03\x7e\x05\xfb\x03\x00\x04\x00\x00\xd6\x03\x00\x00\xec\x03\xfa\x03\x00\x00\x00\x00\x02\x01\x00\x00\x91\x09\x25\x05\xcc\x04\x7c\x05\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x05\x00\x00\xe1\x03\xd5\x03\x00\x00\x02\x01\x02\x01\xd1\x03\x91\x09\x00\x00\x00\x00\xdc\x01\x00\x00\x00\x00\xca\x04\x9c\x04\x91\x03\x00\x00\x75\x01\x00\x00\xfa\x03\xaa\x00\xb4\x02\xfa\x03\xda\x03\x00\x00\x00\x00\x00\x00\xb8\x03\x1a\x09\x00\x00\xf3\x08\x16\x03\x00\x00\xc8\x03\xd2\x03\x00\x00\x00\x00\x18\x02\xcc\x09\x00\x00\x67\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x03\x00\x00\xcd\x03\x00\x00\xae\x08\x00\x00\x1e\x00\xa3\x03\xa2\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x09\xcc\x09\xbb\x03\x91\x09\x02\x01\x95\x03\x91\x09\x1e\x00\x02\x01\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x08\xf3\x08\xf3\x08\xf3\x08\xf3\x08\xf3\x08\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x09\x00\x00\xd4\x00\x8c\x03\xd0\x01\x0a\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x91\x09\x00\x00\x00\x00\x24\x08\x00\x00\xdf\x07\x00\x00\x9a\x07\x00\x00\x55\x07\xbd\x03\xb7\x03\xb6\x03\xb4\x03\xb3\x03\x55\x00\x00\x00\x00\x00\xfa\x03\x00\x00\x00\x00\xfa\x03\x10\x07\xa0\x03\xd8\x05\xfa\x03\xde\x01\x00\x00\x46\x00\xa9\x03\xa7\x03\x00\x00\x00\x00\x00\x00\xf8\xff\x00\x00\xcb\x06\xab\x03\xa6\x03\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x86\x06\x00\x00\x46\x00\x00\x00\x99\x03\x86\x03\x9a\x03\x38\x03\x00\x00\x02\x01\x76\x03\x00\x00\x00\x00\x02\x01\x8d\x03\x00\x00\x00\x00\x02\x01\x02\x01\x46\x00\x7d\x03\x00\x00\x00\x00\x00\x00\x83\x03\xd9\x01\x8b\x03\x00\x00\x00\x00\x00\x00\x7b\x03\x00\x00\x00\x00\x02\x01\x00\x00\xae\x08\x00\x00\x00\x00\x91\x09\x00\x00\x3e\x03\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x74\x03\x02\x01\x82\x03\x00\x00\xfa\x03\x00\x00\xd8\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x03\x61\x03\x00\x00\x00\x00\xcc\x09\x49\x03\x49\x03\x00\x00\xd0\x01\x62\x03\x00\x00\x00\x00\x00\x00\xde\x01\x41\x06\x00\x00\x00\x00\x00\x00\x00\x00\x60\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x03\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x5e\x03\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x03\x00\x00\xfc\x05\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x05\x5b\x03\x00\x00\x00\x00\x00\x00\x3c\x03\x02\x01\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\xf6\x0a\x55\x10\x24\x03\x00\x00\x00\x00\x3f\x10\x96\x01\x51\x03\x29\x10\x00\x00\x13\x10\xfd\x0f\x00\x00\x47\x03\x00\x00\xe7\x0f\xd1\x0f\x00\x00\x00\x00\xbb\x0f\xa5\x0f\x8f\x0f\x79\x0f\x00\x00\x00\x00\x00\x00\x1a\x03\x39\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\xb7\x0c\x77\x0b\x10\x03\x63\x0f\x4d\x0f\x9e\x10\x37\x0f\x00\x00\x3f\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x0f\x00\x00\x07\x03\x06\x03\x00\x00\x05\x03\x0b\x0f\x59\x01\x00\x00\xdb\x0a\x00\x00\x00\x00\xd4\x0a\x00\x00\x00\x00\x44\x03\x00\x00\x2e\x03\x8d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x31\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x03\x1c\x03\x14\x03\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x39\x01\xe7\x02\x08\x01\x00\x00\x00\x00\xe5\x02\x68\x01\x00\x00\x41\x01\x13\x03\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x03\xdd\x02\x29\x01\x00\x00\xd2\x02\x7f\x0b\x00\x00\xd1\x02\xd0\x02\xbe\x0a\x88\x0a\x72\x0a\x6b\x0a\x50\x0a\x00\x00\xf9\x06\x00\x00\x00\x00\x8b\x0c\x00\x00\x02\x03\xea\x01\x15\x03\x94\x00\xe0\x01\x00\x00\x00\x00\xec\x02\x00\x00\x24\x01\xc9\x02\xdf\x02\xc7\x0b\xc7\x02\xbf\x02\x21\x01\xc0\x02\x14\x01\x00\x00\x0f\x01\x0f\x01\xbc\x02\xc9\x01\xc5\x01\x2a\x00\xdf\xff\xdf\x0e\x00\x00\xc9\x0e\xb3\x0e\x00\x00\x00\x00\x4f\x0b\x4a\x0b\x0c\x01\xdb\x02\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x0e\xa7\x02\xb4\x01\xda\x02\x00\x00\xb6\x02\x8d\x10\x00\x00\xb5\x02\x87\x0e\xb3\x02\x71\x0e\x5b\x0e\x45\x0e\x2f\x0e\x19\x0e\xae\x02\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x0a\x01\x03\x0e\x0a\x01\xed\x0d\x0a\x01\x00\x00\x00\x00\x00\x00\x0a\x01\x81\x01\x0a\x01\x0a\x01\x00\x00\x04\x01\xff\x00\xef\x00\xe5\x00\xd6\x00\xad\x02\xd7\x0d\xd2\x00\x80\x10\xa4\x02\x9d\x02\x00\x00\xc1\x0d\x00\x00\x26\x07\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x33\x01\x9c\x06\x57\x06\x99\x05\x00\x00\x00\x00\x69\x04\x00\x00\x9a\x02\xcb\x00\x97\x02\xc2\x00\x92\x02\xbb\x00\x90\x02\xb0\x00\x8f\x02\x2b\x0b\x00\x00\x26\x0b\xab\x0d\x95\x0d\x88\x09\x07\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x09\x0c\x00\x00\x88\x02\x7f\x0d\x87\x02\x86\x02\x7b\x02\x00\x00\x00\x00\xfc\xff\x99\x00\x00\x00\xb1\x0b\x3e\x01\x00\x00\x00\x00\x69\x0d\x53\x0d\x00\x00\x00\x00\x00\x00\xbe\x02\x3d\x0d\x27\x0d\x11\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\xc1\x01\x00\x00\xb4\x06\xfb\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\x71\x02\x79\x00\x00\x00\x70\x02\x68\x02\xe5\x0c\xcf\x0c\xb9\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x01\x00\x00\x64\x02\xd6\x09\x95\x02\x00\x00\x00\x00\x61\x02\xa3\x0c\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x0c\x00\x00\x00\x00\x91\x02\x00\x00\x5f\x0c\x79\x00\x79\x00\x79\x00\x00\x00\x00\x00\x5c\x02\x00\x00\xf3\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x5a\x02\x99\x02\x00\x00\x54\x02\x4f\x00\xef\xff\x00\x00\x33\x0c\x53\x02\x17\x02\xa4\x01\x00\x00\x00\x00\x79\x00\x79\x00\x79\x00\x00\x00\x35\x01\x00\x00\x77\x0c\x79\x00\x79\x00\x61\x0c\x02\x02\x00\x00\x00\x00\x47\x02\x00\x00\x78\x10\x00\x00\x78\x10\x79\x00\x46\x02\x79\x00\x00\x00\x00\x00\x00\x00\xbe\x01\x44\x04\x45\x02\x79\x00\x00\x00\x41\x02\x22\x02\x21\x02\x20\x02\x1e\x02\x1c\x02\x1b\x02\x00\x00\x1a\x02\x00\x00\x12\x02\x6b\x10\x10\x02\x00\x00\x00\x00\x00\x00\x0f\x02\x0e\x02\x00\x00\x00\x00\x0c\x02\x00\x00\xb2\x03\xc2\x01\x07\x02\x07\x0c\x4e\x01\x00\x00\xdb\x0b\x00\x00\x2e\x00\x79\x00\x0a\x02\x08\x02\x00\x00\xfe\x01\x79\x00\x00\x00\xfd\x01\xfc\x01\xfb\x01\xf0\x01\xec\x01\x00\x00\x5a\x10\x5a\x10\x5a\x10\x5a\x10\x5a\x10\x5a\x10\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x00\x00\x00\x00\xaa\x01\x00\x00\x00\x00\xdb\x01\xeb\x01\xdf\x01\xd1\x01\xf0\x09\xc6\x01\x00\x00\x50\x10\x00\x00\x50\x10\x00\x00\x50\x10\x00\x00\x50\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x0b\x00\x00\x95\x01\x4b\x0c\x50\x10\x00\x00\x78\x00\x35\x0c\x6b\x00\x00\x00\xa0\x02\xe7\x01\x00\x00\x00\x00\xb3\x01\xab\x01\x9e\x01\x8c\x01\xf6\x01\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x6a\x01\x23\x01\x85\x01\x2a\x06\x7e\x01\x4f\x02\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x93\x01\x00\x00\x00\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x71\x00\x73\x01\xfe\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x01\x00\x00\xed\xff\x00\x00\x97\x08\x00\x00\x00\x00\x02\x09\x4a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x01\xc0\x00\x00\x00\xd5\x00\x5c\x00\x9c\x00\x1f\x0c\x00\x00\x47\x00\x95\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x7f\x00\x00\x00\x4a\x00\x21\x00\xdc\x08\x38\x00\x00\x00\x20\x00\xee\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\xd0\xff\xdc\x08\x9b\x0b\xcb\xff\xdc\x08\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x08\x00\x00\x00\x00\xc6\xff\x00\x00\x00\x00\x1d\x01\x00\x00\xf5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\x21\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\xff\x00\x00\x00\x00\x0a\xff\x00\x00\x00\x00\x05\xff\x00\x00\x03\xff\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xfe\xf9\xfe\xf8\xfe\xf0\xfe\xf0\xfe\x9b\xff\x80\xff\x45\xff\x46\xff\xa2\xff\x44\xff\x49\xff\xf0\xfe\xab\xff\x29\xff\x2b\xff\x27\xff\x2a\xff\x28\xff\x52\xff\x00\x00\x00\x00\x00\x00\xf0\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xff\x00\x00\x31\xff\x30\xff\x2f\xff\x32\xff\x2d\xff\x2e\xff\x2c\xff\x34\xff\x33\xff\x00\x00\x4d\xff\xf0\xfe\xf0\xfe\x00\x00\xf0\xfe\x00\x00\x00\x00\x00\x00\x21\xff\xef\xff\xf8\xff\x21\xff\x00\x00\xf6\xff\xda\xff\xf7\xff\xb1\xff\xbb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\xff\xb5\xff\xc0\xff\xc2\xff\xc1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\xff\xec\xff\xf0\xfe\xf0\xfe\x00\x00\x00\x00\x00\x00\xf0\xfe\x8c\xff\x1c\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xff\xc5\xff\xc4\xff\xc3\xff\x00\x00\xf0\xfe\xf0\xfe\xd8\xff\xf0\xfe\x00\x00\xa5\xff\xf0\xfe\xf0\xfe\x21\xff\x21\xff\x21\xff\x21\xff\x21\xff\xbc\xff\xbb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\xfb\xff\x70\xff\x00\x00\xf0\xfe\xf1\xfe\x70\xff\x00\x00\xf1\xfe\xf1\xfe\xf0\xfe\xf0\xfe\xf0\xfe\x53\xff\xf0\xfe\xf0\xfe\xf1\xfe\x00\x00\x00\x00\xf0\xfe\xf0\xfe\x00\x00\x00\x00\xc6\xff\xc5\xff\x72\xff\x71\xff\xf0\xfe\xf0\xfe\xf0\xfe\x6e\xff\x00\x00\x6b\xff\x60\xff\x8e\xff\x00\x00\x00\x00\x00\x00\x70\xff\x00\x00\xf1\xfe\x00\x00\x00\x00\xf1\xfe\x00\x00\xf0\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\x04\xff\xf0\xfe\x00\x00\xf0\xfe\x00\x00\xf0\xfe\x0d\xff\x94\xff\x0f\xff\xf0\xfe\x00\x00\xf0\xfe\xf0\xfe\x56\xff\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf1\xfe\x00\x00\xf0\xfe\x00\x00\xf0\xfe\xf0\xfe\x4e\xff\x00\x00\x99\xff\x00\x00\x00\x00\x00\x00\x96\xff\xf0\xfe\x00\x00\x00\x00\x00\x00\xf0\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xff\x00\x00\x00\x00\x00\x00\xf1\xfe\xf0\xfe\xf1\xfe\xf0\xfe\xf1\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\x54\xff\xf0\xfe\x72\xff\x71\xff\xf0\xfe\xf0\xfe\x00\x00\xf5\xfe\x00\x00\x00\x00\x3e\xff\x48\xff\xf0\xfe\x00\x00\xf1\xfe\xf1\xfe\xf1\xfe\x4c\xff\x4b\xff\xf0\xfe\xf0\xfe\x00\x00\x38\xff\x00\x00\x00\x00\x55\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc8\xff\xda\xff\x00\x00\x00\x00\x00\x00\xdd\xff\x00\x00\xaf\xff\xad\xff\xac\xff\x00\x00\x00\x00\x00\x00\xbb\xff\x00\x00\xe8\xff\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xfe\xf1\xfe\xf0\xfe\x00\x00\xf1\xfe\xf1\xfe\x00\x00\x00\x00\x00\x00\xaa\xff\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xff\x00\x00\xf1\xfe\x21\xff\x00\x00\x00\x00\x00\x00\xf1\xfe\x00\x00\xf0\xfe\x00\x00\x00\x00\xbf\xff\x00\x00\xf9\xff\x00\x00\x00\x00\x8b\xff\x1d\xff\x00\x00\x20\xff\x00\x00\xf0\xfe\xf0\xfe\xf0\xfe\xa7\xff\xa6\xff\xf0\xfe\xd7\xff\x00\x00\xa4\xff\xa3\xff\xf0\xff\xf1\xff\xf2\xff\xf3\xff\xf4\xff\xf0\xfe\xf0\xfe\xd2\xff\x00\x00\xf0\xfe\x19\xff\x15\xff\x00\x00\x00\x00\xf0\xfe\xf0\xfe\x00\x00\xb0\xff\xdc\xff\xf0\xfe\xf0\xfe\xf0\xfe\xdb\xff\x00\x00\xc9\xff\x00\x00\xf0\xfe\xf0\xfe\x00\x00\x70\xff\x39\xff\x3b\xff\xf1\xfe\x00\x00\x9e\xff\x4f\xff\x86\xff\xf0\xfe\xf1\xfe\xf0\xfe\x00\x00\x51\xff\x50\xff\xf6\xfe\x00\x00\xf1\xfe\xf0\xfe\x3f\xff\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\x00\x00\xf1\xfe\x00\x00\xf1\xfe\x00\x00\xf0\xfe\x6d\xff\x00\x00\x6a\xff\xf0\xfe\xf0\xfe\x8d\xff\x64\xff\xf0\xfe\x67\xff\x00\x00\x00\x00\x5c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xff\x00\x00\xf0\xfe\xf1\xfe\xf1\xfe\xa0\xff\xf1\xfe\xf0\xfe\x88\xff\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\x93\xff\x81\xff\x84\xff\x82\xff\x83\xff\x85\xff\x7e\xff\x9f\xff\x7f\xff\x98\xff\x95\xff\x00\x00\x97\xff\x6f\xff\x00\x00\x00\x00\x58\xff\x57\xff\xf0\xfe\xf1\xfe\xf1\xfe\xf1\xfe\x00\x00\xf1\xfe\xa9\xff\x00\x00\x76\xff\x00\x00\x75\xff\x00\x00\x47\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xfe\x43\xff\x3e\xff\x41\xff\xf0\xfe\x00\x00\x00\x00\x00\x00\xf0\xfe\x00\x00\xf0\xfe\xc7\xff\x00\x00\xd2\xff\x00\x00\xae\xff\xf1\xfe\xf1\xfe\x21\xff\xf0\xfe\x26\xff\x00\x00\x14\xff\x18\xff\xf1\xfe\xf7\xfe\xf0\xfe\xd1\xff\xf1\xfe\xbb\xff\xf1\xfe\x00\x00\xe4\xff\x00\x00\x1b\xff\x00\x00\xf0\xfe\xed\xff\x00\x00\xbe\xff\xf5\xff\xea\xff\x00\x00\x00\x00\xee\xff\x1e\xff\x00\x00\x00\x00\xd4\xff\x00\x00\xd6\xff\xb8\xff\xb9\xff\x00\x00\xd1\xff\x00\x00\xcb\xff\xcf\xff\xce\xff\xcc\xff\xf1\xfe\xb7\xff\x15\xff\xb4\xff\x26\xff\x11\xff\x12\xff\x00\x00\xf1\xfe\x00\x00\xb3\xff\xb2\xff\x23\xff\x00\x00\xf0\xfe\x00\x00\x00\x00\xf0\xfe\xf1\xfe\x00\x00\x35\xff\xf0\xfe\xf1\xfe\x3c\xff\xf0\xfe\x78\xff\x74\xff\x79\xff\x7c\xff\x7a\xff\x7b\xff\x7d\xff\x73\xff\x77\xff\xa8\xff\x6c\xff\x62\xff\x63\xff\x61\xff\xf1\xfe\x5a\xff\x00\x00\x5f\xff\x5e\xff\x00\x00\x68\xff\x69\xff\x5d\xff\x00\x00\x00\x00\xf1\xfe\x42\xff\xf1\xfe\xf0\xfe\x00\x00\xf1\xfe\x89\xff\xf0\xfe\xf1\xfe\x00\x00\x24\xff\x22\xff\x10\xff\x25\xff\x13\xff\xe9\xff\x00\x00\xca\xff\xd0\xff\xd3\xff\xe2\xff\xd5\xff\x00\x00\x1a\xff\x1f\xff\xbd\xff\xe3\xff\x91\xff\x00\x00\xf0\xfe\xe5\xff\xf1\xfe\x9a\xff\x00\x00\xf1\xfe\x00\x00\x59\xff\x66\xff\x5b\xff\x37\xff\x00\x00\x00\x00\xe7\xff\xf1\xfe\xcd\xff\x92\xff\x00\x00\x90\xff\x00\x00\xe6\xff\x3a\xff\x36\xff\x8f\xff"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x03\x00\x01\x00\x0b\x00\x25\x00\x03\x00\x08\x00\x1a\x00\x29\x00\x1a\x00\x02\x00\x03\x00\x02\x00\x0c\x00\x0c\x00\x1a\x00\x12\x00\x10\x00\x4c\x00\x0b\x00\x13\x00\x0a\x00\x21\x00\x4c\x00\x1a\x00\x11\x00\x12\x00\x13\x00\x4c\x00\x15\x00\x01\x00\x17\x00\x02\x00\x19\x00\x20\x00\x21\x00\x16\x00\x1d\x00\x2a\x00\x1d\x00\x1a\x00\x0c\x00\x22\x00\x23\x00\x4d\x00\x10\x00\x26\x00\x27\x00\x2a\x00\x27\x00\x45\x00\x46\x00\x45\x00\x46\x00\x2e\x00\x2f\x00\x2e\x00\x41\x00\x4c\x00\x1d\x00\x31\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x25\x00\x01\x00\x1a\x00\x4d\x00\x3c\x00\x1d\x00\x2e\x00\x4b\x00\x4d\x00\x4e\x00\x4d\x00\x43\x00\x0c\x00\x4d\x00\x2a\x00\x54\x00\x10\x00\x02\x00\x57\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5a\x00\x5b\x00\x01\x00\x5d\x00\x11\x00\x02\x00\x03\x00\x1a\x00\x4d\x00\x4e\x00\x25\x00\x4d\x00\x4d\x00\x0c\x00\x0b\x00\x54\x00\x1d\x00\x10\x00\x57\x00\x74\x00\x13\x00\x4d\x00\x13\x00\x78\x00\x15\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x20\x00\x21\x00\x25\x00\x1d\x00\x2e\x00\x4c\x00\x7d\x00\x11\x00\x22\x00\x23\x00\x20\x00\x21\x00\x1a\x00\x27\x00\x02\x00\x1a\x00\x1a\x00\x25\x00\x74\x00\x43\x00\x2e\x00\x4d\x00\x78\x00\x4c\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x07\x00\x11\x00\x25\x00\x25\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x1d\x00\x4d\x00\x4b\x00\x20\x00\x02\x00\x03\x00\x1a\x00\x1b\x00\x4d\x00\x4e\x00\x27\x00\x42\x00\x4b\x00\x0b\x00\x42\x00\x54\x00\x4d\x00\x2e\x00\x57\x00\x11\x00\x12\x00\x13\x00\x25\x00\x15\x00\x07\x00\x17\x00\x05\x00\x19\x00\x4d\x00\x4d\x00\x4d\x00\x1d\x00\x34\x00\x02\x00\x03\x00\x4c\x00\x22\x00\x23\x00\x3a\x00\x4c\x00\x26\x00\x27\x00\x0b\x00\x1a\x00\x1b\x00\x25\x00\x02\x00\x74\x00\x2e\x00\x2f\x00\x13\x00\x78\x00\x15\x00\x7a\x00\x7b\x00\x7c\x00\x25\x00\x4c\x00\x7d\x00\x26\x00\x1d\x00\x11\x00\x4d\x00\x25\x00\x4c\x00\x22\x00\x23\x00\x02\x00\x03\x00\x34\x00\x27\x00\x1a\x00\x25\x00\x1d\x00\x25\x00\x3a\x00\x0b\x00\x2e\x00\x2e\x00\x25\x00\x30\x00\x24\x00\x26\x00\x25\x00\x13\x00\x4d\x00\x15\x00\x03\x00\x02\x00\x03\x00\x2e\x00\x01\x00\x5a\x00\x5b\x00\x1d\x00\x5d\x00\x4d\x00\x0b\x00\x25\x00\x22\x00\x23\x00\x4d\x00\x12\x00\x4d\x00\x27\x00\x13\x00\x10\x00\x15\x00\x25\x00\x02\x00\x03\x00\x2e\x00\x4d\x00\x11\x00\x4d\x00\x1d\x00\x0a\x00\x0b\x00\x0b\x00\x4d\x00\x22\x00\x23\x00\x1a\x00\x4d\x00\x25\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x25\x00\x02\x00\x03\x00\x2e\x00\x0a\x00\x0b\x00\x25\x00\x1d\x00\x25\x00\x4d\x00\x0b\x00\x25\x00\x22\x00\x23\x00\x1a\x00\x01\x00\x25\x00\x27\x00\x13\x00\x4d\x00\x15\x00\x21\x00\x02\x00\x03\x00\x2e\x00\x0d\x00\x0e\x00\x7d\x00\x1d\x00\x25\x00\x10\x00\x0b\x00\x25\x00\x22\x00\x23\x00\x4d\x00\x1a\x00\x25\x00\x27\x00\x13\x00\x4d\x00\x15\x00\x20\x00\x02\x00\x03\x00\x2e\x00\x4d\x00\x1a\x00\x4d\x00\x1d\x00\x1a\x00\x4d\x00\x0b\x00\x25\x00\x22\x00\x23\x00\x4d\x00\x24\x00\x13\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x1a\x00\x02\x00\x03\x00\x2e\x00\x1e\x00\x1f\x00\x4d\x00\x1d\x00\x20\x00\x4d\x00\x0b\x00\x1a\x00\x22\x00\x23\x00\x4d\x00\x02\x00\x1a\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x24\x00\x02\x00\x03\x00\x2e\x00\x23\x00\x1a\x00\x42\x00\x1d\x00\x1a\x00\x4d\x00\x0b\x00\x1a\x00\x22\x00\x23\x00\x23\x00\x21\x00\x1a\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x1d\x00\x02\x00\x03\x00\x2e\x00\x4c\x00\x22\x00\x23\x00\x1d\x00\x1a\x00\x1a\x00\x0b\x00\x1d\x00\x22\x00\x23\x00\x13\x00\x20\x00\x4c\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x1a\x00\x02\x00\x03\x00\x2e\x00\x02\x00\x03\x00\x1a\x00\x1d\x00\x0a\x00\x1a\x00\x0b\x00\x0d\x00\x22\x00\x23\x00\x28\x00\x20\x00\x4d\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x18\x00\x19\x00\x31\x00\x2e\x00\x33\x00\x34\x00\x0a\x00\x1d\x00\x37\x00\x0d\x00\x1d\x00\x3a\x00\x22\x00\x23\x00\x4c\x00\x22\x00\x23\x00\x27\x00\x1a\x00\x7d\x00\x27\x00\x4c\x00\x1e\x00\x1f\x00\x2e\x00\x4c\x00\x49\x00\x2e\x00\x2e\x00\x4d\x00\x30\x00\x3d\x00\x1a\x00\x1b\x00\x1a\x00\x1b\x00\x02\x00\x03\x00\x4d\x00\x01\x00\x7d\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0d\x00\x0e\x00\x2d\x00\x09\x00\x2d\x00\x10\x00\x31\x00\x32\x00\x31\x00\x14\x00\x4c\x00\x16\x00\x7d\x00\x18\x00\x1d\x00\x3a\x00\x1b\x00\x3a\x00\x4c\x00\x22\x00\x23\x00\x18\x00\x19\x00\x26\x00\x27\x00\x48\x00\x25\x00\x4a\x00\x48\x00\x28\x00\x4a\x00\x2e\x00\x48\x00\x7d\x00\x4a\x00\x1a\x00\x48\x00\x4c\x00\x4a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x28\x00\x4f\x00\x50\x00\x5e\x00\x5f\x00\x7d\x00\x48\x00\x49\x00\x7d\x00\x31\x00\x4d\x00\x33\x00\x34\x00\x4c\x00\x2a\x00\x37\x00\x55\x00\x56\x00\x3a\x00\x3b\x00\x1a\x00\x51\x00\x52\x00\x53\x00\x2f\x00\x4c\x00\x4c\x00\x57\x00\x58\x00\x5d\x00\x4c\x00\x47\x00\x01\x00\x02\x00\x5e\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x0e\x00\x0f\x00\x10\x00\x75\x00\x76\x00\x77\x00\x14\x00\x03\x00\x16\x00\x4c\x00\x18\x00\x4c\x00\x08\x00\x1b\x00\x4d\x00\x1d\x00\x4d\x00\x4d\x00\x4d\x00\x4c\x00\x22\x00\x23\x00\x12\x00\x25\x00\x26\x00\x4d\x00\x28\x00\x4c\x00\x4c\x00\x4c\x00\x1a\x00\x4c\x00\x2e\x00\x4c\x00\x4c\x00\x4c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x4f\x00\x4c\x00\x51\x00\x52\x00\x53\x00\x4c\x00\x4c\x00\x4c\x00\x57\x00\x58\x00\x59\x00\x01\x00\x02\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x4d\x00\x4d\x00\x09\x00\x03\x00\x0e\x00\x0f\x00\x10\x00\x4d\x00\x08\x00\x4d\x00\x14\x00\x1a\x00\x16\x00\x4c\x00\x18\x00\x1a\x00\x4c\x00\x1b\x00\x12\x00\x1d\x00\x4c\x00\x0e\x00\x02\x00\x03\x00\x22\x00\x23\x00\x1a\x00\x25\x00\x4c\x00\x4c\x00\x28\x00\x02\x00\x03\x00\x1a\x00\x1b\x00\x4c\x00\x06\x00\x1e\x00\x1f\x00\x4c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\x4c\x00\x4c\x00\x2d\x00\x4d\x00\x22\x00\x23\x00\x31\x00\x32\x00\x1d\x00\x27\x00\x4d\x00\x4d\x00\x4c\x00\x22\x00\x23\x00\x3a\x00\x2e\x00\x4c\x00\x27\x00\x4f\x00\x4c\x00\x51\x00\x52\x00\x53\x00\x4d\x00\x2e\x00\x2f\x00\x57\x00\x58\x00\x59\x00\x01\x00\x4d\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x4c\x00\x4c\x00\x1a\x00\x1b\x00\x0e\x00\x0f\x00\x10\x00\x4d\x00\x4c\x00\x4c\x00\x14\x00\x2a\x00\x16\x00\x2b\x00\x18\x00\x4c\x00\x2a\x00\x1b\x00\x4c\x00\x1d\x00\x4d\x00\x2d\x00\x5b\x00\x02\x00\x03\x00\x31\x00\x4c\x00\x25\x00\x4c\x00\x2a\x00\x28\x00\x02\x00\x03\x00\x05\x00\x3a\x00\x1a\x00\x4d\x00\x4d\x00\x4d\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4d\x00\x1d\x00\x05\x00\x1a\x00\x1a\x00\x19\x00\x22\x00\x23\x00\x4d\x00\x1d\x00\x4d\x00\x27\x00\x1a\x00\x1a\x00\x22\x00\x23\x00\x02\x00\x03\x00\x2e\x00\x27\x00\x4f\x00\x0e\x00\x51\x00\x52\x00\x53\x00\x0b\x00\x2e\x00\x17\x00\x57\x00\x58\x00\x59\x00\x01\x00\x06\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x4d\x00\x4d\x00\x4d\x00\x1d\x00\x0e\x00\x0f\x00\x10\x00\x1a\x00\x22\x00\x23\x00\x14\x00\x4d\x00\x16\x00\x27\x00\x18\x00\x1a\x00\x26\x00\x1b\x00\x4d\x00\x1d\x00\x2e\x00\x4d\x00\x5a\x00\x02\x00\x03\x00\x1a\x00\x48\x00\x25\x00\x13\x00\x11\x00\x28\x00\x02\x00\x03\x00\x11\x00\x15\x00\x15\x00\x15\x00\x2e\x00\x11\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x26\x00\x1d\x00\x03\x00\x17\x00\x13\x00\x4a\x00\x22\x00\x23\x00\x10\x00\x1d\x00\x26\x00\x27\x00\x04\x00\x13\x00\x22\x00\x23\x00\x02\x00\x03\x00\x2e\x00\x27\x00\x4f\x00\x15\x00\x51\x00\x52\x00\x53\x00\x26\x00\x2e\x00\x11\x00\x57\x00\x58\x00\x59\x00\x01\x00\x12\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x11\x00\x26\x00\x14\x00\x1d\x00\x0e\x00\x0f\x00\x10\x00\x0c\x00\x22\x00\x23\x00\x14\x00\x0b\x00\x16\x00\x27\x00\x18\x00\x2e\x00\x14\x00\x1b\x00\x14\x00\x1d\x00\x2e\x00\x20\x00\x02\x00\x03\x00\x2e\x00\x11\x00\x11\x00\x25\x00\x11\x00\x11\x00\x28\x00\x02\x00\x03\x00\x1a\x00\x1b\x00\x11\x00\x14\x00\x2e\x00\x2e\x00\x13\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\x15\x00\x11\x00\x2d\x00\x11\x00\x22\x00\x23\x00\x31\x00\x0a\x00\x1d\x00\x27\x00\x15\x00\x13\x00\x31\x00\x22\x00\x23\x00\x3a\x00\x2e\x00\x26\x00\x27\x00\x4f\x00\x20\x00\x51\x00\x52\x00\x53\x00\x14\x00\x2e\x00\x0b\x00\x57\x00\x58\x00\x59\x00\x01\x00\x26\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x04\x00\x20\x00\x0b\x00\x13\x00\x0e\x00\x0f\x00\x10\x00\x20\x00\x26\x00\x11\x00\x14\x00\x11\x00\x16\x00\x0a\x00\x18\x00\x11\x00\x13\x00\x1b\x00\x13\x00\x1d\x00\x13\x00\x13\x00\x02\x00\x03\x00\x02\x00\x03\x00\x13\x00\x25\x00\x0b\x00\x15\x00\x28\x00\x26\x00\x5e\x00\x0c\x00\x0b\x00\x31\x00\x20\x00\x11\x00\x26\x00\x11\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\x13\x00\x1d\x00\x0d\x00\x15\x00\x22\x00\x23\x00\x22\x00\x23\x00\x26\x00\x27\x00\x26\x00\x27\x00\x15\x00\x0b\x00\x13\x00\x13\x00\x2e\x00\x11\x00\x2e\x00\x4f\x00\x11\x00\x51\x00\x52\x00\x53\x00\x26\x00\x11\x00\x0a\x00\x57\x00\x58\x00\x59\x00\x01\x00\x26\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x03\x00\x1a\x00\x1b\x00\x26\x00\x0e\x00\x0f\x00\x10\x00\x13\x00\x20\x00\x2f\x00\x14\x00\x0a\x00\x16\x00\x11\x00\x18\x00\x0a\x00\x26\x00\x1b\x00\x03\x00\x1d\x00\x2d\x00\x11\x00\x5d\x00\x11\x00\x31\x00\x11\x00\x0a\x00\x25\x00\x0a\x00\x12\x00\x28\x00\x02\x00\x03\x00\x3a\x00\x0b\x00\x0b\x00\x11\x00\x10\x00\x1a\x00\x1b\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x04\x00\x04\x00\x01\x00\x12\x00\x04\x00\x19\x00\x10\x00\x41\x00\x2d\x00\x1d\x00\x10\x00\x10\x00\x31\x00\x14\x00\x22\x00\x23\x00\x02\x00\x03\x00\x26\x00\x27\x00\x4f\x00\x3a\x00\x51\x00\x52\x00\x53\x00\x0b\x00\x2e\x00\x12\x00\x57\x00\x58\x00\x59\x00\x01\x00\x0c\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x12\x00\x12\x00\x12\x00\x1d\x00\x0e\x00\x0f\x00\x10\x00\x12\x00\x22\x00\x23\x00\x14\x00\x05\x00\x16\x00\x27\x00\x18\x00\x7d\x00\x7d\x00\x1b\x00\x20\x00\x1d\x00\x2e\x00\xff\xff\x02\x00\x03\x00\x02\x00\x03\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\x0b\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x22\x00\x23\x00\x22\x00\x23\x00\xff\xff\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x2e\x00\x4f\x00\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\x57\x00\x58\x00\x59\x00\x01\x00\xff\xff\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x0f\x00\x10\x00\xff\xff\xff\xff\xff\xff\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x02\x00\x03\x00\x02\x00\x03\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x22\x00\x23\x00\x22\x00\x23\x00\xff\xff\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x2e\x00\x4f\x00\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\x57\x00\x58\x00\x59\x00\x01\x00\xff\xff\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x0f\x00\x10\x00\xff\xff\xff\xff\xff\xff\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x02\x00\x03\x00\x02\x00\x03\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x22\x00\x23\x00\x22\x00\x23\x00\xff\xff\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x2e\x00\x4f\x00\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x1a\x00\x1b\x00\x57\x00\x58\x00\x59\x00\x01\x00\xff\xff\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x10\x00\xff\xff\xff\xff\x31\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x3a\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x03\x00\x25\x00\x0a\x00\x0b\x00\x28\x00\xff\xff\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x20\x00\xff\xff\x1d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\xff\xff\x01\x00\xff\xff\x27\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x2e\x00\x0b\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\xff\xff\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x01\x00\x31\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x3a\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\xff\xff\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x01\x00\x31\x00\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x3a\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x01\x00\x31\x00\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x3a\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x11\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x11\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x11\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x11\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\xff\xff\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x3b\x00\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x25\x00\xff\xff\xff\xff\x01\x00\x1a\x00\x1b\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x22\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2c\x00\x2d\x00\x16\x00\xff\xff\x18\x00\x31\x00\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\x57\x00\x58\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x02\x00\x03\x00\x01\x00\x02\x00\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x0f\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\xff\xff\x1d\x00\x57\x00\x58\x00\x1d\x00\xff\xff\x22\x00\x23\x00\xff\xff\x22\x00\x23\x00\x27\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x10\x00\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x4d\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x0f\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0c\x00\x52\x00\x53\x00\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\xff\xff\x01\x00\x1a\x00\x1b\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\xff\xff\x22\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x10\x00\xff\xff\xff\xff\xff\xff\x2c\x00\x2d\x00\x52\x00\x53\x00\x18\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x03\x00\x3a\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x11\x00\xff\xff\x13\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x2e\x00\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\x52\x00\x53\x00\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\xff\xff\x41\x00\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x4a\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\x0c\x00\x14\x00\x15\x00\x0f\x00\x10\x00\xff\xff\x12\x00\x1a\x00\x14\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\x1a\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\x1a\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\x0c\x00\x14\x00\x15\x00\x0f\x00\x10\x00\xff\xff\x12\x00\x1a\x00\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\x1a\x00\x3a\x00\x1c\x00\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\x4d\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\x31\x00\x37\x00\x33\x00\x34\x00\x3a\x00\xff\xff\x37\x00\xff\xff\x1a\x00\x3a\x00\x1c\x00\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\x4d\x00\xff\xff\x26\x00\x27\x00\x28\x00\x4d\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\x31\x00\x37\x00\x33\x00\x34\x00\x3a\x00\x0e\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\x0e\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\x4d\x00\xff\xff\x1a\x00\xff\xff\x1c\x00\x4d\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\x31\x00\xff\xff\x33\x00\x34\x00\x35\x00\xff\xff\x37\x00\xff\xff\x31\x00\x3a\x00\x33\x00\x34\x00\x35\x00\x1a\x00\x37\x00\x1c\x00\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x36\x00\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\x35\x00\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x36\x00\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\x1a\x00\xff\xff\x37\x00\xff\xff\x28\x00\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\x31\x00\x28\x00\x33\x00\x34\x00\x1a\x00\x31\x00\x37\x00\x33\x00\x34\x00\x3a\x00\x31\x00\x37\x00\x33\x00\x34\x00\x3a\x00\xff\xff\x37\x00\x1a\x00\x28\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\x28\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x1a\x00\x28\x00\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\x31\x00\x3a\x00\x33\x00\x34\x00\x28\x00\xff\xff\x37\x00\x1a\x00\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\x28\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\x19\x02\x25\x00\x30\x02\xbf\x00\xc3\x00\x6c\x02\xfd\x01\x04\x01\xfd\x01\xc2\x00\xc3\x00\xf6\x00\x57\x00\xd9\xff\x72\x02\x4d\x00\x58\x00\x88\x02\x9d\xff\xfc\xff\xec\x00\x8b\x02\x7f\x02\x50\x00\x9d\xff\x9d\xff\x9d\xff\x81\x02\x9d\xff\x25\x00\x9d\xff\xf6\x00\x9d\xff\xd9\xff\xd9\xff\x71\x01\xc4\x00\x89\x01\xf7\x00\x72\x01\x57\x00\xc5\x00\xc6\x00\xc0\x00\x58\x00\x9d\xff\xc7\x00\x0c\x01\xb0\x01\x65\x02\xff\x01\xfe\x01\xff\x01\xc8\x00\x9d\xff\xf8\x00\x5e\x00\x75\x02\xf7\x00\x70\xff\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xbf\x00\x25\x00\xbb\x00\xc8\x00\x73\x01\xcc\x01\xf8\x00\xd9\xff\x62\x00\x63\x00\x82\x02\x74\x01\x57\x00\x3f\x01\x0c\x01\x64\x00\x58\x00\xf6\x00\x65\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x9d\xff\x9d\xff\x25\x00\x9d\xff\x3e\x02\xc2\x00\xc3\x00\x72\x01\x62\x00\x63\x00\xbf\x00\x76\x02\x79\x02\x57\x00\x06\xff\x64\x00\xf7\x00\x58\x00\x65\x00\x66\x00\xfc\xff\xc8\x00\x06\xff\x67\x00\x06\xff\x68\x00\x69\x00\x6a\x00\xfc\xff\x28\x01\x29\x01\xbf\x00\xc4\x00\xf8\x00\x77\x02\x9d\xff\x70\x02\xc5\x00\xc6\x00\x42\x01\x43\x01\x44\x01\xc7\x00\xf6\x00\x44\x01\x4e\x01\xbf\x00\x66\x00\x00\x02\xc8\x00\x59\x02\x67\x00\x7a\x02\x68\x00\x69\x00\x6a\x00\xfc\xff\x25\x01\xae\x01\xbf\x00\xbf\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xf7\x00\x5c\x02\x2a\x01\xaf\x01\xc2\x00\xc3\x00\x7d\x00\x7e\x00\x62\x00\x63\x00\xb0\x01\x6e\x02\x2a\x01\x9c\xff\x45\x01\x64\x00\xc0\x00\xf8\x00\x65\x00\x9c\xff\x9c\xff\x9c\xff\xbf\x00\x9c\xff\x7c\x00\x9c\xff\x85\x02\x9c\xff\x57\x02\x37\x02\xc0\x00\xc4\x00\x7f\x00\xc2\x00\xc3\x00\x7b\x02\xc5\x00\xc6\x00\x80\x00\x56\x02\x9c\xff\xc7\x00\x08\xff\x7d\x00\x7e\x00\xbf\x00\xf6\x00\x66\x00\xc8\x00\x9c\xff\x08\xff\x67\x00\x08\xff\x68\x00\x69\x00\x6a\x00\xbf\x00\x58\x02\x06\xff\x86\x02\xc4\x00\x6b\xff\x88\x01\xbf\x00\x5b\x02\xc5\x00\xc6\x00\xc2\x00\xc3\x00\x7f\x00\xc7\x00\x97\x00\xbf\x00\xf7\x00\xbf\x00\x80\x00\x0c\xff\xc8\x00\x4d\x02\xbf\x00\x7d\x02\x5d\x02\x6b\xff\xbf\x00\x0c\xff\x9c\x01\x0c\xff\x9c\x00\xc2\x00\xc3\x00\xf8\x00\x25\x00\x9c\xff\x9c\xff\xc4\x00\x9c\xff\x9e\x01\x0b\xff\xbf\x00\xc5\x00\xc6\x00\x5f\x02\x9d\x00\xa0\x01\xc7\x00\x0b\xff\x58\x00\x0b\xff\xbf\x00\xc2\x00\xc3\x00\xc8\x00\xa2\x01\x4d\x01\xc0\x00\xc4\x00\x69\x02\x1f\x02\x09\xff\xbb\x01\xc5\x00\xc6\x00\x4e\x01\xbe\x01\xbf\x00\xc7\x00\x09\xff\x9c\xff\x09\xff\xbf\x00\xc2\x00\xc3\x00\xc8\x00\x1e\x02\x1f\x02\xbf\x00\xc4\x00\xfb\x00\xbf\x01\x07\xff\xbf\x00\xc5\x00\xc6\x00\x72\x02\x25\x00\xbf\x00\xc7\x00\x07\xff\xc0\x01\x07\xff\x86\x02\xc2\x00\xc3\x00\xc8\x00\xf4\x01\x24\x01\x08\xff\xc4\x00\xbf\x00\x58\x00\x02\xff\xbf\x00\xc5\x00\xc6\x00\xc1\x01\xd6\x00\xfb\x00\xc7\x00\x02\xff\xc2\x01\x02\xff\xaa\x01\xc2\x00\xc3\x00\xc8\x00\xc0\x00\x85\x01\xfc\x00\xc4\x00\x44\x01\xc0\x00\x01\xff\xbf\x00\xc5\x00\xc6\x00\x14\x01\x98\x00\x32\x01\xc7\x00\x01\xff\x0c\xff\x01\xff\xec\x00\xc2\x00\xc3\x00\xc8\x00\xcf\x01\xee\x00\x16\x01\xc4\x00\x33\x01\xc0\x00\xfe\xfe\x97\x00\xc5\x00\xc6\x00\xfc\x00\x79\x00\x48\x01\xc7\x00\xfe\xfe\x0b\xff\xfe\xfe\x98\x00\xc2\x00\xc3\x00\xc8\x00\x59\x01\x48\x01\x47\x01\xc4\x00\x72\x02\xc0\x00\xfd\xfe\x60\x02\xc5\x00\xc6\x00\x49\x01\x73\x02\x6d\x02\xc7\x00\xfd\xfe\x09\xff\xfd\xfe\x7a\x00\xc2\x00\xc3\x00\xc8\x00\x62\x02\x7b\x00\x7c\x00\xc4\x00\xbb\x00\xd6\x00\xfc\xfe\xbc\x00\xc5\x00\xc6\x00\x8a\x00\xc3\x01\x66\x02\xc7\x00\xfc\xfe\x07\xff\xfc\xfe\x1a\x00\xc2\x00\xc3\x00\xc8\x00\xc2\x00\xc3\x00\x14\x02\xc4\x00\xb2\x01\xd6\x00\xfb\xfe\x70\xff\xc5\x00\xc6\x00\x1e\x00\xd7\x00\x25\x02\xc7\x00\xfb\xfe\x02\xff\xfb\xfe\xf8\x01\x2b\x01\x1f\x00\xc8\x00\x8b\x00\x21\x00\xec\x00\xc4\x00\x22\x00\x70\xff\xc4\x00\x23\x00\xc5\x00\xc6\x00\x1b\x02\xc5\x00\xc6\x00\xc7\x00\xec\x00\x01\xff\xc7\x00\x1d\x02\xed\x00\xee\x00\xc8\x00\x26\x02\x8c\x00\xc8\x00\x4d\x02\x2d\x02\x4e\x02\x2e\x02\x7d\x00\xb2\x00\x7d\x00\xb2\x00\xc2\x00\xc3\x00\x3b\x02\x25\x00\xfe\xfe\x8e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x8f\x00\x23\x01\x24\x01\xd3\x01\x33\x02\x53\x02\x2e\x00\xb6\x00\xd4\x01\xb6\x00\x2f\x00\x30\x02\x30\x00\xfd\xfe\x31\x00\xc4\x00\x80\x00\x32\x00\x80\x00\x31\x02\xc5\x00\xc6\x00\x2a\x01\x2b\x01\x36\x02\xc7\x00\x0d\x01\x34\x00\xe9\x01\x0d\x01\x35\x00\x70\x01\xc8\x00\x0d\x01\xfc\xfe\x0e\x01\x1a\x00\x0d\x01\x47\x02\x0f\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x49\x02\x1e\x00\x50\x02\x51\x02\xa7\x00\xa8\x00\xfb\xfe\x2d\x01\x2e\x01\xff\xff\x1f\x00\x4c\x02\x29\x02\x21\x00\x4a\x02\xf0\x01\x22\x00\x21\x02\x22\x02\x23\x00\x2a\x02\x06\x00\x40\x00\x41\x00\x42\x00\xd1\x01\x4b\x02\xc4\x01\x43\x00\x44\x00\x8a\xff\xc5\x01\x2b\x02\x25\x00\xad\x00\x90\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xc6\x01\xc7\x01\xc8\x01\xc9\x01\x2c\x00\x2d\x00\x2e\x00\x23\x02\x24\x02\x25\x02\x2f\x00\x19\x02\x30\x00\xca\x01\x31\x00\xcb\x01\x1a\x02\x32\x00\xd6\x01\xae\x00\xd7\x01\xd8\x01\xda\x01\xdc\x01\xaf\x00\xb0\x00\x4d\x00\x34\x00\xb1\x00\xf9\x01\x35\x00\xde\x01\xe0\x01\xe1\x01\x50\x00\xe2\x01\xb2\x00\xe3\x01\xe4\x01\xe5\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x3f\x00\xe6\x01\x40\x00\x41\x00\x42\x00\xe7\x01\xec\x01\xef\x01\x43\x00\x44\x00\x45\x00\x25\x00\x79\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xfa\x01\x01\x02\x03\x02\x19\x02\x2c\x00\x2d\x00\x2e\x00\x05\x02\x34\x02\x07\x02\x2f\x00\x0c\x02\x30\x00\x52\x01\x31\x00\x55\x01\x57\x01\x32\x00\x4d\x00\xae\x00\x61\x01\x77\x00\xc2\x00\xc3\x00\x7b\x00\x7c\x00\x50\x00\x34\x00\x62\x01\x66\x01\x35\x00\xc2\x00\xc3\x00\xef\x00\xb2\x00\x67\x01\x7e\x01\xf0\x00\xee\x00\x8a\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x8b\x01\x8c\x01\xf1\x00\x8e\x01\xc5\x00\xc6\x00\xb6\x00\xf2\x00\xc4\x00\xc7\x00\x9b\x01\x9d\x01\x9f\x01\xc5\x00\xc6\x00\x80\x00\xc8\x00\xa1\x01\xc7\x00\x3f\x00\xa3\x01\x40\x00\x41\x00\x42\x00\xb8\x01\xc8\x00\x51\x01\x43\x00\x44\x00\x45\x00\x25\x00\xb9\x01\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xbd\x01\xdc\x00\x7d\x00\xb2\x00\x2c\x00\x2d\x00\x2e\x00\xe2\x00\xe5\x00\xe8\x00\x2f\x00\xea\x00\x30\x00\xf9\x00\x31\x00\x10\x01\x1e\x01\x32\x00\x17\x01\x33\x00\x15\x01\x52\x02\xf3\x01\xc2\x00\xc3\x00\xb6\x00\x18\x01\x34\x00\x1f\x01\x22\x01\x35\x00\xc2\x00\xc3\x00\x26\x01\x80\x00\x2e\x01\x3a\x01\x3b\x01\x3e\x01\xd2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x01\xc4\x00\x40\x01\x46\x01\x71\x00\xee\x01\xc5\x00\xc6\x00\x4a\x01\xc4\x00\x4f\x01\xc7\x00\x72\x00\x73\x00\xc5\x00\xc6\x00\xc2\x00\xc3\x00\xc8\x00\xc7\x00\x3f\x00\x77\x00\x40\x00\x41\x00\x42\x00\x16\x02\xc8\x00\x90\x00\x43\x00\x44\x00\x45\x00\x25\x00\x92\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x9a\x00\x9d\x00\x9e\x00\xc4\x00\x2c\x00\x2d\x00\x2e\x00\xa0\x00\xc5\x00\xc6\x00\x2f\x00\xa5\x00\x30\x00\xc7\x00\x31\x00\xcf\x00\x88\x02\x32\x00\xbd\x00\x33\x00\xc8\x00\xc8\x00\x21\x01\xc2\x00\xc3\x00\xd5\x00\x04\x00\x34\x00\x8a\x02\x84\x02\x35\x00\xc2\x00\xc3\x00\x7d\x02\x72\x02\x75\x02\x55\x02\xf8\x00\x40\xff\xd4\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x56\x02\xc4\x00\x00\x00\x12\x01\x5f\x02\x62\x02\xc5\x00\xc6\x00\x68\x02\xc4\x00\x66\x01\xc7\x00\x69\x02\x6c\x02\xc5\x00\xc6\x00\xc2\x00\xc3\x00\xc8\x00\xc7\x00\x3f\x00\x6b\x02\x40\x00\x41\x00\x42\x00\x14\x02\xc8\x00\x70\x02\x43\x00\x44\x00\x45\x00\x25\x00\xf6\x01\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x17\x02\x18\x02\x19\x02\xc4\x00\x2c\x00\x2d\x00\x2e\x00\x28\x02\xc5\x00\xc6\x00\x2f\x00\x29\x02\x30\x00\xc7\x00\x31\x00\x52\x02\x33\x02\x32\x00\x05\x02\x33\x00\xc8\x00\x39\x02\xc2\x00\xc3\x00\xcf\x01\x3f\x02\x40\x02\x34\x00\x41\x02\x42\x02\x35\x00\xc2\x00\xc3\x00\x7d\x00\xb2\x00\x43\x02\xd3\x01\xf8\x00\xda\x01\x87\xff\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x3d\xff\xde\x01\xd5\x01\xe0\x01\xc5\x00\xc6\x00\xb6\x00\xec\x00\xc4\x00\xc7\x00\xeb\x01\x03\x02\xef\x01\xc5\x00\xc6\x00\x80\x00\xc8\x00\xec\x01\xc7\x00\x3f\x00\xfd\x01\x40\x00\x41\x00\x42\x00\x05\x02\xc8\x00\x0f\x02\x43\x00\x44\x00\x45\x00\x25\x00\x10\x02\x1e\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x11\x02\x54\x01\x12\x02\x55\x01\x2c\x00\x2d\x00\x2e\x00\x59\x01\x5c\x01\x5b\x01\x2f\x00\x5d\x01\x30\x00\x5e\x01\x31\x00\x64\x01\x69\x01\x32\x00\x6a\x01\x33\x00\x6b\x01\x6c\x01\xc2\x00\xc3\x00\x06\x01\xc3\x00\x6d\x01\x34\x00\x70\x01\x7a\x01\x35\x00\x79\x01\x7b\x01\x94\x00\x81\x01\x85\x01\x82\x01\x65\x01\x80\x01\x07\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x88\x01\x08\x01\x95\x01\x92\x01\xc5\x00\xc6\x00\x09\x01\x0a\x01\x66\x01\xc7\x00\x0b\x01\xc7\x00\x93\x01\x94\x01\xa5\x01\xa7\x01\xc8\x00\xad\x01\x0c\x01\x3f\x00\xb1\x01\x40\x00\x41\x00\x42\x00\xb3\x01\xb4\x01\xb5\x01\x43\x00\x44\x00\x45\x00\x25\x00\xb7\x01\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x7d\x00\xb2\x00\xda\x00\x2c\x00\x2d\x00\x2e\x00\xe7\x00\xe4\x00\xea\x00\x2f\x00\xec\x00\x30\x00\xf9\x00\x31\x00\xfb\x00\xf5\x00\x32\x00\x00\x00\x33\x00\xe8\x01\xc3\xff\x22\x01\xc4\xff\xb6\x00\x03\x01\xec\x00\x34\x00\xec\x00\x30\x01\x35\x00\xc2\x00\xc3\x00\x80\x00\x34\x01\x4c\x01\x44\x01\x4d\x01\x7d\x00\xb2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x6b\x00\x6c\x00\x6e\x00\x6f\x00\x71\x00\x13\x01\x75\x00\x70\x00\xa5\x01\xc4\x00\x76\x00\x77\x00\xb6\x00\x92\x00\xc5\x00\xc6\x00\xc2\x00\xc3\x00\x14\x01\xc7\x00\x3f\x00\x80\x00\x40\x00\x41\x00\x42\x00\xf7\x01\xc8\x00\x86\x00\x43\x00\x44\x00\x45\x00\x25\x00\x94\x00\x1e\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x87\x00\x88\x00\x89\x00\xc4\x00\x2c\x00\x2d\x00\x2e\x00\x8a\x00\xc5\x00\xc6\x00\x2f\x00\x95\x00\x30\x00\xc7\x00\x31\x00\xff\xff\xff\xff\x32\x00\xbf\x00\x33\x00\xc8\x00\x00\x00\xc2\x00\xc3\x00\xc2\x00\xc3\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\xf8\x01\x00\x00\x0a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x00\x00\xc4\x00\x00\x00\x00\x00\xc5\x00\xc6\x00\xc5\x00\xc6\x00\x00\x00\xc7\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x3f\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x43\x00\x44\x00\x45\x00\x25\x00\x00\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x33\x00\x00\x00\x00\x00\xc2\x00\xc3\x00\xc2\x00\xc3\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x0b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x00\x00\xc4\x00\x00\x00\x00\x00\xc5\x00\xc6\x00\xc5\x00\xc6\x00\x00\x00\xc7\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x3f\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x43\x00\x44\x00\x45\x00\x25\x00\x00\x00\x1e\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x33\x00\x00\x00\x00\x00\xc2\x00\xc3\x00\xc2\x00\xc3\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x13\x02\x00\x00\x00\x00\x00\x00\x00\x00\x09\x02\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x00\x00\xc4\x00\x00\x00\x00\x00\xc5\x00\xc6\x00\xc5\x00\xc6\x00\x00\x00\xc7\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x3f\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x7d\x00\xb2\x00\x43\x00\x44\x00\x45\x00\x25\x00\x00\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x8b\x02\x00\x00\x00\x00\x00\x00\xa7\x01\x2e\x00\x00\x00\x00\x00\xb6\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x80\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc3\x00\x34\x00\x76\x01\x77\x01\x35\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x78\x01\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc6\x00\x00\x00\x25\x00\x00\x00\xc7\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xc8\x00\x7f\x02\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x00\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x79\x02\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\x8b\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x01\x00\x00\x00\x00\x25\x00\xb6\x00\x8e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x80\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x00\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x01\x00\x00\xa9\x01\x00\x00\x00\x00\x25\x00\xb6\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2d\x02\x80\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\x8b\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x01\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x3a\x02\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\x8b\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x00\x00\x25\x00\xb6\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x80\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x44\x02\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x45\x02\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x46\x02\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x47\x02\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x8e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x00\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\x29\x02\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x64\x02\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\xba\x01\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x63\x02\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc3\x00\x25\x00\x79\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x01\xb9\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x7a\x00\x00\x00\xc5\x00\xc6\x00\x00\x00\x7b\x00\x7c\x00\xc7\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xbb\x00\x25\x00\x00\x00\xb8\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xba\x00\x1a\x00\x00\x00\x96\x01\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x21\x00\x97\x01\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xbb\x00\x25\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x98\x01\x56\x01\x47\x00\x48\x00\x49\x00\x00\x00\xb9\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x84\x00\x85\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xbb\x00\x00\x00\x25\x00\x7d\x00\xb2\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\xb3\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x82\x00\x00\x00\x00\x00\x00\x00\x48\x02\xb5\x00\x84\x00\x85\x00\x31\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xff\xc3\x00\x80\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x65\xff\x65\xff\x65\xff\x00\x00\x00\x00\x00\x00\x65\xff\x00\x00\x65\xff\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x65\xff\x00\x00\x00\x00\x65\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xff\x65\xff\x00\x00\x00\x00\x35\x01\x47\x00\x48\x00\x49\x00\x65\xff\x65\xff\x00\x00\x65\xff\x00\x00\x00\x00\x84\x00\x85\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x00\x00\x65\xff\x00\x00\x00\x00\x50\x00\x36\x01\x47\x00\x48\x00\x49\x00\x00\x00\x65\xff\x00\x00\x37\x01\x47\x00\x48\x00\x49\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x4a\x00\x4e\x00\x4f\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x50\x00\x4e\x00\x4f\x00\x38\x01\x47\x00\x48\x00\x49\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x01\x47\x00\x48\x00\x49\x00\x00\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x95\x00\x47\x00\x48\x00\x49\x00\x50\x00\x00\x00\x00\x00\x96\x00\x47\x00\x48\x00\x49\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x4a\x00\x4e\x00\x4f\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x50\x00\x4e\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x46\x00\x47\x00\x48\x00\x49\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x1f\x00\x00\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x1a\x00\x23\x00\xe1\x00\x00\x00\x00\x00\x1a\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x95\x01\x00\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x21\x00\x00\x00\x1f\x00\x22\x00\x20\x00\x21\x00\x23\x00\x00\x00\x22\x00\x00\x00\x1a\x00\x23\x00\xfd\x00\x00\x00\x00\x00\x1a\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x99\x01\x00\x00\x1c\x00\x1d\x00\x1e\x00\x9a\x01\x00\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x21\x00\x00\x00\x1f\x00\x22\x00\x20\x00\x21\x00\x23\x00\x77\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x1a\x00\x00\x00\x3c\x01\x00\x01\x1c\x00\x1d\x00\x1e\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x20\x00\x21\x00\xab\x00\x00\x00\x22\x00\x00\x00\x1f\x00\x23\x00\x20\x00\x21\x00\x3d\x01\x19\x01\x22\x00\x1a\x01\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x1f\x00\x1a\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x02\x1c\x01\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x1f\x00\x1a\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x86\x01\x1c\x01\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x8f\x01\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x1b\x01\x1c\x01\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\xcd\x01\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x96\x01\x20\x00\x21\x00\x00\x00\x3c\x02\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x8f\x01\x20\x00\x21\x00\x97\x01\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\xcd\x01\xd0\x01\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x5a\x02\x20\x00\x21\x00\x00\x00\x90\x01\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x36\x02\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\xfb\x01\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x3a\x02\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\xf1\x01\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x0b\x02\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\xf3\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x0d\x02\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x30\x01\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x51\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x5e\x01\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\xb4\x00\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x5f\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x60\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x6d\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x7b\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x7c\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x7d\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x82\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x83\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x8d\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xdf\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xe0\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xb7\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xbc\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xda\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xdb\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xdd\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xde\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xdf\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xe0\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xe1\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xe4\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xf3\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xa1\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x01\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x03\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x6c\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x99\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x9f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xa1\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xa3\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xa4\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xc9\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xca\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xcb\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xcc\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xcd\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xce\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xd0\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xd2\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xd4\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xd8\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x1b\x00\x20\x00\x21\x00\x1a\x00\x00\x00\x22\x00\x00\x00\x1e\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x1e\x00\xba\x01\x21\x00\x1a\x00\x1f\x00\x22\x00\x20\x00\x21\x00\x23\x00\x1f\x00\x22\x00\xba\x01\x21\x00\x23\x00\x00\x00\x22\x00\x1a\x00\x1e\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x1f\x00\x00\x00\xdb\x01\x21\x00\x1e\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1a\x00\x1e\x00\x1f\x00\x00\x00\xba\x01\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x1f\x00\x23\x00\xba\x01\x21\x00\x1e\x00\x00\x00\x22\x00\x1a\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\xe7\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x1e\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\xa2\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyReduceArr = Happy_Data_Array.array (3, 272) [-	(3 , happyReduce_3),-	(4 , happyReduce_4),-	(5 , happyReduce_5),-	(6 , happyReduce_6),-	(7 , happyReduce_7),-	(8 , happyReduce_8),-	(9 , happyReduce_9),-	(10 , happyReduce_10),-	(11 , happyReduce_11),-	(12 , happyReduce_12),-	(13 , happyReduce_13),-	(14 , happyReduce_14),-	(15 , happyReduce_15),-	(16 , happyReduce_16),-	(17 , happyReduce_17),-	(18 , happyReduce_18),-	(19 , happyReduce_19),-	(20 , happyReduce_20),-	(21 , happyReduce_21),-	(22 , happyReduce_22),-	(23 , happyReduce_23),-	(24 , happyReduce_24),-	(25 , happyReduce_25),-	(26 , happyReduce_26),-	(27 , happyReduce_27),-	(28 , happyReduce_28),-	(29 , happyReduce_29),-	(30 , happyReduce_30),-	(31 , happyReduce_31),-	(32 , happyReduce_32),-	(33 , happyReduce_33),-	(34 , happyReduce_34),-	(35 , happyReduce_35),-	(36 , happyReduce_36),-	(37 , happyReduce_37),-	(38 , happyReduce_38),-	(39 , happyReduce_39),-	(40 , happyReduce_40),-	(41 , happyReduce_41),-	(42 , happyReduce_42),-	(43 , happyReduce_43),-	(44 , happyReduce_44),-	(45 , happyReduce_45),-	(46 , happyReduce_46),-	(47 , happyReduce_47),-	(48 , happyReduce_48),-	(49 , happyReduce_49),-	(50 , happyReduce_50),-	(51 , happyReduce_51),-	(52 , happyReduce_52),-	(53 , happyReduce_53),-	(54 , happyReduce_54),-	(55 , happyReduce_55),-	(56 , happyReduce_56),-	(57 , happyReduce_57),-	(58 , happyReduce_58),-	(59 , happyReduce_59),-	(60 , happyReduce_60),-	(61 , happyReduce_61),-	(62 , happyReduce_62),-	(63 , happyReduce_63),-	(64 , happyReduce_64),-	(65 , happyReduce_65),-	(66 , happyReduce_66),-	(67 , happyReduce_67),-	(68 , happyReduce_68),-	(69 , happyReduce_69),-	(70 , happyReduce_70),-	(71 , happyReduce_71),-	(72 , happyReduce_72),-	(73 , happyReduce_73),-	(74 , happyReduce_74),-	(75 , happyReduce_75),-	(76 , happyReduce_76),-	(77 , happyReduce_77),-	(78 , happyReduce_78),-	(79 , happyReduce_79),-	(80 , happyReduce_80),-	(81 , happyReduce_81),-	(82 , happyReduce_82),-	(83 , happyReduce_83),-	(84 , happyReduce_84),-	(85 , happyReduce_85),-	(86 , happyReduce_86),-	(87 , happyReduce_87),-	(88 , happyReduce_88),-	(89 , happyReduce_89),-	(90 , happyReduce_90),-	(91 , happyReduce_91),-	(92 , happyReduce_92),-	(93 , happyReduce_93),-	(94 , happyReduce_94),-	(95 , happyReduce_95),-	(96 , happyReduce_96),-	(97 , happyReduce_97),-	(98 , happyReduce_98),-	(99 , happyReduce_99),-	(100 , happyReduce_100),-	(101 , happyReduce_101),-	(102 , happyReduce_102),-	(103 , happyReduce_103),-	(104 , happyReduce_104),-	(105 , happyReduce_105),-	(106 , happyReduce_106),-	(107 , happyReduce_107),-	(108 , happyReduce_108),-	(109 , happyReduce_109),-	(110 , happyReduce_110),-	(111 , happyReduce_111),-	(112 , happyReduce_112),-	(113 , happyReduce_113),-	(114 , happyReduce_114),-	(115 , happyReduce_115),-	(116 , happyReduce_116),-	(117 , happyReduce_117),-	(118 , happyReduce_118),-	(119 , happyReduce_119),-	(120 , happyReduce_120),-	(121 , happyReduce_121),-	(122 , happyReduce_122),-	(123 , happyReduce_123),-	(124 , happyReduce_124),-	(125 , happyReduce_125),-	(126 , happyReduce_126),-	(127 , happyReduce_127),-	(128 , happyReduce_128),-	(129 , happyReduce_129),-	(130 , happyReduce_130),-	(131 , happyReduce_131),-	(132 , happyReduce_132),-	(133 , happyReduce_133),-	(134 , happyReduce_134),-	(135 , happyReduce_135),-	(136 , happyReduce_136),-	(137 , happyReduce_137),-	(138 , happyReduce_138),-	(139 , happyReduce_139),-	(140 , happyReduce_140),-	(141 , happyReduce_141),-	(142 , happyReduce_142),-	(143 , happyReduce_143),-	(144 , happyReduce_144),-	(145 , happyReduce_145),-	(146 , happyReduce_146),-	(147 , happyReduce_147),-	(148 , happyReduce_148),-	(149 , happyReduce_149),-	(150 , happyReduce_150),-	(151 , happyReduce_151),-	(152 , happyReduce_152),-	(153 , happyReduce_153),-	(154 , happyReduce_154),-	(155 , happyReduce_155),-	(156 , happyReduce_156),-	(157 , happyReduce_157),-	(158 , happyReduce_158),-	(159 , happyReduce_159),-	(160 , happyReduce_160),-	(161 , happyReduce_161),-	(162 , happyReduce_162),-	(163 , happyReduce_163),-	(164 , happyReduce_164),-	(165 , happyReduce_165),-	(166 , happyReduce_166),-	(167 , happyReduce_167),-	(168 , happyReduce_168),-	(169 , happyReduce_169),-	(170 , happyReduce_170),-	(171 , happyReduce_171),-	(172 , happyReduce_172),-	(173 , happyReduce_173),-	(174 , happyReduce_174),-	(175 , happyReduce_175),-	(176 , happyReduce_176),-	(177 , happyReduce_177),-	(178 , happyReduce_178),-	(179 , happyReduce_179),-	(180 , happyReduce_180),-	(181 , happyReduce_181),-	(182 , happyReduce_182),-	(183 , happyReduce_183),-	(184 , happyReduce_184),-	(185 , happyReduce_185),-	(186 , happyReduce_186),-	(187 , happyReduce_187),-	(188 , happyReduce_188),-	(189 , happyReduce_189),-	(190 , happyReduce_190),-	(191 , happyReduce_191),-	(192 , happyReduce_192),-	(193 , happyReduce_193),-	(194 , happyReduce_194),-	(195 , happyReduce_195),-	(196 , happyReduce_196),-	(197 , happyReduce_197),-	(198 , happyReduce_198),-	(199 , happyReduce_199),-	(200 , happyReduce_200),-	(201 , happyReduce_201),-	(202 , happyReduce_202),-	(203 , happyReduce_203),-	(204 , happyReduce_204),-	(205 , happyReduce_205),-	(206 , happyReduce_206),-	(207 , happyReduce_207),-	(208 , happyReduce_208),-	(209 , happyReduce_209),-	(210 , happyReduce_210),-	(211 , happyReduce_211),-	(212 , happyReduce_212),-	(213 , happyReduce_213),-	(214 , happyReduce_214),-	(215 , happyReduce_215),-	(216 , happyReduce_216),-	(217 , happyReduce_217),-	(218 , happyReduce_218),-	(219 , happyReduce_219),-	(220 , happyReduce_220),-	(221 , happyReduce_221),-	(222 , happyReduce_222),-	(223 , happyReduce_223),-	(224 , happyReduce_224),-	(225 , happyReduce_225),-	(226 , happyReduce_226),-	(227 , happyReduce_227),-	(228 , happyReduce_228),-	(229 , happyReduce_229),-	(230 , happyReduce_230),-	(231 , happyReduce_231),-	(232 , happyReduce_232),-	(233 , happyReduce_233),-	(234 , happyReduce_234),-	(235 , happyReduce_235),-	(236 , happyReduce_236),-	(237 , happyReduce_237),-	(238 , happyReduce_238),-	(239 , happyReduce_239),-	(240 , happyReduce_240),-	(241 , happyReduce_241),-	(242 , happyReduce_242),-	(243 , happyReduce_243),-	(244 , happyReduce_244),-	(245 , happyReduce_245),-	(246 , happyReduce_246),-	(247 , happyReduce_247),-	(248 , happyReduce_248),-	(249 , happyReduce_249),-	(250 , happyReduce_250),-	(251 , happyReduce_251),-	(252 , happyReduce_252),-	(253 , happyReduce_253),-	(254 , happyReduce_254),-	(255 , happyReduce_255),-	(256 , happyReduce_256),-	(257 , happyReduce_257),-	(258 , happyReduce_258),-	(259 , happyReduce_259),-	(260 , happyReduce_260),-	(261 , happyReduce_261),-	(262 , happyReduce_262),-	(263 , happyReduce_263),-	(264 , happyReduce_264),-	(265 , happyReduce_265),-	(266 , happyReduce_266),-	(267 , happyReduce_267),-	(268 , happyReduce_268),-	(269 , happyReduce_269),-	(270 , happyReduce_270),-	(271 , happyReduce_271),-	(272 , happyReduce_272)-	]--happy_n_terms = 126 :: Int-happy_n_nonterms = 79 :: Int--happyReduce_3 = happySpecReduce_0  0# happyReduction_3-happyReduction_3  =  happyIn6-		 ([]-	)--happyReduce_4 = happySpecReduce_2  0# happyReduction_4-happyReduction_4 happy_x_2-	happy_x_1-	 =  case happyOut7 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_2 of { happy_var_2 -> -	happyIn6-		 (happy_var_1:happy_var_2-	)}}--happyReduce_5 = happySpecReduce_2  0# happyReduction_5-happyReduction_5 happy_x_2-	happy_x_1-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_2 of { happy_var_2 -> -	happyIn6-		 (map RealDecl happy_var_1 ++ happy_var_2-	)}}--happyReduce_6 = happyReduce 4# 0# happyReduction_6-happyReduction_6 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> -	case happyOut6 happy_x_4 of { happy_var_4 -> -	happyIn6-		 (RealDecl (PInclude happy_var_2) : happy_var_4-	) `HappyStk` happyRest}}--happyReduce_7 = happySpecReduce_1  1# happyReduction_7-happyReduction_7 happy_x_1-	 =  case happyOut9 happy_x_1 of { happy_var_1 -> -	happyIn7-		 (happy_var_1-	)}--happyReduce_8 = happySpecReduce_1  1# happyReduction_8-happyReduction_8 happy_x_1-	 =  case happyOut26 happy_x_1 of { happy_var_1 -> -	happyIn7-		 (RealDecl (DataDecl happy_var_1)-	)}--happyReduce_9 = happySpecReduce_1  1# happyReduction_9-happyReduction_9 happy_x_1-	 =  case happyOut22 happy_x_1 of { happy_var_1 -> -	happyIn7-		 (RealDecl happy_var_1-	)}--happyReduce_10 = happyReduce 5# 1# happyReduction_10-happyReduction_10 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { (TokenName happy_var_2) -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn7-		 (RealDecl (Freeze happy_var_3 happy_var_4 [] happy_var_2)-	) `HappyStk` happyRest}}}--happyReduce_11 = happyReduce 4# 1# happyReduction_11-happyReduction_11 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut67 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PUsing happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_12 = happyReduce 4# 1# happyReduction_12-happyReduction_12 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut68 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PDoUsing happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_13 = happyReduce 4# 1# happyReduction_13-happyReduction_13 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut69 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PIdiom happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_14 = happyReduce 4# 1# happyReduction_14-happyReduction_14 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut70 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PParams happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_15 = happyReduce 4# 1# happyReduction_15-happyReduction_15 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut71 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PNamespace happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_16 = happySpecReduce_1  1# happyReduction_16-happyReduction_16 happy_x_1-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> -	happyIn7-		 (RealDecl happy_var_1-	)}--happyReduce_17 = happyReduce 6# 1# happyReduction_17-happyReduction_17 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut41 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_5 of { happy_var_5 -> -	happyIn7-		 (RealDecl (SynDef happy_var_2 happy_var_3 happy_var_5)-	) `HappyStk` happyRest}}}--happyReduce_18 = happyReduce 5# 1# happyReduction_18-happyReduction_18 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn7-		 (RealDecl (SynDef happy_var_2 [] (RVar happy_var_3 happy_var_4 (mkhidden happy_var_2) Unknown))-	) `HappyStk` happyRest}}}--happyReduce_19 = happySpecReduce_2  1# happyReduction_19-happyReduction_19 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> -	happyIn7-		 (RealDecl (CInclude happy_var_2)-	)}--happyReduce_20 = happySpecReduce_2  1# happyReduction_20-happyReduction_20 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> -	happyIn7-		 (RealDecl (CLib happy_var_2)-	)}--happyReduce_21 = happyReduce 5# 2# happyReduction_21-happyReduction_21 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn8-		 (Transform happy_var_2 happy_var_4-	) `HappyStk` happyRest}}--happyReduce_22 = happyReduce 7# 3# happyReduction_22-happyReduction_22 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut50 happy_x_3 of { happy_var_3 -> -	case happyOut15 happy_x_5 of { happy_var_5 -> -	case happyOut83 happy_x_6 of { happy_var_6 -> -	case happyOut82 happy_x_7 of { happy_var_7 -> -	happyIn9-		 (FunType happy_var_1 happy_var_3 (nub happy_var_5) happy_var_6 happy_var_7-	) `HappyStk` happyRest}}}}}--happyReduce_23 = happySpecReduce_3  3# happyReduction_23-happyReduction_23 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut79 happy_x_2 of { happy_var_2 -> -	happyIn9-		 (ProofScript happy_var_1 happy_var_2-	)}}--happyReduce_24 = happyReduce 9# 3# happyReduction_24-happyReduction_24 (happy_x_9 `HappyStk`-	happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut24 happy_x_1 of { happy_var_1 -> -	case happyOut12 happy_x_2 of { happy_var_2 -> -	case happyOut11 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut14 happy_x_6 of { happy_var_6 -> -	case happyOut83 happy_x_8 of { happy_var_8 -> -	case happyOut82 happy_x_9 of { happy_var_9 -> -	happyIn9-		 (WithClause (mkDef happy_var_8 happy_var_9 happy_var_1) happy_var_2 happy_var_3 happy_var_4 happy_var_6-	) `HappyStk` happyRest}}}}}}}--happyReduce_25 = happyReduce 10# 3# happyReduction_25-happyReduction_25 (happy_x_10 `HappyStk`-	happy_x_9 `HappyStk`-	happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut24 happy_x_1 of { happy_var_1 -> -	case happyOut12 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut32 happy_x_7 of { happy_var_7 -> -	case happyOut83 happy_x_9 of { happy_var_9 -> -	case happyOut82 happy_x_10 of { happy_var_10 -> -	happyIn9-		 (FunClauseP (mkDef happy_var_9 happy_var_10 happy_var_1) happy_var_2 happy_var_4 happy_var_7-	) `HappyStk` happyRest}}}}}}--happyReduce_26 = happyReduce 8# 3# happyReduction_26-happyReduction_26 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut24 happy_x_1 of { happy_var_1 -> -	case happyOut12 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut15 happy_x_6 of { happy_var_6 -> -	case happyOut83 happy_x_7 of { happy_var_7 -> -	case happyOut82 happy_x_8 of { happy_var_8 -> -	happyIn9-		 (FunClause (mkDef happy_var_7 happy_var_8 happy_var_1) happy_var_2 happy_var_4 (nub happy_var_6)-	) `HappyStk` happyRest}}}}}}--happyReduce_27 = happyReduce 5# 3# happyReduction_27-happyReduction_27 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut13 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn9-		 (FunClause RPlaceholder [happy_var_2] happy_var_4 []-	) `HappyStk` happyRest}}--happyReduce_28 = happyReduce 8# 3# happyReduction_28-happyReduction_28 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut13 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut32 happy_x_7 of { happy_var_7 -> -	happyIn9-		 (FunClauseP RPlaceholder [happy_var_2] happy_var_4 happy_var_7-	) `HappyStk` happyRest}}}--happyReduce_29 = happyReduce 7# 3# happyReduction_29-happyReduction_29 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut13 happy_x_2 of { happy_var_2 -> -	case happyOut11 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut14 happy_x_6 of { happy_var_6 -> -	happyIn9-		 (WithClause RPlaceholder [happy_var_2] happy_var_3 happy_var_4 happy_var_6-	) `HappyStk` happyRest}}}}--happyReduce_30 = happySpecReduce_1  4# happyReduction_30-happyReduction_30 happy_x_1-	 =  happyIn10-		 (Vis Public-	)--happyReduce_31 = happySpecReduce_1  4# happyReduction_31-happyReduction_31 happy_x_1-	 =  happyIn10-		 (Vis Private-	)--happyReduce_32 = happySpecReduce_1  4# happyReduction_32-happyReduction_32 happy_x_1-	 =  happyIn10-		 (Vis Abstract-	)--happyReduce_33 = happySpecReduce_0  4# happyReduction_33-happyReduction_33  =  happyIn10-		 (Vis Public-	)--happyReduce_34 = happySpecReduce_1  5# happyReduction_34-happyReduction_34 happy_x_1-	 =  happyIn11-		 (False-	)--happyReduce_35 = happySpecReduce_2  5# happyReduction_35-happyReduction_35 happy_x_2-	happy_x_1-	 =  happyIn11-		 (True-	)--happyReduce_36 = happySpecReduce_3  6# happyReduction_36-happyReduction_36 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut13 happy_x_2 of { happy_var_2 -> -	case happyOut12 happy_x_3 of { happy_var_3 -> -	happyIn12-		 (happy_var_2:happy_var_3-	)}}--happyReduce_37 = happySpecReduce_0  6# happyReduction_37-happyReduction_37  =  happyIn12-		 ([]-	)--happyReduce_38 = happySpecReduce_1  7# happyReduction_38-happyReduction_38 happy_x_1-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> -	happyIn13-		 (happy_var_1-	)}--happyReduce_39 = happySpecReduce_1  7# happyReduction_39-happyReduction_39 happy_x_1-	 =  case happyOut58 happy_x_1 of { happy_var_1 -> -	happyIn13-		 (happy_var_1-	)}--happyReduce_40 = happySpecReduce_3  7# happyReduction_40-happyReduction_40 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn13-		 (happy_var_2-	)}--happyReduce_41 = happyReduce 5# 7# happyReduction_41-happyReduction_41 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut59 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn13-		 (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "mkPair") Unknown) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_42 = happySpecReduce_2  8# happyReduction_42-happyReduction_42 happy_x_2-	happy_x_1-	 =  case happyOut9 happy_x_1 of { happy_var_1 -> -	case happyOut14 happy_x_2 of { happy_var_2 -> -	happyIn14-		 (happy_var_1:happy_var_2-	)}}--happyReduce_43 = happySpecReduce_1  8# happyReduction_43-happyReduction_43 happy_x_1-	 =  case happyOut9 happy_x_1 of { happy_var_1 -> -	happyIn14-		 ([happy_var_1]-	)}--happyReduce_44 = happySpecReduce_3  9# happyReduction_44-happyReduction_44 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut16 happy_x_2 of { happy_var_2 -> -	happyIn15-		 (happy_var_2-	)}--happyReduce_45 = happySpecReduce_0  9# happyReduction_45-happyReduction_45  =  happyIn15-		 ([]-	)--happyReduce_46 = happySpecReduce_0  10# happyReduction_46-happyReduction_46  =  happyIn16-		 ([]-	)--happyReduce_47 = happySpecReduce_2  10# happyReduction_47-happyReduction_47 happy_x_2-	happy_x_1-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> -	case happyOut16 happy_x_2 of { happy_var_2 -> -	happyIn16-		 (happy_var_1 ++ happy_var_2-	)}}--happyReduce_48 = happySpecReduce_1  11# happyReduction_48-happyReduction_48 happy_x_1-	 =  happyIn17-		 ([NoCG]-	)--happyReduce_49 = happySpecReduce_1  11# happyReduction_49-happyReduction_49 happy_x_1-	 =  happyIn17-		 ([CGEval, Inline]-	)--happyReduce_50 = happyReduce 4# 11# happyReduction_50-happyReduction_50 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut39 happy_x_3 of { happy_var_3 -> -	happyIn17-		 ([CGSpec happy_var_3]-	) `HappyStk` happyRest}--happyReduce_51 = happySpecReduce_1  11# happyReduction_51-happyReduction_51 happy_x_1-	 =  happyIn17-		 ([CGSpec []]-	)--happyReduce_52 = happySpecReduce_1  11# happyReduction_52-happyReduction_52 happy_x_1-	 =  happyIn17-		 ([Inline]-	)--happyReduce_53 = happySpecReduce_2  11# happyReduction_53-happyReduction_53 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> -	happyIn17-		 ([CExport happy_var_2]-	)}--happyReduce_54 = happyReduce 4# 12# happyReduction_54-happyReduction_54 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut21 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> -	case happyOut19 happy_x_3 of { happy_var_3 -> -	happyIn18-		 (map (\x -> Fixity x happy_var_1 happy_var_2) happy_var_3-	) `HappyStk` happyRest}}}--happyReduce_55 = happySpecReduce_1  13# happyReduction_55-happyReduction_55 happy_x_1-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> -	happyIn19-		 ([happy_var_1]-	)}--happyReduce_56 = happySpecReduce_3  13# happyReduction_56-happyReduction_56 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> -	case happyOut19 happy_x_3 of { happy_var_3 -> -	happyIn19-		 (happy_var_1:happy_var_3-	)}}--happyReduce_57 = happySpecReduce_1  14# happyReduction_57-happyReduction_57 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenInfixName happy_var_1) -> -	happyIn20-		 (happy_var_1-	)}--happyReduce_58 = happySpecReduce_1  14# happyReduction_58-happyReduction_58 happy_x_1-	 =  happyIn20-		 ("-"-	)--happyReduce_59 = happySpecReduce_1  14# happyReduction_59-happyReduction_59 happy_x_1-	 =  happyIn20-		 ("<"-	)--happyReduce_60 = happySpecReduce_1  14# happyReduction_60-happyReduction_60 happy_x_1-	 =  happyIn20-		 (">"-	)--happyReduce_61 = happySpecReduce_1  15# happyReduction_61-happyReduction_61 happy_x_1-	 =  happyIn21-		 (LeftAssoc-	)--happyReduce_62 = happySpecReduce_1  15# happyReduction_62-happyReduction_62 happy_x_1-	 =  happyIn21-		 (RightAssoc-	)--happyReduce_63 = happySpecReduce_1  15# happyReduction_63-happyReduction_63 happy_x_1-	 =  happyIn21-		 (NonAssoc-	)--happyReduce_64 = happyReduce 4# 16# happyReduction_64-happyReduction_64 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut23 happy_x_3 of { happy_var_3 -> -	happyIn22-		 (LatexDefs happy_var_3-	) `HappyStk` happyRest}--happyReduce_65 = happySpecReduce_3  17# happyReduction_65-happyReduction_65 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_3 of { (TokenString happy_var_3) -> -	happyIn23-		 ([(happy_var_1,happy_var_3)]-	)}}--happyReduce_66 = happyReduce 5# 17# happyReduction_66-happyReduction_66 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_3 of { (TokenString happy_var_3) -> -	case happyOut23 happy_x_5 of { happy_var_5 -> -	happyIn23-		 ((happy_var_1,happy_var_3):happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_67 = happySpecReduce_2  18# happyReduction_67-happyReduction_67 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut25 happy_x_2 of { happy_var_2 -> -	happyIn24-		 ((happy_var_1, happy_var_2)-	)}}--happyReduce_68 = happySpecReduce_0  19# happyReduction_68-happyReduction_68  =  happyIn25-		 ([]-	)--happyReduce_69 = happySpecReduce_2  19# happyReduction_69-happyReduction_69 happy_x_2-	happy_x_1-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> -	case happyOut25 happy_x_2 of { happy_var_2 -> -	happyIn25-		 ((happy_var_1,Nothing):happy_var_2-	)}}--happyReduce_70 = happyReduce 5# 19# happyReduction_70-happyReduction_70 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut25 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn25-		 ((RVar happy_var_4 happy_var_5 happy_var_1 Unknown, Just happy_var_1):happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_71 = happyReduce 5# 19# happyReduction_71-happyReduction_71 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut25 happy_x_5 of { happy_var_5 -> -	happyIn25-		 ((happy_var_3, Just happy_var_1):happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_72 = happyReduce 6# 20# happyReduction_72-happyReduction_72 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut27 happy_x_1 of { happy_var_1 -> -	case happyOut29 happy_x_2 of { happy_var_2 -> -	case happyOut32 happy_x_3 of { happy_var_3 -> -	case happyOut28 happy_x_4 of { happy_var_4 -> -	case happyOut83 happy_x_5 of { happy_var_5 -> -	case happyOut82 happy_x_6 of { happy_var_6 -> -	happyIn26-		 (mkDatatype happy_var_1 happy_var_5 happy_var_6 happy_var_3 happy_var_4 happy_var_2-	) `HappyStk` happyRest}}}}}}--happyReduce_73 = happySpecReduce_1  21# happyReduction_73-happyReduction_73 happy_x_1-	 =  happyIn27-		 (False-	)--happyReduce_74 = happySpecReduce_1  21# happyReduction_74-happyReduction_74 happy_x_1-	 =  happyIn27-		 (True-	)--happyReduce_75 = happySpecReduce_3  22# happyReduction_75-happyReduction_75 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut66 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	happyIn28-		 (Right (happy_var_1,happy_var_2)-	)}}--happyReduce_76 = happySpecReduce_3  22# happyReduction_76-happyReduction_76 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_2 of { happy_var_2 -> -	happyIn28-		 (Left happy_var_2-	)}--happyReduce_77 = happySpecReduce_3  22# happyReduction_77-happyReduction_77 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn28-		 (Left (RConst happy_var_2 happy_var_3 TYPE)-	)}}--happyReduce_78 = happySpecReduce_0  23# happyReduction_78-happyReduction_78  =  happyIn29-		 ([]-	)--happyReduce_79 = happySpecReduce_3  23# happyReduction_79-happyReduction_79 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut30 happy_x_2 of { happy_var_2 -> -	happyIn29-		 (happy_var_2-	)}--happyReduce_80 = happySpecReduce_1  24# happyReduction_80-happyReduction_80 happy_x_1-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> -	happyIn30-		 ([happy_var_1]-	)}--happyReduce_81 = happySpecReduce_3  24# happyReduction_81-happyReduction_81 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> -	case happyOut30 happy_x_3 of { happy_var_3 -> -	happyIn30-		 (happy_var_1:happy_var_3-	)}}--happyReduce_82 = happySpecReduce_1  25# happyReduction_82-happyReduction_82 happy_x_1-	 =  happyIn31-		 (NoElim-	)--happyReduce_83 = happySpecReduce_1  25# happyReduction_83-happyReduction_83 happy_x_1-	 =  happyIn31-		 (Collapsible-	)--happyReduce_84 = happySpecReduce_1  26# happyReduction_84-happyReduction_84 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenName happy_var_1) -> -	happyIn32-		 (happy_var_1-	)}--happyReduce_85 = happySpecReduce_3  26# happyReduction_85-happyReduction_85 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut20 happy_x_2 of { happy_var_2 -> -	happyIn32-		 (useropFn happy_var_2-	)}--happyReduce_86 = happyReduce 4# 27# happyReduction_86-happyReduction_86 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut33 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	case happyOut57 happy_x_4 of { happy_var_4 -> -	happyIn33-		 (RApp happy_var_2 happy_var_3 happy_var_1 happy_var_4-	) `HappyStk` happyRest}}}}--happyReduce_87 = happyReduce 5# 27# happyReduction_87-happyReduction_87 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut33 happy_x_1 of { happy_var_1 -> -	case happyOut43 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn33-		 (RAppImp happy_var_4 happy_var_5 (fst happy_var_2) happy_var_1 (snd happy_var_2)-	) `HappyStk` happyRest}}}}--happyReduce_88 = happySpecReduce_3  27# happyReduction_88-happyReduction_88 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (RVar happy_var_2 happy_var_3 happy_var_1 Unknown-	)}}}--happyReduce_89 = happySpecReduce_3  27# happyReduction_89-happyReduction_89 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (RConst happy_var_2 happy_var_3 happy_var_1-	)}}}--happyReduce_90 = happySpecReduce_1  27# happyReduction_90-happyReduction_90 happy_x_1-	 =  happyIn33-		 (RPlaceholder-	)--happyReduce_91 = happySpecReduce_3  27# happyReduction_91-happyReduction_91 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (RVar happy_var_2 happy_var_3 (UN "__Empty") TypeCon-	)}}--happyReduce_92 = happySpecReduce_3  27# happyReduction_92-happyReduction_92 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (RVar happy_var_2 happy_var_3 (UN "__Unit") TypeCon-	)}}--happyReduce_93 = happySpecReduce_1  28# happyReduction_93-happyReduction_93 happy_x_1-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> -	happyIn34-		 (happy_var_1-	)}--happyReduce_94 = happySpecReduce_3  28# happyReduction_94-happyReduction_94 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_2 of { happy_var_2 -> -	happyIn34-		 (happy_var_2-	)}--happyReduce_95 = happyReduce 4# 28# happyReduction_95-happyReduction_95 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	case happyOut57 happy_x_4 of { happy_var_4 -> -	happyIn34-		 (RApp happy_var_2 happy_var_3 happy_var_1 happy_var_4-	) `HappyStk` happyRest}}}}--happyReduce_96 = happyReduce 5# 28# happyReduction_96-happyReduction_96 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut43 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn34-		 (RAppImp happy_var_4 happy_var_5 (fst happy_var_2) happy_var_1 (snd happy_var_2)-	) `HappyStk` happyRest}}}}--happyReduce_97 = happyReduce 4# 28# happyReduction_97-happyReduction_97 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn34-		 (RApp happy_var_3 happy_var_4 (RApp happy_var_3 happy_var_4 (RVar happy_var_3 happy_var_4 (UN "__lazy") Free) RPlaceholder) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_98 = happyReduce 4# 28# happyReduction_98-happyReduction_98 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut35 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn34-		 (doBind Lam happy_var_2 happy_var_4-	) `HappyStk` happyRest}}--happyReduce_99 = happyReduce 4# 28# happyReduction_99-happyReduction_99 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut42 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn34-		 (doLetBind happy_var_2 happy_var_4-	) `HappyStk` happyRest}}--happyReduce_100 = happySpecReduce_1  28# happyReduction_100-happyReduction_100 happy_x_1-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> -	happyIn34-		 (happy_var_1-	)}--happyReduce_101 = happyReduce 8# 28# happyReduction_101-happyReduction_101 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut34 happy_x_6 of { happy_var_6 -> -	case happyOut83 happy_x_7 of { happy_var_7 -> -	case happyOut82 happy_x_8 of { happy_var_8 -> -	happyIn34-		 (mkApp happy_var_7 happy_var_8 (RVar happy_var_7 happy_var_8 (UN "if_then_else") Free) [happy_var_2,happy_var_4,happy_var_6]-	) `HappyStk` happyRest}}}}}--happyReduce_102 = happySpecReduce_2  29# happyReduction_102-happyReduction_102 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	happyIn35-		 ([(happy_var_1,happy_var_2)]-	)}}--happyReduce_103 = happyReduce 4# 29# happyReduction_103-happyReduction_103 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	case happyOut35 happy_x_4 of { happy_var_4 -> -	happyIn35-		 ((happy_var_1,happy_var_2):happy_var_4-	) `HappyStk` happyRest}}}--happyReduce_104 = happySpecReduce_3  30# happyReduction_104-happyReduction_104 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut36 happy_x_3 of { happy_var_3 -> -	happyIn36-		 (happy_var_1 ++ happy_var_3-	)}}--happyReduce_105 = happySpecReduce_1  30# happyReduction_105-happyReduction_105 happy_x_1-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> -	happyIn36-		 (happy_var_1-	)}--happyReduce_106 = happySpecReduce_3  31# happyReduction_106-happyReduction_106 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut50 happy_x_3 of { happy_var_3 -> -	happyIn37-		 (map ( \x -> (x,happy_var_3)) [happy_var_1]-	)}}--happyReduce_107 = happySpecReduce_1  32# happyReduction_107-happyReduction_107 happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	happyIn38-		 ([happy_var_1]-	)}--happyReduce_108 = happySpecReduce_3  32# happyReduction_108-happyReduction_108 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut38 happy_x_3 of { happy_var_3 -> -	happyIn38-		 (happy_var_1:happy_var_3-	)}}--happyReduce_109 = happySpecReduce_2  33# happyReduction_109-happyReduction_109 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> -	happyIn39-		 ([(happy_var_1,happy_var_2)]-	)}}--happyReduce_110 = happySpecReduce_1  33# happyReduction_110-happyReduction_110 happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	happyIn39-		 ([(happy_var_1, 0)]-	)}--happyReduce_111 = happySpecReduce_3  33# happyReduction_111-happyReduction_111 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut39 happy_x_3 of { happy_var_3 -> -	happyIn39-		 ((happy_var_1,0):happy_var_3-	)}}--happyReduce_112 = happyReduce 4# 33# happyReduction_112-happyReduction_112 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> -	case happyOut39 happy_x_4 of { happy_var_4 -> -	happyIn39-		 ((happy_var_1,happy_var_2):happy_var_4-	) `HappyStk` happyRest}}}--happyReduce_113 = happySpecReduce_1  34# happyReduction_113-happyReduction_113 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	happyIn40-		 ([happy_var_1]-	)}--happyReduce_114 = happySpecReduce_3  34# happyReduction_114-happyReduction_114 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut38 happy_x_3 of { happy_var_3 -> -	happyIn40-		 (happy_var_1:happy_var_3-	)}}--happyReduce_115 = happySpecReduce_0  35# happyReduction_115-happyReduction_115  =  happyIn41-		 ([]-	)--happyReduce_116 = happySpecReduce_2  35# happyReduction_116-happyReduction_116 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut41 happy_x_2 of { happy_var_2 -> -	happyIn41-		 (happy_var_1:happy_var_2-	)}}--happyReduce_117 = happyReduce 4# 36# happyReduction_117-happyReduction_117 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn42-		 ([(happy_var_1,happy_var_2,happy_var_4)]-	) `HappyStk` happyRest}}}--happyReduce_118 = happyReduce 6# 36# happyReduction_118-happyReduction_118 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut42 happy_x_6 of { happy_var_6 -> -	happyIn42-		 ((happy_var_1,happy_var_2,happy_var_4):happy_var_6-	) `HappyStk` happyRest}}}}--happyReduce_119 = happySpecReduce_3  37# happyReduction_119-happyReduction_119 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn43-		 ((happy_var_1, RVar happy_var_2 happy_var_3 happy_var_1 Unknown)-	)}}}--happyReduce_120 = happySpecReduce_3  37# happyReduction_120-happyReduction_120 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn43-		 ((happy_var_1, happy_var_3)-	)}}--happyReduce_121 = happyReduce 4# 38# happyReduction_121-happyReduction_121 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn44-		 (RInfix happy_var_3 happy_var_4 Minus (RConst happy_var_3 happy_var_4 (Num 0)) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_122 = happyReduce 5# 38# happyReduction_122-happyReduction_122 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (RUserInfix happy_var_4 happy_var_5 False "-" happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_123 = happyReduce 5# 38# happyReduction_123-happyReduction_123 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (mkApp happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "Pair") TypeCon) [happy_var_1, happy_var_3]-	) `HappyStk` happyRest}}}}--happyReduce_124 = happyReduce 5# 38# happyReduction_124-happyReduction_124 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (RUserInfix happy_var_4 happy_var_5 False "<" happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_125 = happyReduce 5# 38# happyReduction_125-happyReduction_125 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (RUserInfix happy_var_4 happy_var_5 False ">" happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_126 = happyReduce 5# 38# happyReduction_126-happyReduction_126 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn44-		 (RBind (MN "X" 0) (Pi Ex [] happy_var_1) happy_var_3-	) `HappyStk` happyRest}}--happyReduce_127 = happySpecReduce_1  38# happyReduction_127-happyReduction_127 happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	happyIn44-		 (happy_var_1-	)}--happyReduce_128 = happyReduce 5# 38# happyReduction_128-happyReduction_128 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut57 happy_x_1 of { happy_var_1 -> -	case happyOut57 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (RInfix happy_var_4 happy_var_5 JMEq happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_129 = happyReduce 5# 39# happyReduction_129-happyReduction_129 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInfixName happy_var_2) -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn45-		 (RUserInfix happy_var_4 happy_var_5 False happy_var_2 happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}}--happyReduce_130 = happyReduce 6# 40# happyReduction_130-happyReduction_130 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { (TokenInfixName happy_var_2) -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown) happy_var_3)-	) `HappyStk` happyRest}}}}--happyReduce_131 = happyReduce 6# 40# happyReduction_131-happyReduction_131 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (TokenInfixName happy_var_3) -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False happy_var_3 happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown))-	) `HappyStk` happyRest}}}}--happyReduce_132 = happyReduce 6# 40# happyReduction_132-happyReduction_132 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut47 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown) happy_var_3)-	) `HappyStk` happyRest}}}}--happyReduce_133 = happyReduce 6# 40# happyReduction_133-happyReduction_133 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut47 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False happy_var_3 happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown))-	) `HappyStk` happyRest}}}}--happyReduce_134 = happyReduce 6# 40# happyReduction_134-happyReduction_134 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False "-" happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown))-	) `HappyStk` happyRest}}}--happyReduce_135 = happyReduce 6# 40# happyReduction_135-happyReduction_135 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RBind (MN "X" 1) (Pi Ex [] happy_var_2) (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown))-	) `HappyStk` happyRest}}}--happyReduce_136 = happyReduce 6# 40# happyReduction_136-happyReduction_136 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RBind (MN "X" 1) (Pi Ex [] (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown)) happy_var_3)-	) `HappyStk` happyRest}}}--happyReduce_137 = happyReduce 5# 40# happyReduction_137-happyReduction_137 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder)-                       (RBind (MN "X" 1) (Lam RPlaceholder)-                    (RBind (MN "X" 2) (Pi Ex [] (RVar happy_var_3 happy_var_4 (MN "X" 0) Unknown))-                       (RVar happy_var_3 happy_var_4 (MN "X" 1) Unknown)))-	) `HappyStk` happyRest}}--happyReduce_138 = happyReduce 5# 40# happyReduction_138-happyReduction_138 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder)-                   (RBind (MN "X" 1) (Lam RPlaceholder)-                       (pairDesugar happy_var_3 happy_var_4 (RVar happy_var_3 happy_var_4 (UN "mkPair") DataCon)-                                    [RVar happy_var_3 happy_var_4 (MN "X" 0) Unknown,-                                     RVar happy_var_3 happy_var_4 (MN "X" 1) Unknown]))-	) `HappyStk` happyRest}}--happyReduce_139 = happyReduce 6# 40# happyReduction_139-happyReduction_139 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder)-                       (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "mkPair") DataCon)-                                    [happy_var_2,-                                     RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown])-	) `HappyStk` happyRest}}}--happyReduce_140 = happyReduce 6# 40# happyReduction_140-happyReduction_140 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder)-                       (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "mkPair") DataCon)-                                    [RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown, happy_var_3])-	) `HappyStk` happyRest}}}--happyReduce_141 = happySpecReduce_1  41# happyReduction_141-happyReduction_141 happy_x_1-	 =  happyIn47-		 ("<"-	)--happyReduce_142 = happySpecReduce_1  41# happyReduction_142-happyReduction_142 happy_x_1-	 =  happyIn47-		 (">"-	)--happyReduce_143 = happySpecReduce_0  42# happyReduction_143-happyReduction_143  =  happyIn48-		 (RPlaceholder-	)--happyReduce_144 = happySpecReduce_2  42# happyReduction_144-happyReduction_144 happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_2 of { happy_var_2 -> -	happyIn48-		 (happy_var_2-	)}--happyReduce_145 = happySpecReduce_0  43# happyReduction_145-happyReduction_145  =  happyIn49-		 (RPlaceholder-	)--happyReduce_146 = happySpecReduce_2  43# happyReduction_146-happyReduction_146 happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_2 of { happy_var_2 -> -	happyIn49-		 (happy_var_2-	)}--happyReduce_147 = happyReduce 5# 44# happyReduction_147-happyReduction_147 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut40 happy_x_1 of { happy_var_1 -> -	case happyOut49 happy_x_2 of { happy_var_2 -> -	case happyOut50 happy_x_5 of { happy_var_5 -> -	happyIn50-		 (doBind (Pi Im []) (map (\x -> (x, happy_var_2)) happy_var_1) happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_148 = happySpecReduce_1  44# happyReduction_148-happyReduction_148 happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	happyIn50-		 (happy_var_1-	)}--happyReduce_149 = happySpecReduce_3  45# happyReduction_149-happyReduction_149 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut51 happy_x_3 of { happy_var_3 -> -	happyIn51-		 (RBind (MN "X" 0) (Pi Ex [] happy_var_1) happy_var_3-	)}}--happyReduce_150 = happyReduce 6# 45# happyReduction_150-happyReduction_150 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut36 happy_x_2 of { happy_var_2 -> -	case happyOut53 happy_x_4 of { happy_var_4 -> -	case happyOut51 happy_x_6 of { happy_var_6 -> -	happyIn51-		 (doBind (Pi Ex happy_var_4) happy_var_2 happy_var_6-	) `HappyStk` happyRest}}}--happyReduce_151 = happyReduce 5# 45# happyReduction_151-happyReduction_151 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut36 happy_x_2 of { happy_var_2 -> -	case happyOut51 happy_x_5 of { happy_var_5 -> -	happyIn51-		 (doBind (Pi Ex [Lazy]) happy_var_2 happy_var_5-	) `HappyStk` happyRest}}--happyReduce_152 = happySpecReduce_3  45# happyReduction_152-happyReduction_152 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_2 of { happy_var_2 -> -	happyIn51-		 (bracket happy_var_2-	)}--happyReduce_153 = happyReduce 7# 45# happyReduction_153-happyReduction_153 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut51 happy_x_2 of { happy_var_2 -> -	case happyOut51 happy_x_4 of { happy_var_4 -> -	case happyOut83 happy_x_5 of { happy_var_5 -> -	case happyOut82 happy_x_6 of { happy_var_6 -> -	happyIn51-		 (RInfix happy_var_5 happy_var_6 JMEq happy_var_2 happy_var_4-	) `HappyStk` happyRest}}}}--happyReduce_154 = happySpecReduce_1  45# happyReduction_154-happyReduction_154 happy_x_1-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> -	happyIn51-		 (happy_var_1-	)}--happyReduce_155 = happySpecReduce_3  45# happyReduction_155-happyReduction_155 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn51-		 (happy_var_2-	)}--happyReduce_156 = happyReduce 5# 45# happyReduction_156-happyReduction_156 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInfixName happy_var_2) -> -	case happyOut51 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn51-		 (RUserInfix happy_var_4 happy_var_5 False happy_var_2 happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}}--happyReduce_157 = happyReduce 5# 45# happyReduction_157-happyReduction_157 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut51 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn51-		 (RUserInfix happy_var_4 happy_var_5 False "-" happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_158 = happyReduce 5# 45# happyReduction_158-happyReduction_158 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut56 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn51-		 (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "Pair") TypeCon) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_159 = happySpecReduce_1  45# happyReduction_159-happyReduction_159 happy_x_1-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> -	happyIn51-		 (happy_var_1-	)}--happyReduce_160 = happySpecReduce_1  46# happyReduction_160-happyReduction_160 happy_x_1-	 =  happyIn52-		 (Lazy-	)--happyReduce_161 = happySpecReduce_1  46# happyReduction_161-happyReduction_161 happy_x_1-	 =  happyIn52-		 (Static-	)--happyReduce_162 = happySpecReduce_3  47# happyReduction_162-happyReduction_162 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut54 happy_x_2 of { happy_var_2 -> -	happyIn53-		 (happy_var_2-	)}--happyReduce_163 = happySpecReduce_0  47# happyReduction_163-happyReduction_163  =  happyIn53-		 ([]-	)--happyReduce_164 = happySpecReduce_3  48# happyReduction_164-happyReduction_164 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> -	case happyOut54 happy_x_3 of { happy_var_3 -> -	happyIn54-		 (happy_var_1:happy_var_3-	)}}--happyReduce_165 = happySpecReduce_1  48# happyReduction_165-happyReduction_165 happy_x_1-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> -	happyIn54-		 ([happy_var_1]-	)}--happyReduce_166 = happyReduce 8# 49# happyReduction_166-happyReduction_166 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut48 happy_x_3 of { happy_var_3 -> -	case happyOut51 happy_x_5 of { happy_var_5 -> -	case happyOut83 happy_x_7 of { happy_var_7 -> -	case happyOut82 happy_x_8 of { happy_var_8 -> -	happyIn55-		 (sigDesugar happy_var_7 happy_var_8 (happy_var_2, happy_var_3) happy_var_5-	) `HappyStk` happyRest}}}}}--happyReduce_167 = happySpecReduce_3  50# happyReduction_167-happyReduction_167 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut51 happy_x_3 of { happy_var_3 -> -	happyIn56-		 (happy_var_1:happy_var_3:[]-	)}}--happyReduce_168 = happySpecReduce_3  50# happyReduction_168-happyReduction_168 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut56 happy_x_3 of { happy_var_3 -> -	happyIn56-		 (happy_var_1:happy_var_3-	)}}--happyReduce_169 = happySpecReduce_3  51# happyReduction_169-happyReduction_169 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RVar happy_var_2 happy_var_3 happy_var_1 Unknown-	)}}}--happyReduce_170 = happySpecReduce_3  51# happyReduction_170-happyReduction_170 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RReturn happy_var_2 happy_var_3-	)}}--happyReduce_171 = happySpecReduce_3  51# happyReduction_171-happyReduction_171 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn57-		 (bracket happy_var_2-	)}--happyReduce_172 = happySpecReduce_2  51# happyReduction_172-happyReduction_172 happy_x_2-	happy_x_1-	 =  case happyOut57 happy_x_2 of { happy_var_2 -> -	happyIn57-		 (RPure happy_var_2-	)}--happyReduce_173 = happySpecReduce_1  51# happyReduction_173-happyReduction_173 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenMetavar happy_var_1) -> -	happyIn57-		 (RMetavar happy_var_1-	)}--happyReduce_174 = happyReduce 4# 51# happyReduction_174-happyReduction_174 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RMetavarPrf (UN "") happy_var_3 False-	) `HappyStk` happyRest}--happyReduce_175 = happyReduce 4# 51# happyReduction_175-happyReduction_175 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RMetavarPrf (UN "") happy_var_3 True-	) `HappyStk` happyRest}--happyReduce_176 = happyReduce 4# 51# happyReduction_176-happyReduction_176 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn57-		 (RExpVar happy_var_3 happy_var_4 happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_177 = happySpecReduce_3  51# happyReduction_177-happyReduction_177 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RConst happy_var_2 happy_var_3 happy_var_1-	)}}}--happyReduce_178 = happySpecReduce_1  51# happyReduction_178-happyReduction_178 happy_x_1-	 =  happyIn57-		 (RRefl-	)--happyReduce_179 = happySpecReduce_3  51# happyReduction_179-happyReduction_179 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RVar happy_var_2 happy_var_3 (UN "__Empty") TypeCon-	)}}--happyReduce_180 = happySpecReduce_3  51# happyReduction_180-happyReduction_180 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RVar happy_var_2 happy_var_3 (UN "__Unit") TypeCon-	)}}--happyReduce_181 = happySpecReduce_1  51# happyReduction_181-happyReduction_181 happy_x_1-	 =  happyIn57-		 (RPlaceholder-	)--happyReduce_182 = happySpecReduce_1  51# happyReduction_182-happyReduction_182 happy_x_1-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> -	happyIn57-		 (RDo happy_var_1-	)}--happyReduce_183 = happySpecReduce_3  51# happyReduction_183-happyReduction_183 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn57-		 (RIdiom happy_var_2-	)}--happyReduce_184 = happyReduce 5# 51# happyReduction_184-happyReduction_184 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut59 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn57-		 (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "mkPair") DataCon) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_185 = happySpecReduce_1  51# happyReduction_185-happyReduction_185 happy_x_1-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> -	happyIn57-		 (happy_var_1-	)}--happyReduce_186 = happySpecReduce_1  51# happyReduction_186-happyReduction_186 happy_x_1-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> -	happyIn57-		 (happy_var_1-	)}--happyReduce_187 = happySpecReduce_1  51# happyReduction_187-happyReduction_187 happy_x_1-	 =  case happyOut58 happy_x_1 of { happy_var_1 -> -	happyIn57-		 (happy_var_1-	)}--happyReduce_188 = happyReduce 5# 51# happyReduction_188-happyReduction_188 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	case happyOut60 happy_x_4 of { happy_var_4 -> -	happyIn57-		 (mkConsList happy_var_2 happy_var_3 happy_var_4-	) `HappyStk` happyRest}}}--happyReduce_189 = happyReduce 7# 52# happyReduction_189-happyReduction_189 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut83 happy_x_6 of { happy_var_6 -> -	case happyOut82 happy_x_7 of { happy_var_7 -> -	happyIn58-		 (RApp happy_var_6 happy_var_7 (RApp happy_var_6 happy_var_7 (RVar happy_var_6 happy_var_7 (UN "Exists") DataCon) happy_var_2) happy_var_4-	) `HappyStk` happyRest}}}}--happyReduce_190 = happyReduce 5# 52# happyReduction_190-happyReduction_190 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn58-		 (RApp happy_var_4 happy_var_5 (RApp happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "Exists") DataCon) RPlaceholder) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_191 = happySpecReduce_3  53# happyReduction_191-happyReduction_191 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn59-		 (happy_var_1:happy_var_3:[]-	)}}--happyReduce_192 = happySpecReduce_3  53# happyReduction_192-happyReduction_192 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut59 happy_x_3 of { happy_var_3 -> -	happyIn59-		 (happy_var_1:happy_var_3-	)}}--happyReduce_193 = happySpecReduce_0  54# happyReduction_193-happyReduction_193  =  happyIn60-		 ([]-	)--happyReduce_194 = happySpecReduce_1  54# happyReduction_194-happyReduction_194 happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	happyIn60-		 ([happy_var_1]-	)}--happyReduce_195 = happySpecReduce_3  54# happyReduction_195-happyReduction_195 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut60 happy_x_3 of { happy_var_3 -> -	happyIn60-		 (happy_var_1:happy_var_3-	)}}--happyReduce_196 = happyReduce 4# 55# happyReduction_196-happyReduction_196 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut62 happy_x_3 of { happy_var_3 -> -	happyIn61-		 (happy_var_3-	) `HappyStk` happyRest}--happyReduce_197 = happyReduce 10# 55# happyReduction_197-happyReduction_197 (happy_x_10 `HappyStk`-	happy_x_9 `HappyStk`-	happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { (TokenBrackName happy_var_2) -> -	case happyOut48 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_5 of { happy_var_5 -> -	case happyOut83 happy_x_6 of { happy_var_6 -> -	case happyOut82 happy_x_7 of { happy_var_7 -> -	case happyOut62 happy_x_9 of { happy_var_9 -> -	happyIn61-		 (DoBinding happy_var_6 happy_var_7 happy_var_2 happy_var_3 happy_var_5 : happy_var_9-	) `HappyStk` happyRest}}}}}}--happyReduce_198 = happySpecReduce_2  56# happyReduction_198-happyReduction_198 happy_x_2-	happy_x_1-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> -	case happyOut62 happy_x_2 of { happy_var_2 -> -	happyIn62-		 (happy_var_1:happy_var_2-	)}}--happyReduce_199 = happySpecReduce_1  56# happyReduction_199-happyReduction_199 happy_x_1-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> -	happyIn62-		 ([happy_var_1]-	)}--happyReduce_200 = happyReduce 7# 57# happyReduction_200-happyReduction_200 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut83 happy_x_5 of { happy_var_5 -> -	case happyOut82 happy_x_6 of { happy_var_6 -> -	happyIn63-		 (DoBinding happy_var_5 happy_var_6 happy_var_1 happy_var_2 happy_var_4-	) `HappyStk` happyRest}}}}}--happyReduce_201 = happyReduce 8# 57# happyReduction_201-happyReduction_201 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut48 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_5 of { happy_var_5 -> -	case happyOut83 happy_x_6 of { happy_var_6 -> -	case happyOut82 happy_x_7 of { happy_var_7 -> -	happyIn63-		 (DoLet happy_var_6 happy_var_7 happy_var_2 happy_var_3 happy_var_5-	) `HappyStk` happyRest}}}}}--happyReduce_202 = happyReduce 4# 57# happyReduction_202-happyReduction_202 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn63-		 (DoExp happy_var_2 happy_var_3 happy_var_1-	) `HappyStk` happyRest}}}--happyReduce_203 = happySpecReduce_1  58# happyReduction_203-happyReduction_203 happy_x_1-	 =  happyIn64-		 (TYPE-	)--happyReduce_204 = happySpecReduce_1  58# happyReduction_204-happyReduction_204 happy_x_1-	 =  happyIn64-		 (LTYPE-	)--happyReduce_205 = happySpecReduce_1  58# happyReduction_205-happyReduction_205 happy_x_1-	 =  happyIn64-		 (StringType-	)--happyReduce_206 = happySpecReduce_1  58# happyReduction_206-happyReduction_206 happy_x_1-	 =  happyIn64-		 (IntType-	)--happyReduce_207 = happySpecReduce_1  58# happyReduction_207-happyReduction_207 happy_x_1-	 =  happyIn64-		 (CharType-	)--happyReduce_208 = happySpecReduce_1  58# happyReduction_208-happyReduction_208 happy_x_1-	 =  happyIn64-		 (FloatType-	)--happyReduce_209 = happySpecReduce_1  58# happyReduction_209-happyReduction_209 happy_x_1-	 =  happyIn64-		 (PtrType-	)--happyReduce_210 = happySpecReduce_1  58# happyReduction_210-happyReduction_210 happy_x_1-	 =  happyIn64-		 (Builtin "Handle"-	)--happyReduce_211 = happySpecReduce_1  58# happyReduction_211-happyReduction_211 happy_x_1-	 =  happyIn64-		 (Builtin "Lock"-	)--happyReduce_212 = happySpecReduce_1  58# happyReduction_212-happyReduction_212 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenInt happy_var_1) -> -	happyIn64-		 (Num happy_var_1-	)}--happyReduce_213 = happySpecReduce_1  58# happyReduction_213-happyReduction_213 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenChar happy_var_1) -> -	happyIn64-		 (Ch happy_var_1-	)}--happyReduce_214 = happySpecReduce_1  58# happyReduction_214-happyReduction_214 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenString happy_var_1) -> -	happyIn64-		 (Str happy_var_1-	)}--happyReduce_215 = happySpecReduce_1  58# happyReduction_215-happyReduction_215 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBool happy_var_1) -> -	happyIn64-		 (Bo happy_var_1-	)}--happyReduce_216 = happySpecReduce_1  58# happyReduction_216-happyReduction_216 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenFloat happy_var_1) -> -	happyIn64-		 (Fl happy_var_1-	)}--happyReduce_217 = happySpecReduce_0  59# happyReduction_217-happyReduction_217  =  happyIn65-		 ([]-	)--happyReduce_218 = happySpecReduce_2  59# happyReduction_218-happyReduction_218 happy_x_2-	happy_x_1-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	happyIn65-		 (happy_var_1:happy_var_2-	)}}--happyReduce_219 = happyReduce 4# 60# happyReduction_219-happyReduction_219 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut50 happy_x_2 of { happy_var_2 -> -	case happyOut67 happy_x_3 of { happy_var_3 -> -	happyIn66-		 ((happy_var_2, happy_var_3)-	) `HappyStk` happyRest}}--happyReduce_220 = happySpecReduce_3  60# happyReduction_220-happyReduction_220 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn66-		 ((RConst happy_var_2 happy_var_3 TYPE, [])-	)}}--happyReduce_221 = happyReduce 4# 60# happyReduction_221-happyReduction_221 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut73 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn66-		 ((mkTyParams happy_var_3 happy_var_4 happy_var_1, [])-	) `HappyStk` happyRest}}}--happyReduce_222 = happySpecReduce_0  61# happyReduction_222-happyReduction_222  =  happyIn67-		 ([]-	)--happyReduce_223 = happyReduce 4# 61# happyReduction_223-happyReduction_223 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut72 happy_x_3 of { happy_var_3 -> -	happyIn67-		 (happy_var_3-	) `HappyStk` happyRest}--happyReduce_224 = happyReduce 7# 62# happyReduction_224-happyReduction_224 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_4 of { happy_var_4 -> -	case happyOut32 happy_x_6 of { happy_var_6 -> -	happyIn68-		 ((happy_var_4,happy_var_6)-	) `HappyStk` happyRest}}--happyReduce_225 = happyReduce 6# 63# happyReduction_225-happyReduction_225 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_3 of { happy_var_3 -> -	case happyOut32 happy_x_5 of { happy_var_5 -> -	happyIn69-		 ((happy_var_3,happy_var_5)-	) `HappyStk` happyRest}}--happyReduce_226 = happyReduce 4# 64# happyReduction_226-happyReduction_226 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut72 happy_x_3 of { happy_var_3 -> -	happyIn70-		 (happy_var_3-	) `HappyStk` happyRest}--happyReduce_227 = happySpecReduce_2  65# happyReduction_227-happyReduction_227 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_2 of { happy_var_2 -> -	happyIn71-		 (happy_var_2-	)}--happyReduce_228 = happySpecReduce_3  66# happyReduction_228-happyReduction_228 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut50 happy_x_3 of { happy_var_3 -> -	happyIn72-		 ([(happy_var_1, happy_var_3)]-	)}}--happyReduce_229 = happyReduce 5# 66# happyReduction_229-happyReduction_229 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut50 happy_x_3 of { happy_var_3 -> -	case happyOut72 happy_x_5 of { happy_var_5 -> -	happyIn72-		 ((happy_var_1,happy_var_3):happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_230 = happySpecReduce_1  67# happyReduction_230-happyReduction_230 happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	happyIn73-		 ([happy_var_1]-	)}--happyReduce_231 = happySpecReduce_2  67# happyReduction_231-happyReduction_231 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut73 happy_x_2 of { happy_var_2 -> -	happyIn73-		 (happy_var_1:happy_var_2-	)}}--happyReduce_232 = happySpecReduce_1  68# happyReduction_232-happyReduction_232 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn74-		 (happy_var_1-	)}--happyReduce_233 = happySpecReduce_1  68# happyReduction_233-happyReduction_233 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn74-		 (happy_var_1-	)}--happyReduce_234 = happySpecReduce_0  69# happyReduction_234-happyReduction_234  =  happyIn75-		 ([]-	)--happyReduce_235 = happySpecReduce_1  69# happyReduction_235-happyReduction_235 happy_x_1-	 =  case happyOut76 happy_x_1 of { happy_var_1 -> -	happyIn75-		 ([happy_var_1]-	)}--happyReduce_236 = happySpecReduce_3  69# happyReduction_236-happyReduction_236 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut76 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_3 of { happy_var_3 -> -	happyIn75-		 (happy_var_1:happy_var_3-	)}}--happyReduce_237 = happySpecReduce_2  70# happyReduction_237-happyReduction_237 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut77 happy_x_2 of { happy_var_2 -> -	happyIn76-		 (Full happy_var_1 happy_var_2-	)}}--happyReduce_238 = happySpecReduce_2  70# happyReduction_238-happyReduction_238 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	happyIn76-		 (Simple happy_var_1 happy_var_2-	)}}--happyReduce_239 = happySpecReduce_2  71# happyReduction_239-happyReduction_239 happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_2 of { happy_var_2 -> -	happyIn77-		 (happy_var_2-	)}--happyReduce_240 = happySpecReduce_2  72# happyReduction_240-happyReduction_240 happy_x_2-	happy_x_1-	 =  case happyOut38 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Intro happy_var_2-	)}--happyReduce_241 = happySpecReduce_1  72# happyReduction_241-happyReduction_241 happy_x_1-	 =  happyIn78-		 (Intro []-	)--happyReduce_242 = happySpecReduce_2  72# happyReduction_242-happyReduction_242 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Refine happy_var_2-	)}--happyReduce_243 = happySpecReduce_2  72# happyReduction_243-happyReduction_243 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Exists happy_var_2-	)}--happyReduce_244 = happySpecReduce_2  72# happyReduction_244-happyReduction_244 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Generalise happy_var_2-	)}--happyReduce_245 = happySpecReduce_1  72# happyReduction_245-happyReduction_245 happy_x_1-	 =  happyIn78-		 (ReflP-	)--happyReduce_246 = happySpecReduce_2  72# happyReduction_246-happyReduction_246 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Rewrite False False happy_var_2-	)}--happyReduce_247 = happySpecReduce_3  72# happyReduction_247-happyReduction_247 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn78-		 (Rewrite False True happy_var_3-	)}--happyReduce_248 = happySpecReduce_2  72# happyReduction_248-happyReduction_248 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Rewrite True False happy_var_2-	)}--happyReduce_249 = happySpecReduce_3  72# happyReduction_249-happyReduction_249 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn78-		 (Rewrite True True happy_var_3-	)}--happyReduce_250 = happySpecReduce_1  72# happyReduction_250-happyReduction_250 happy_x_1-	 =  happyIn78-		 (Compute-	)--happyReduce_251 = happySpecReduce_2  72# happyReduction_251-happyReduction_251 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Unfold happy_var_2-	)}--happyReduce_252 = happySpecReduce_1  72# happyReduction_252-happyReduction_252 happy_x_1-	 =  happyIn78-		 (Undo-	)--happyReduce_253 = happySpecReduce_2  72# happyReduction_253-happyReduction_253 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Induction happy_var_2-	)}--happyReduce_254 = happySpecReduce_2  72# happyReduction_254-happyReduction_254 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Fill happy_var_2-	)}--happyReduce_255 = happySpecReduce_1  72# happyReduction_255-happyReduction_255 happy_x_1-	 =  happyIn78-		 (Trivial-	)--happyReduce_256 = happySpecReduce_1  72# happyReduction_256-happyReduction_256 happy_x_1-	 =  happyIn78-		 (SimpleSearch-	)--happyReduce_257 = happySpecReduce_2  72# happyReduction_257-happyReduction_257 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (RunTactic happy_var_2-	)}--happyReduce_258 = happySpecReduce_2  72# happyReduction_258-happyReduction_258 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Believe happy_var_2-	)}--happyReduce_259 = happySpecReduce_2  72# happyReduction_259-happyReduction_259 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Use happy_var_2-	)}--happyReduce_260 = happySpecReduce_2  72# happyReduction_260-happyReduction_260 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Decide happy_var_2-	)}--happyReduce_261 = happySpecReduce_1  72# happyReduction_261-happyReduction_261 happy_x_1-	 =  happyIn78-		 (Abandon-	)--happyReduce_262 = happySpecReduce_1  72# happyReduction_262-happyReduction_262 happy_x_1-	 =  happyIn78-		 (ProofTerm-	)--happyReduce_263 = happySpecReduce_1  72# happyReduction_263-happyReduction_263 happy_x_1-	 =  happyIn78-		 (Qed-	)--happyReduce_264 = happyReduce 4# 73# happyReduction_264-happyReduction_264 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn79-		 (happy_var_3-	) `HappyStk` happyRest}--happyReduce_265 = happySpecReduce_2  74# happyReduction_265-happyReduction_265 happy_x_2-	happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	happyIn80-		 ([happy_var_1]-	)}--happyReduce_266 = happySpecReduce_1  74# happyReduction_266-happyReduction_266 happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	happyIn80-		 ([happy_var_1]-	)}--happyReduce_267 = happySpecReduce_3  74# happyReduction_267-happyReduction_267 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn80-		 (happy_var_1:happy_var_3-	)}}--happyReduce_268 = happySpecReduce_1  75# happyReduction_268-happyReduction_268 happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	happyIn81-		 ([happy_var_1]-	)}--happyReduce_269 = happySpecReduce_3  75# happyReduction_269-happyReduction_269 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn81-		 (happy_var_1:happy_var_3-	)}}--happyReduce_270 = happyMonadReduce 0# 76# happyReduction_270-happyReduction_270 (happyRest) tk-	 = happyThen (( getLineNo)-	) (\r -> happyReturn (happyIn82 r))--happyReduce_271 = happyMonadReduce 0# 77# happyReduction_271-happyReduction_271 (happyRest) tk-	 = happyThen (( getFileName)-	) (\r -> happyReturn (happyIn83 r))--happyReduce_272 = happyMonadReduce 0# 78# happyReduction_272-happyReduction_272 (happyRest) tk-	 = happyThen (( getOps)-	) (\r -> happyReturn (happyIn84 r))--happyNewToken action sts stk-	= lexer(\tk -> -	let cont i = happyDoAction i tk action sts stk in-	case tk of {-	TokenEOF -> happyDoAction 125# tk action sts stk;-	TokenName happy_dollar_dollar -> cont 1#;-	TokenInfixName happy_dollar_dollar -> cont 2#;-	TokenBrackName happy_dollar_dollar -> cont 3#;-	TokenString happy_dollar_dollar -> cont 4#;-	TokenInt happy_dollar_dollar -> cont 5#;-	TokenFloat happy_dollar_dollar -> cont 6#;-	TokenChar happy_dollar_dollar -> cont 7#;-	TokenBool happy_dollar_dollar -> cont 8#;-	TokenMetavar happy_dollar_dollar -> cont 9#;-	TokenColon -> cont 10#;-	TokenSemi -> cont 11#;-	TokenBar -> cont 12#;-	TokenStars -> cont 13#;-	TokenLambda -> cont 14#;-	TokenHashOB -> cont 15#;-	TokenOB -> cont 16#;-	TokenCB -> cont 17#;-	TokenOCB -> cont 18#;-	TokenCCB -> cont 19#;-	TokenOSB -> cont 20#;-	TokenCSB -> cont 21#;-	TokenOId -> cont 22#;-	TokenCId -> cont 23#;-	TokenLPair -> cont 24#;-	TokenRPair -> cont 25#;-	TokenExists -> cont 26#;-	TokenTilde -> cont 27#;-	TokenPlus -> cont 28#;-	TokenMinus -> cont 29#;-	TokenTimes -> cont 30#;-	TokenDivide -> cont 31#;-	TokenEquals -> cont 32#;-	TokenMightEqual -> cont 33#;-	TokenLT -> cont 34#;-	TokenGT -> cont 35#;-	TokenEllipsis -> cont 36#;-	TokenUnderscore -> cont 37#;-	TokenComma -> cont 38#;-	TokenTuple -> cont 39#;-	TokenBang -> cont 40#;-	TokenConcat -> cont 41#;-	TokenGE -> cont 42#;-	TokenLE -> cont 43#;-	TokenOr -> cont 44#;-	TokenAnd -> cont 45#;-	TokenArrow -> cont 46#;-	TokenFatArrow -> cont 47#;-	TokenTransArrow -> cont 48#;-	TokenLeftArrow -> cont 49#;-	TokenIntType -> cont 50#;-	TokenCharType -> cont 51#;-	TokenFloatType -> cont 52#;-	TokenStringType -> cont 53#;-	TokenHandleType -> cont 54#;-	TokenPtrType -> cont 55#;-	TokenLockType -> cont 56#;-	TokenType -> cont 57#;-	TokenLType -> cont 58#;-	TokenLazyBracket -> cont 59#;-	TokenDataType -> cont 60#;-	TokenCoDataType -> cont 61#;-	TokenInfix -> cont 62#;-	TokenInfixL -> cont 63#;-	TokenInfixR -> cont 64#;-	TokenUsing -> cont 65#;-	TokenIdiom -> cont 66#;-	TokenParams -> cont 67#;-	TokenNamespace -> cont 68#;-	TokenPublic -> cont 69#;-	TokenPrivate -> cont 70#;-	TokenAbstract -> cont 71#;-	TokenNoElim -> cont 72#;-	TokenCollapsible -> cont 73#;-	TokenWhere -> cont 74#;-	TokenWith -> cont 75#;-	TokenPartial -> cont 76#;-	TokenSyntax -> cont 77#;-	TokenHide -> cont 78#;-	TokenLazy -> cont 79#;-	TokenStatic -> cont 80#;-	TokenRefl -> cont 81#;-	TokenEmptyType -> cont 82#;-	TokenUnitType -> cont 83#;-	TokenInclude -> cont 84#;-	TokenExport -> cont 85#;-	TokenInline -> cont 86#;-	TokenDo -> cont 87#;-	TokenReturn -> cont 88#;-	TokenIf -> cont 89#;-	TokenThen -> cont 90#;-	TokenElse -> cont 91#;-	TokenLet -> cont 92#;-	TokenIn -> cont 93#;-	TokenProof -> cont 94#;-	TokenTryProof -> cont 95#;-	TokenIntro -> cont 96#;-	TokenRefine -> cont 97#;-	TokenGeneralise -> cont 98#;-	TokenReflP -> cont 99#;-	TokenRewrite -> cont 100#;-	TokenRewriteAll -> cont 101#;-	TokenCompute -> cont 102#;-	TokenUnfold -> cont 103#;-	TokenUndo -> cont 104#;-	TokenInduction -> cont 105#;-	TokenFill -> cont 106#;-	TokenTrivial -> cont 107#;-	TokenSimpleSearch -> cont 108#;-	TokenMkTac -> cont 109#;-	TokenBelieve -> cont 110#;-	TokenUse -> cont 111#;-	TokenDecide -> cont 112#;-	TokenAbandon -> cont 113#;-	TokenProofTerm -> cont 114#;-	TokenQED -> cont 115#;-	TokenLaTeX -> cont 116#;-	TokenNoCG -> cont 117#;-	TokenEval -> cont 118#;-	TokenSpec -> cont 119#;-	TokenFreeze -> cont 120#;-	TokenThaw -> cont 121#;-	TokenTransform -> cont 122#;-	TokenCInclude -> cont 123#;-	TokenCLib -> cont 124#;-	_ -> happyError' tk-	})--happyError_ tk = happyError' tk--happyThen :: () => P a -> (a -> P b) -> P b-happyThen = (thenP)-happyReturn :: () => a -> P a-happyReturn = (returnP)-happyThen1 = happyThen-happyReturn1 :: () => a -> P a-happyReturn1 = happyReturn-happyError' :: () => (Token) -> P a-happyError' tk = (\token -> happyError) tk--mkparse = happySomeParser where-  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))--mkparseTerm = happySomeParser where-  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut34 x))--mkparseTactic = happySomeParser where-  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut78 x))--happySeq = happyDontSeq---data ConParse = Full Id RawTerm-              | Simple Id [RawTerm]--parse :: String -> FilePath -> Result [Decl]-parse s fn = do ds <- mkparse s fn 1 []-                collectDecls ds--processImports :: [Opt] -> [FilePath] -> Result [Decl] -> -                  IO ([Decl], [FilePath])-processImports opts imped (Success ds) = pi imped [] ds-  where pi imps decls ((PInclude fp):xs)-           | fp `elem` imps = pi imps decls xs-           | otherwise = do-                 f <- readLibFile defaultLibPath fp-                 when (Verbose `elem` opts) $ putStrLn ("Reading " ++ fp)-                 case parse f fp of-                   Success t -> pi (fp:imps) decls (t++xs)-                   Failure e f l ->-                     fail $ f ++ ":" ++ show l ++ ":" ++ e-        pi imps decls ((Using t ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Using t ds']) xs-        pi imps decls ((Params t ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Params t ds']) xs-        pi imps decls ((DoUsing b r ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[DoUsing b r ds']) xs-        pi imps decls ((Idiom b r ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Idiom b r ds']) xs-        pi imps decls ((Namespace n ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Namespace n ds']) xs-        pi imps decls (x:xs) = pi imps (decls++[x]) xs-        pi imps decls [] = return (decls, imps)--processImports _ imped (Failure e f l) -    = fail $ show f ++ ":" ++ show l ++ ":" ++ show e---parseTerm :: String -> Result RawTerm-parseTerm s = mkparseTerm s "(input)" 0 []--parseTactic :: String -> Result ITactic-parseTactic s = mkparseTactic s "(tactic)" 0 []---- Make a constructor type, and make arguments lazy if it's codata--mkCon :: Bool -> RawTerm -> ConParse -> (Id,RawTerm)-mkCon co _ (Full n t) = (n,if co then lazify t else t)-mkCon co ty (Simple n args) = (n, mkConTy args ty)-   where mkConTy [] ty = ty-         mkConTy (a:as) ty = let opts = if co then [Lazy] else [] in-                                 RBind (MN "X" 0) (Pi Ex opts a) (mkConTy as ty)---- Make sure all arguments are lazy--lazify :: RawTerm -> RawTerm-lazify (RBind n (Pi p opts a) sc) -    = RBind n (Pi p (nub (Lazy:opts)) a) (lazify sc)-lazify t = t--mkDef file line (n, tms) = mkImpApp (RVar file line n Unknown) tms-   where mkImpApp f [] = f-         mkImpApp f ((tm,Just n):ts) = mkImpApp (RAppImp file line n f tm) ts-         mkImpApp f ((tm, Nothing):ts) = mkImpApp (RApp file line f tm) ts--doBind :: (RawTerm -> RBinder) -> [(Id,RawTerm)] -> RawTerm -> RawTerm-doBind b [] t = t-doBind b ((x,ty):ts) tm = RBind x (b ty) (doBind b ts tm)--doLetBind :: [(Id,RawTerm,RawTerm)] -> RawTerm -> RawTerm-doLetBind [] t = t-doLetBind ((x,ty,val):ts) tm = RBind x (RLet val ty) (doLetBind ts tm)--mkTyApp :: String -> Int -> Id -> RawTerm -> RawTerm-mkTyApp file line n ty = mkApp file line (RVar file line n Unknown) (getTyArgs ty)-   where getTyArgs (RBind n _ t) = (RVar file line n Unknown):(getTyArgs t)-         getTyArgs x = []--mkTyParams :: String -> Int -> [Id] -> RawTerm-mkTyParams f l [] = RConst f l TYPE-mkTyParams f l (x:xs) = RBind x (Pi Ex [] (RConst f l TYPE)) (mkTyParams f l xs)--mkDatatype :: Bool -> String -> Int ->-              Id -> Either RawTerm ((RawTerm, [(Id, RawTerm)]), [ConParse]) -> -                    [TyOpt] -> Datatype-mkDatatype co file line n (Right ((t, using), cons)) opts-    = let opts' = if co then nub (Codata:opts) else opts in-          Datatype n t (map (mkCon co (mkTyApp file line n t)) cons) using opts' file line -mkDatatype co file line n (Left t) opts-    = Latatype n t file line--bracket (RUserInfix f l _ op x y) = RUserInfix f l True op x y-bracket x = x--pairDesugar :: String -> Int -> RawTerm -> [RawTerm] -> RawTerm-pairDesugar file line pair [x,y] = mkApp file line pair [x,y]-pairDesugar file line pair (x:y:xs) -    = pairDesugar file line pair ((mkApp file line pair [x,y]):xs)--sigDesugar :: String -> Int -> (Id, RawTerm) -> RawTerm -> RawTerm-sigDesugar file line (n, tm) sc-    = mkApp file line (RVar file line (UN "Sigma") TypeCon) [tm, lam]-   where lam = RBind n (Lam tm) sc--mkConsList :: String -> Int -> [RawTerm] -> RawTerm-mkConsList f l [] = RVar f l (UN "Nil") Unknown-mkConsList f l (x:xs) = RApp f l (RApp f l (RVar f l (UN "Cons") Unknown) x)-                                 (mkConsList f l xs)--mkhidden (UN n) = MN (n++" is hidden") 0-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp --{-# LINE 30 "templates/GenericTemplate.hs" #-}---data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList------{-# LINE 51 "templates/GenericTemplate.hs" #-}--{-# LINE 61 "templates/GenericTemplate.hs" #-}--{-# LINE 70 "templates/GenericTemplate.hs" #-}--infixr 9 `HappyStk`-data HappyStk a = HappyStk a (HappyStk a)---------------------------------------------------------------------------------- starting the parse--happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll---------------------------------------------------------------------------------- Accepting the parse---- If the current token is 0#, it means we've just accepted a partial--- parse (a %partial parser).  We must ignore the saved token on the top of--- the stack in this case.-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =-	happyReturn1 ans-happyAccept j tk st sts (HappyStk ans _) = -	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)---------------------------------------------------------------------------------- Arrays only: do the next action----happyDoAction i tk st-	= {- nothing -}---	  case action of-		0#		  -> {- nothing -}-				     happyFail i tk st-		-1# 	  -> {- nothing -}-				     happyAccept i tk st-		n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}--				     (happyReduceArr Happy_Data_Array.! rule) i tk st-				     where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))-		n		  -> {- nothing -}---				     happyShift new_state i tk st-				     where !(new_state) = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))-   where !(off)    = indexShortOffAddr happyActOffsets st-         !(off_i)  = (off Happy_GHC_Exts.+# i)-	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))-			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i)-			else False-         !(action)-          | check     = indexShortOffAddr happyTable off_i-          | otherwise = indexShortOffAddr happyDefActions st--{-# LINE 130 "templates/GenericTemplate.hs" #-}---indexShortOffAddr (HappyA# arr) off =-	Happy_GHC_Exts.narrow16Int# i-  where-	!i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)-	!high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))-	!low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))-	!off' = off Happy_GHC_Exts.*# 2#------data HappyAddr = HappyA# Happy_GHC_Exts.Addr#------------------------------------------------------------------------------------- HappyState data type (not arrays)--{-# LINE 163 "templates/GenericTemplate.hs" #-}---------------------------------------------------------------------------------- Shifting a token--happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =-     let !(i) = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in---     trace "shifting the error token" $-     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)--happyShift new_state i tk st sts stk =-     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)---- happyReduce is specialised for the common cases.--happySpecReduce_0 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_0 nt fn j tk st@((action)) sts stk-     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)--happySpecReduce_1 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')-     = let r = fn v1 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_2 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')-     = let r = fn v1 v2 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_3 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')-     = let r = fn v1 v2 v3 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happyReduce k i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyReduce k nt fn j tk st sts stk-     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of-	 sts1@((HappyCons (st1@(action)) (_))) ->-        	let r = fn stk in  -- it doesn't hurt to always seq here...-       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)--happyMonadReduce k nt fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyMonadReduce k nt fn j tk st sts stk =-        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))-       where !(sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))-             drop_stk = happyDropStk k stk--happyMonad2Reduce k nt fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyMonad2Reduce k nt fn j tk st sts stk =-       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))-       where !(sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))-             drop_stk = happyDropStk k stk--             !(off) = indexShortOffAddr happyGotoOffsets st1-             !(off_i) = (off Happy_GHC_Exts.+# nt)-             !(new_state) = indexShortOffAddr happyTable off_i-----happyDrop 0# l = l-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t--happyDropStk 0# l = l-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs---------------------------------------------------------------------------------- Moving to a new state after a reduction---happyGoto nt j tk st = -   {- nothing -}-   happyDoAction j tk new_state-   where !(off) = indexShortOffAddr happyGotoOffsets st-         !(off_i) = (off Happy_GHC_Exts.+# nt)-         !(new_state) = indexShortOffAddr happyTable off_i------------------------------------------------------------------------------------- Error recovery (0# is the error token)---- parse error if we are in recovery and we fail again-happyFail  0# tk old_st _ stk =---	trace "failing" $ -    	happyError_ tk--{-  We don't need state discarding for our restricted implementation of-    "error".  In fact, it can cause some bogus parses, so I've disabled it-    for now --SDM---- discard a state-happyFail  0# tk old_st (HappyCons ((action)) (sts)) -						(saved_tok `HappyStk` _ `HappyStk` stk) =---	trace ("discarding state, depth " ++ show (length stk))  $-	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))--}---- Enter error recovery: generate an error token,---                       save the old token and carry on.-happyFail  i tk (action) sts stk =---      trace "entering error recovery" $-	happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)---- Internal happy errors:--notHappyAtAll = error "Internal Happy error\n"---------------------------------------------------------------------------------- Hack to get the typechecker to accept our action functions---happyTcHack :: Happy_GHC_Exts.Int# -> a -> a-happyTcHack x y = y-{-# INLINE happyTcHack #-}----------------------------------------------------------------------------------- Seq-ing.  If the --strict flag is given, then Happy emits ---	happySeq = happyDoSeq--- otherwise it emits--- 	happySeq = happyDontSeq--happyDoSeq, happyDontSeq :: a -> b -> b-happyDoSeq   a b = a `seq` b-happyDontSeq a b = b---------------------------------------------------------------------------------- Don't inline any functions from the template.  GHC has a nasty habit--- of deciding to inline happyGoto everywhere, which increases the size of--- the generated parser quite a bit.---{-# NOINLINE happyDoAction #-}-{-# NOINLINE happyTable #-}-{-# NOINLINE happyCheck #-}-{-# NOINLINE happyActOffsets #-}-{-# NOINLINE happyGotoOffsets #-}-{-# NOINLINE happyDefActions #-}--{-# NOINLINE happyShift #-}-{-# NOINLINE happySpecReduce_0 #-}-{-# NOINLINE happySpecReduce_1 #-}-{-# NOINLINE happySpecReduce_2 #-}-{-# NOINLINE happySpecReduce_3 #-}-{-# NOINLINE happyReduce #-}-{-# NOINLINE happyMonadReduce #-}-{-# NOINLINE happyGoto #-}-{-# NOINLINE happyFail #-}---- end of Happy Template.
− dist/build/Idris/idris-tmp/Idris/Parser.hs
@@ -1,3973 +0,0 @@-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}-{-# OPTIONS -fglasgow-exts -cpp #-}--- -*-Haskell-*--{-# OPTIONS_GHC -fglasgow-exts #-}--module Idris.Parser where--import Data.Char-import Ivor.TT-import System.IO.Unsafe-import List-import Control.Monad--import Idris.AbsSyntax-import Idris.Lexer-import Idris.Lib--import Debug.Trace-import qualified Data.Array as Happy_Data_Array-import qualified GHC.Exts as Happy_GHC_Exts---- parser produced by Happy Version 1.18.5--newtype HappyAbsSyn t74 = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn6 :: ([ParseDecl]) -> (HappyAbsSyn t74)-happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn6 #-}-happyOut6 :: (HappyAbsSyn t74) -> ([ParseDecl])-happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut6 #-}-happyIn7 :: (ParseDecl) -> (HappyAbsSyn t74)-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn7 #-}-happyOut7 :: (HappyAbsSyn t74) -> (ParseDecl)-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut7 #-}-happyIn8 :: (Decl) -> (HappyAbsSyn t74)-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn8 #-}-happyOut8 :: (HappyAbsSyn t74) -> (Decl)-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut8 #-}-happyIn9 :: (ParseDecl) -> (HappyAbsSyn t74)-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn9 #-}-happyOut9 :: (HappyAbsSyn t74) -> (ParseDecl)-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut9 #-}-happyIn10 :: (CGFlag) -> (HappyAbsSyn t74)-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn10 #-}-happyOut10 :: (HappyAbsSyn t74) -> (CGFlag)-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut10 #-}-happyIn11 :: (Bool) -> (HappyAbsSyn t74)-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn11 #-}-happyOut11 :: (HappyAbsSyn t74) -> (Bool)-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut11 #-}-happyIn12 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn12 #-}-happyOut12 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut12 #-}-happyIn13 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn13 #-}-happyOut13 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut13 #-}-happyIn14 :: ([ParseDecl]) -> (HappyAbsSyn t74)-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn14 #-}-happyOut14 :: (HappyAbsSyn t74) -> ([ParseDecl])-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut14 #-}-happyIn15 :: ([CGFlag]) -> (HappyAbsSyn t74)-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn t74) -> ([CGFlag])-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: ([CGFlag]) -> (HappyAbsSyn t74)-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn t74) -> ([CGFlag])-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: ([CGFlag]) -> (HappyAbsSyn t74)-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn t74) -> ([CGFlag])-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: ([Decl]) -> (HappyAbsSyn t74)-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn t74) -> ([Decl])-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: ([String]) -> (HappyAbsSyn t74)-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn t74) -> ([String])-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: (String) -> (HappyAbsSyn t74)-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn t74) -> (String)-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: (Fixity) -> (HappyAbsSyn t74)-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn t74) -> (Fixity)-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: (Decl) -> (HappyAbsSyn t74)-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn t74) -> (Decl)-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: ([(Id,String)]) -> (HappyAbsSyn t74)-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn t74) -> ([(Id,String)])-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: ((Id, [(RawTerm, Maybe Id)])) -> (HappyAbsSyn t74)-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn t74) -> ((Id, [(RawTerm, Maybe Id)]))-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: ([(RawTerm,Maybe Id)]) -> (HappyAbsSyn t74)-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn t74) -> ([(RawTerm,Maybe Id)])-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: (Datatype) -> (HappyAbsSyn t74)-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn t74) -> (Datatype)-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: (Bool) -> (HappyAbsSyn t74)-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn t74) -> (Bool)-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: (Either RawTerm ((RawTerm, [(Id, RawTerm)]), [ConParse])) -> (HappyAbsSyn t74)-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn t74) -> (Either RawTerm ((RawTerm, [(Id, RawTerm)]), [ConParse]))-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: ([TyOpt]) -> (HappyAbsSyn t74)-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn t74) -> ([TyOpt])-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: ([TyOpt]) -> (HappyAbsSyn t74)-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn t74) -> ([TyOpt])-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: (TyOpt) -> (HappyAbsSyn t74)-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn t74) -> (TyOpt)-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (Id) -> (HappyAbsSyn t74)-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn t74) -> (Id)-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: ([Id]) -> (HappyAbsSyn t74)-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn t74) -> ([Id])-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: ([(Id, Int)]) -> (HappyAbsSyn t74)-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn t74) -> ([(Id, Int)])-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: ([Id]) -> (HappyAbsSyn t74)-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn t74) -> ([Id])-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: ([Id]) -> (HappyAbsSyn t74)-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn t74) -> ([Id])-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: ([(Id, RawTerm, RawTerm)]) -> (HappyAbsSyn t74)-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn t74) -> ([(Id, RawTerm, RawTerm)])-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: ((Id, RawTerm)) -> (HappyAbsSyn t74)-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn t74) -> ((Id, RawTerm))-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (String) -> (HappyAbsSyn t74)-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn t74) -> (String)-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyIn48 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn48 #-}-happyOut48 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut48 #-}-happyIn49 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn49 #-}-happyOut49 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut49 #-}-happyIn50 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn50 #-}-happyOut50 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut50 #-}-happyIn51 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn51 #-}-happyOut51 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut51 #-}-happyIn52 :: (ArgOpt) -> (HappyAbsSyn t74)-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn52 #-}-happyOut52 :: (HappyAbsSyn t74) -> (ArgOpt)-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut52 #-}-happyIn53 :: ([ArgOpt]) -> (HappyAbsSyn t74)-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn53 #-}-happyOut53 :: (HappyAbsSyn t74) -> ([ArgOpt])-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut53 #-}-happyIn54 :: ([ArgOpt]) -> (HappyAbsSyn t74)-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn54 #-}-happyOut54 :: (HappyAbsSyn t74) -> ([ArgOpt])-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut54 #-}-happyIn55 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn55 #-}-happyOut55 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut55 #-}-happyIn56 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn56 #-}-happyOut56 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut56 #-}-happyIn57 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn57 #-}-happyOut57 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut57 #-}-happyIn58 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn58 #-}-happyOut58 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut58 #-}-happyIn59 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn59 #-}-happyOut59 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut59 #-}-happyIn60 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn60 #-}-happyOut60 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut60 #-}-happyIn61 :: ([Do]) -> (HappyAbsSyn t74)-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn61 #-}-happyOut61 :: (HappyAbsSyn t74) -> ([Do])-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut61 #-}-happyIn62 :: ([Do]) -> (HappyAbsSyn t74)-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn62 #-}-happyOut62 :: (HappyAbsSyn t74) -> ([Do])-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut62 #-}-happyIn63 :: (Do) -> (HappyAbsSyn t74)-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn63 #-}-happyOut63 :: (HappyAbsSyn t74) -> (Do)-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut63 #-}-happyIn64 :: (Constant) -> (HappyAbsSyn t74)-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn64 #-}-happyOut64 :: (HappyAbsSyn t74) -> (Constant)-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut64 #-}-happyIn65 :: ([RawTerm]) -> (HappyAbsSyn t74)-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn65 #-}-happyOut65 :: (HappyAbsSyn t74) -> ([RawTerm])-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut65 #-}-happyIn66 :: ((RawTerm, [(Id, RawTerm)])) -> (HappyAbsSyn t74)-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn66 #-}-happyOut66 :: (HappyAbsSyn t74) -> ((RawTerm, [(Id, RawTerm)]))-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut66 #-}-happyIn67 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn67 #-}-happyOut67 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut67 #-}-happyIn68 :: ((Id,Id)) -> (HappyAbsSyn t74)-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn68 #-}-happyOut68 :: (HappyAbsSyn t74) -> ((Id,Id))-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut68 #-}-happyIn69 :: ((Id,Id)) -> (HappyAbsSyn t74)-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn69 #-}-happyOut69 :: (HappyAbsSyn t74) -> ((Id,Id))-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut69 #-}-happyIn70 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn70 #-}-happyOut70 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut70 #-}-happyIn71 :: (Id) -> (HappyAbsSyn t74)-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn71 #-}-happyOut71 :: (HappyAbsSyn t74) -> (Id)-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut71 #-}-happyIn72 :: ([(Id, RawTerm)]) -> (HappyAbsSyn t74)-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn72 #-}-happyOut72 :: (HappyAbsSyn t74) -> ([(Id, RawTerm)])-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut72 #-}-happyIn73 :: ([Id]) -> (HappyAbsSyn t74)-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn73 #-}-happyOut73 :: (HappyAbsSyn t74) -> ([Id])-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut73 #-}-happyIn74 :: t74 -> (HappyAbsSyn t74)-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn74 #-}-happyOut74 :: (HappyAbsSyn t74) -> t74-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut74 #-}-happyIn75 :: ([ConParse]) -> (HappyAbsSyn t74)-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn75 #-}-happyOut75 :: (HappyAbsSyn t74) -> ([ConParse])-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut75 #-}-happyIn76 :: (ConParse) -> (HappyAbsSyn t74)-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn76 #-}-happyOut76 :: (HappyAbsSyn t74) -> (ConParse)-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut76 #-}-happyIn77 :: (RawTerm) -> (HappyAbsSyn t74)-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn77 #-}-happyOut77 :: (HappyAbsSyn t74) -> (RawTerm)-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut77 #-}-happyIn78 :: (ITactic) -> (HappyAbsSyn t74)-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn78 #-}-happyOut78 :: (HappyAbsSyn t74) -> (ITactic)-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut78 #-}-happyIn79 :: ([ITactic]) -> (HappyAbsSyn t74)-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn79 #-}-happyOut79 :: (HappyAbsSyn t74) -> ([ITactic])-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut79 #-}-happyIn80 :: ([ITactic]) -> (HappyAbsSyn t74)-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn80 #-}-happyOut80 :: (HappyAbsSyn t74) -> ([ITactic])-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut80 #-}-happyIn81 :: ([ITactic]) -> (HappyAbsSyn t74)-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn81 #-}-happyOut81 :: (HappyAbsSyn t74) -> ([ITactic])-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut81 #-}-happyIn82 :: (LineNumber) -> (HappyAbsSyn t74)-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn82 #-}-happyOut82 :: (HappyAbsSyn t74) -> (LineNumber)-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut82 #-}-happyIn83 :: (String) -> (HappyAbsSyn t74)-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn83 #-}-happyOut83 :: (HappyAbsSyn t74) -> (String)-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut83 #-}-happyIn84 :: (Fixities) -> (HappyAbsSyn t74)-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn84 #-}-happyOut84 :: (HappyAbsSyn t74) -> (Fixities)-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut84 #-}-happyInTok :: (Token) -> (HappyAbsSyn t74)-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn t74) -> (Token)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x1d\x00\x5e\x05\x18\x02\x00\x00\x49\x04\x5e\x05\x37\x01\x37\x01\x5e\x05\x00\x00\x48\x03\xef\x02\x00\x00\x37\x01\x00\x00\x5e\x05\x5e\x05\x00\x00\x00\x00\x5e\x05\x5e\x05\x5e\x05\x5e\x05\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x01\x91\x09\x3d\x02\xc3\x01\x5e\x05\x5e\x05\xae\x08\x5e\x05\x00\x00\x37\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x05\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x5e\x05\x02\x01\x48\x04\x01\x00\x00\x00\x00\x00\x01\x00\xbc\x04\x00\x00\xa2\x04\x00\x00\x87\x04\xe2\x01\xab\x04\xa6\x04\xa5\x04\xa4\x04\x97\x04\x08\x0a\x75\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x04\x88\x04\x84\x04\x02\x01\x02\x01\x02\x01\x8e\x04\x54\x04\x7f\x04\x8f\x04\x5e\x05\x8b\x04\x8a\x04\x00\x00\x00\x00\xbd\x02\x00\x00\x02\x01\x72\x04\x75\x04\x00\x00\x02\x01\x00\x00\x02\x01\x02\x01\x02\x01\x70\x04\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x02\x00\x00\x00\x00\x00\x96\x02\x00\x00\x00\x00\x00\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x00\x00\x69\x08\x74\x04\x50\x01\x91\x09\x68\x04\x02\x01\xdc\x01\x5f\x00\x08\x0a\x75\x01\x00\x00\x00\x00\x6f\x04\x16\x04\x0e\x03\x00\x00\x6d\x04\x05\x05\x00\x00\x00\x00\x6c\x04\x00\x00\x6c\x04\x00\x00\x7a\x04\x6f\x03\x00\x00\x18\x02\x18\x02\xb8\x01\x1a\x04\xac\x04\x65\x04\xac\x04\xac\x04\x63\x04\x61\x04\xac\x04\xac\x04\x26\x0a\x62\x04\x59\x04\x1e\x00\x00\x00\x47\x04\xac\x04\x56\x09\x02\x01\x5e\x04\x37\x04\x00\x00\xae\x08\x51\x04\x00\x00\xac\x04\x45\x04\xac\x04\xac\x04\xac\x04\xac\x04\xac\x04\x00\x00\xa6\x01\x91\x01\x7c\x01\x67\x01\x52\x01\x3d\x01\x00\x00\x28\x01\xac\x04\x13\x01\xac\x04\xfe\x00\x00\x00\x3a\x04\x00\x00\xe9\x00\x02\x01\xc7\x00\x65\x00\x00\x00\x5a\x04\x5a\x04\x5a\x04\x5a\x04\x5a\x04\x00\x00\xac\x04\x5a\x04\xae\x08\x00\x00\x00\x00\x00\x00\xac\x04\x2f\x04\xcc\x09\x46\x04\x3e\x04\x28\x04\xa5\x01\x39\x04\x8b\x00\x36\x04\x53\x09\x02\x01\xcc\x09\xcc\x09\xcc\x09\x00\x00\x32\x04\xcc\x09\x31\x04\x00\x00\xd8\x05\x00\x00\xd8\x05\x00\x00\xd8\x05\x00\x00\xd8\x05\x00\x00\xac\x04\x00\x00\xac\x04\xac\x04\xac\x04\xac\x04\xac\x04\x2b\x04\x38\x04\x2d\x04\x24\x04\xac\x04\x00\x00\x00\x00\xac\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\xd8\x05\x23\x04\x53\x04\x02\x01\xf6\x03\x00\x00\xfa\x03\xfa\x03\x08\x04\x1b\x04\x04\x04\x19\x04\xfa\x03\xfa\x03\xfa\x03\xc6\x03\x0c\x04\xfd\x03\x00\x00\x00\x00\xd3\x05\x18\x02\x15\x04\x69\x08\xfa\x03\x00\x00\x00\x00\x0b\x04\x06\x04\x05\x04\x03\x04\x01\x04\x00\x00\x00\x00\x18\x04\x02\x04\x00\x00\x00\x00\xfa\x03\xfa\x03\xfa\x03\x00\x00\x07\x04\xfe\x03\xe6\x03\xfc\x03\x02\x01\xeb\x03\x00\x00\x01\x00\x02\x01\xf4\x03\xe5\x03\x00\x00\xfa\x03\x7e\x05\xfb\x03\x00\x04\x00\x00\xd6\x03\x00\x00\xec\x03\xfa\x03\x00\x00\x00\x00\x02\x01\x00\x00\x91\x09\x25\x05\xcc\x04\x7c\x05\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x05\x00\x00\xe1\x03\xd5\x03\x00\x00\x02\x01\x02\x01\xd1\x03\x91\x09\x00\x00\x00\x00\xdc\x01\x00\x00\x00\x00\xca\x04\x9c\x04\x91\x03\x00\x00\x75\x01\x00\x00\xfa\x03\xaa\x00\xb4\x02\xfa\x03\xda\x03\x00\x00\x00\x00\x00\x00\xb8\x03\x1a\x09\x00\x00\xf3\x08\x16\x03\x00\x00\xc8\x03\xd2\x03\x00\x00\x00\x00\x18\x02\xcc\x09\x00\x00\x67\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x03\x00\x00\xcd\x03\x00\x00\xae\x08\x00\x00\x1e\x00\xa3\x03\xa2\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x09\xcc\x09\xbb\x03\x91\x09\x02\x01\x95\x03\x91\x09\x1e\x00\x02\x01\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x08\xf3\x08\xf3\x08\xf3\x08\xf3\x08\xf3\x08\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x09\x00\x00\xd4\x00\x8c\x03\xd0\x01\x0a\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x91\x09\x00\x00\x00\x00\x24\x08\x00\x00\xdf\x07\x00\x00\x9a\x07\x00\x00\x55\x07\xbd\x03\xb7\x03\xb6\x03\xb4\x03\xb3\x03\x55\x00\x00\x00\x00\x00\xfa\x03\x00\x00\x00\x00\xfa\x03\x10\x07\xa0\x03\xd8\x05\xfa\x03\xde\x01\x00\x00\x46\x00\xa9\x03\xa7\x03\x00\x00\x00\x00\x00\x00\xf8\xff\x00\x00\xcb\x06\xab\x03\xa6\x03\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x86\x06\x00\x00\x46\x00\x00\x00\x99\x03\x86\x03\x9a\x03\x38\x03\x00\x00\x02\x01\x76\x03\x00\x00\x00\x00\x02\x01\x8d\x03\x00\x00\x00\x00\x02\x01\x02\x01\x46\x00\x7d\x03\x00\x00\x00\x00\x00\x00\x83\x03\xd9\x01\x8b\x03\x00\x00\x00\x00\x00\x00\x7b\x03\x00\x00\x00\x00\x02\x01\x00\x00\xae\x08\x00\x00\x00\x00\x91\x09\x00\x00\x3e\x03\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x74\x03\x02\x01\x82\x03\x00\x00\xfa\x03\x00\x00\xd8\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x03\x61\x03\x00\x00\x00\x00\xcc\x09\x49\x03\x49\x03\x00\x00\xd0\x01\x62\x03\x00\x00\x00\x00\x00\x00\xde\x01\x41\x06\x00\x00\x00\x00\x00\x00\x00\x00\x60\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x03\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x5e\x03\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x03\x00\x00\xfc\x05\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x05\x5b\x03\x00\x00\x00\x00\x00\x00\x3c\x03\x02\x01\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\xf6\x0a\x55\x10\x24\x03\x00\x00\x00\x00\x3f\x10\x96\x01\x51\x03\x29\x10\x00\x00\x13\x10\xfd\x0f\x00\x00\x47\x03\x00\x00\xe7\x0f\xd1\x0f\x00\x00\x00\x00\xbb\x0f\xa5\x0f\x8f\x0f\x79\x0f\x00\x00\x00\x00\x00\x00\x1a\x03\x39\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\xb7\x0c\x77\x0b\x10\x03\x63\x0f\x4d\x0f\x9e\x10\x37\x0f\x00\x00\x3f\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x0f\x00\x00\x07\x03\x06\x03\x00\x00\x05\x03\x0b\x0f\x59\x01\x00\x00\xdb\x0a\x00\x00\x00\x00\xd4\x0a\x00\x00\x00\x00\x44\x03\x00\x00\x2e\x03\x8d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x31\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x03\x1c\x03\x14\x03\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x39\x01\xe7\x02\x08\x01\x00\x00\x00\x00\xe5\x02\x68\x01\x00\x00\x41\x01\x13\x03\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x03\xdd\x02\x29\x01\x00\x00\xd2\x02\x7f\x0b\x00\x00\xd1\x02\xd0\x02\xbe\x0a\x88\x0a\x72\x0a\x6b\x0a\x50\x0a\x00\x00\xf9\x06\x00\x00\x00\x00\x8b\x0c\x00\x00\x02\x03\xea\x01\x15\x03\x94\x00\xe0\x01\x00\x00\x00\x00\xec\x02\x00\x00\x24\x01\xc9\x02\xdf\x02\xc7\x0b\xc7\x02\xbf\x02\x21\x01\xc0\x02\x14\x01\x00\x00\x0f\x01\x0f\x01\xbc\x02\xc9\x01\xc5\x01\x2a\x00\xdf\xff\xdf\x0e\x00\x00\xc9\x0e\xb3\x0e\x00\x00\x00\x00\x4f\x0b\x4a\x0b\x0c\x01\xdb\x02\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x0e\xa7\x02\xb4\x01\xda\x02\x00\x00\xb6\x02\x8d\x10\x00\x00\xb5\x02\x87\x0e\xb3\x02\x71\x0e\x5b\x0e\x45\x0e\x2f\x0e\x19\x0e\xae\x02\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x0a\x01\x03\x0e\x0a\x01\xed\x0d\x0a\x01\x00\x00\x00\x00\x00\x00\x0a\x01\x81\x01\x0a\x01\x0a\x01\x00\x00\x04\x01\xff\x00\xef\x00\xe5\x00\xd6\x00\xad\x02\xd7\x0d\xd2\x00\x80\x10\xa4\x02\x9d\x02\x00\x00\xc1\x0d\x00\x00\x26\x07\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x33\x01\x9c\x06\x57\x06\x99\x05\x00\x00\x00\x00\x69\x04\x00\x00\x9a\x02\xcb\x00\x97\x02\xc2\x00\x92\x02\xbb\x00\x90\x02\xb0\x00\x8f\x02\x2b\x0b\x00\x00\x26\x0b\xab\x0d\x95\x0d\x88\x09\x07\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x09\x0c\x00\x00\x88\x02\x7f\x0d\x87\x02\x86\x02\x7b\x02\x00\x00\x00\x00\xfc\xff\x99\x00\x00\x00\xb1\x0b\x3e\x01\x00\x00\x00\x00\x69\x0d\x53\x0d\x00\x00\x00\x00\x00\x00\xbe\x02\x3d\x0d\x27\x0d\x11\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\xc1\x01\x00\x00\xb4\x06\xfb\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\x71\x02\x79\x00\x00\x00\x70\x02\x68\x02\xe5\x0c\xcf\x0c\xb9\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x01\x00\x00\x64\x02\xd6\x09\x95\x02\x00\x00\x00\x00\x61\x02\xa3\x0c\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x0c\x00\x00\x00\x00\x91\x02\x00\x00\x5f\x0c\x79\x00\x79\x00\x79\x00\x00\x00\x00\x00\x5c\x02\x00\x00\xf3\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x5a\x02\x99\x02\x00\x00\x54\x02\x4f\x00\xef\xff\x00\x00\x33\x0c\x53\x02\x17\x02\xa4\x01\x00\x00\x00\x00\x79\x00\x79\x00\x79\x00\x00\x00\x35\x01\x00\x00\x77\x0c\x79\x00\x79\x00\x61\x0c\x02\x02\x00\x00\x00\x00\x47\x02\x00\x00\x78\x10\x00\x00\x78\x10\x79\x00\x46\x02\x79\x00\x00\x00\x00\x00\x00\x00\xbe\x01\x44\x04\x45\x02\x79\x00\x00\x00\x41\x02\x22\x02\x21\x02\x20\x02\x1e\x02\x1c\x02\x1b\x02\x00\x00\x1a\x02\x00\x00\x12\x02\x6b\x10\x10\x02\x00\x00\x00\x00\x00\x00\x0f\x02\x0e\x02\x00\x00\x00\x00\x0c\x02\x00\x00\xb2\x03\xc2\x01\x07\x02\x07\x0c\x4e\x01\x00\x00\xdb\x0b\x00\x00\x2e\x00\x79\x00\x0a\x02\x08\x02\x00\x00\xfe\x01\x79\x00\x00\x00\xfd\x01\xfc\x01\xfb\x01\xf0\x01\xec\x01\x00\x00\x5a\x10\x5a\x10\x5a\x10\x5a\x10\x5a\x10\x5a\x10\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x00\x00\x00\x00\xaa\x01\x00\x00\x00\x00\xdb\x01\xeb\x01\xdf\x01\xd1\x01\xf0\x09\xc6\x01\x00\x00\x50\x10\x00\x00\x50\x10\x00\x00\x50\x10\x00\x00\x50\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x0b\x00\x00\x95\x01\x4b\x0c\x50\x10\x00\x00\x78\x00\x35\x0c\x6b\x00\x00\x00\xa0\x02\xe7\x01\x00\x00\x00\x00\xb3\x01\xab\x01\x9e\x01\x8c\x01\xf6\x01\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x6a\x01\x23\x01\x85\x01\x2a\x06\x7e\x01\x4f\x02\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x93\x01\x00\x00\x00\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x71\x00\x73\x01\xfe\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x01\x00\x00\xed\xff\x00\x00\x97\x08\x00\x00\x00\x00\x02\x09\x4a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x01\xc0\x00\x00\x00\xd5\x00\x5c\x00\x9c\x00\x1f\x0c\x00\x00\x47\x00\x95\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x01\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x7f\x00\x00\x00\x4a\x00\x21\x00\xdc\x08\x38\x00\x00\x00\x20\x00\xee\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\xd0\xff\xdc\x08\x9b\x0b\xcb\xff\xdc\x08\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x08\x00\x00\x00\x00\xc6\xff\x00\x00\x00\x00\x1d\x01\x00\x00\xf5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\x21\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\xff\x00\x00\x00\x00\x0a\xff\x00\x00\x00\x00\x05\xff\x00\x00\x03\xff\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xfe\xf9\xfe\xf8\xfe\xf0\xfe\xf0\xfe\x9b\xff\x80\xff\x45\xff\x46\xff\xa2\xff\x44\xff\x49\xff\xf0\xfe\xab\xff\x29\xff\x2b\xff\x27\xff\x2a\xff\x28\xff\x52\xff\x00\x00\x00\x00\x00\x00\xf0\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xff\x00\x00\x31\xff\x30\xff\x2f\xff\x32\xff\x2d\xff\x2e\xff\x2c\xff\x34\xff\x33\xff\x00\x00\x4d\xff\xf0\xfe\xf0\xfe\x00\x00\xf0\xfe\x00\x00\x00\x00\x00\x00\x21\xff\xef\xff\xf8\xff\x21\xff\x00\x00\xf6\xff\xda\xff\xf7\xff\xb1\xff\xbb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\xff\xb5\xff\xc0\xff\xc2\xff\xc1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\xff\xec\xff\xf0\xfe\xf0\xfe\x00\x00\x00\x00\x00\x00\xf0\xfe\x8c\xff\x1c\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc6\xff\xc5\xff\xc4\xff\xc3\xff\x00\x00\xf0\xfe\xf0\xfe\xd8\xff\xf0\xfe\x00\x00\xa5\xff\xf0\xfe\xf0\xfe\x21\xff\x21\xff\x21\xff\x21\xff\x21\xff\xbc\xff\xbb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\xfb\xff\x70\xff\x00\x00\xf0\xfe\xf1\xfe\x70\xff\x00\x00\xf1\xfe\xf1\xfe\xf0\xfe\xf0\xfe\xf0\xfe\x53\xff\xf0\xfe\xf0\xfe\xf1\xfe\x00\x00\x00\x00\xf0\xfe\xf0\xfe\x00\x00\x00\x00\xc6\xff\xc5\xff\x72\xff\x71\xff\xf0\xfe\xf0\xfe\xf0\xfe\x6e\xff\x00\x00\x6b\xff\x60\xff\x8e\xff\x00\x00\x00\x00\x00\x00\x70\xff\x00\x00\xf1\xfe\x00\x00\x00\x00\xf1\xfe\x00\x00\xf0\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\x04\xff\xf0\xfe\x00\x00\xf0\xfe\x00\x00\xf0\xfe\x0d\xff\x94\xff\x0f\xff\xf0\xfe\x00\x00\xf0\xfe\xf0\xfe\x56\xff\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf1\xfe\x00\x00\xf0\xfe\x00\x00\xf0\xfe\xf0\xfe\x4e\xff\x00\x00\x99\xff\x00\x00\x00\x00\x00\x00\x96\xff\xf0\xfe\x00\x00\x00\x00\x00\x00\xf0\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xff\x00\x00\x00\x00\x00\x00\xf1\xfe\xf0\xfe\xf1\xfe\xf0\xfe\xf1\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\xf0\xfe\x54\xff\xf0\xfe\x72\xff\x71\xff\xf0\xfe\xf0\xfe\x00\x00\xf5\xfe\x00\x00\x00\x00\x3e\xff\x48\xff\xf0\xfe\x00\x00\xf1\xfe\xf1\xfe\xf1\xfe\x4c\xff\x4b\xff\xf0\xfe\xf0\xfe\x00\x00\x38\xff\x00\x00\x00\x00\x55\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc8\xff\xda\xff\x00\x00\x00\x00\x00\x00\xdd\xff\x00\x00\xaf\xff\xad\xff\xac\xff\x00\x00\x00\x00\x00\x00\xbb\xff\x00\x00\xe8\xff\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xfe\xf1\xfe\xf0\xfe\x00\x00\xf1\xfe\xf1\xfe\x00\x00\x00\x00\x00\x00\xaa\xff\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xff\x00\x00\xf1\xfe\x21\xff\x00\x00\x00\x00\x00\x00\xf1\xfe\x00\x00\xf0\xfe\x00\x00\x00\x00\xbf\xff\x00\x00\xf9\xff\x00\x00\x00\x00\x8b\xff\x1d\xff\x00\x00\x20\xff\x00\x00\xf0\xfe\xf0\xfe\xf0\xfe\xa7\xff\xa6\xff\xf0\xfe\xd7\xff\x00\x00\xa4\xff\xa3\xff\xf0\xff\xf1\xff\xf2\xff\xf3\xff\xf4\xff\xf0\xfe\xf0\xfe\xd2\xff\x00\x00\xf0\xfe\x19\xff\x15\xff\x00\x00\x00\x00\xf0\xfe\xf0\xfe\x00\x00\xb0\xff\xdc\xff\xf0\xfe\xf0\xfe\xf0\xfe\xdb\xff\x00\x00\xc9\xff\x00\x00\xf0\xfe\xf0\xfe\x00\x00\x70\xff\x39\xff\x3b\xff\xf1\xfe\x00\x00\x9e\xff\x4f\xff\x86\xff\xf0\xfe\xf1\xfe\xf0\xfe\x00\x00\x51\xff\x50\xff\xf6\xfe\x00\x00\xf1\xfe\xf0\xfe\x3f\xff\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\x00\x00\xf1\xfe\x00\x00\xf1\xfe\x00\x00\xf0\xfe\x6d\xff\x00\x00\x6a\xff\xf0\xfe\xf0\xfe\x8d\xff\x64\xff\xf0\xfe\x67\xff\x00\x00\x00\x00\x5c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xff\x00\x00\xf0\xfe\xf1\xfe\xf1\xfe\xa0\xff\xf1\xfe\xf0\xfe\x88\xff\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\xf1\xfe\x93\xff\x81\xff\x84\xff\x82\xff\x83\xff\x85\xff\x7e\xff\x9f\xff\x7f\xff\x98\xff\x95\xff\x00\x00\x97\xff\x6f\xff\x00\x00\x00\x00\x58\xff\x57\xff\xf0\xfe\xf1\xfe\xf1\xfe\xf1\xfe\x00\x00\xf1\xfe\xa9\xff\x00\x00\x76\xff\x00\x00\x75\xff\x00\x00\x47\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xfe\x43\xff\x3e\xff\x41\xff\xf0\xfe\x00\x00\x00\x00\x00\x00\xf0\xfe\x00\x00\xf0\xfe\xc7\xff\x00\x00\xd2\xff\x00\x00\xae\xff\xf1\xfe\xf1\xfe\x21\xff\xf0\xfe\x26\xff\x00\x00\x14\xff\x18\xff\xf1\xfe\xf7\xfe\xf0\xfe\xd1\xff\xf1\xfe\xbb\xff\xf1\xfe\x00\x00\xe4\xff\x00\x00\x1b\xff\x00\x00\xf0\xfe\xed\xff\x00\x00\xbe\xff\xf5\xff\xea\xff\x00\x00\x00\x00\xee\xff\x1e\xff\x00\x00\x00\x00\xd4\xff\x00\x00\xd6\xff\xb8\xff\xb9\xff\x00\x00\xd1\xff\x00\x00\xcb\xff\xcf\xff\xce\xff\xcc\xff\xf1\xfe\xb7\xff\x15\xff\xb4\xff\x26\xff\x11\xff\x12\xff\x00\x00\xf1\xfe\x00\x00\xb3\xff\xb2\xff\x23\xff\x00\x00\xf0\xfe\x00\x00\x00\x00\xf0\xfe\xf1\xfe\x00\x00\x35\xff\xf0\xfe\xf1\xfe\x3c\xff\xf0\xfe\x78\xff\x74\xff\x79\xff\x7c\xff\x7a\xff\x7b\xff\x7d\xff\x73\xff\x77\xff\xa8\xff\x6c\xff\x62\xff\x63\xff\x61\xff\xf1\xfe\x5a\xff\x00\x00\x5f\xff\x5e\xff\x00\x00\x68\xff\x69\xff\x5d\xff\x00\x00\x00\x00\xf1\xfe\x42\xff\xf1\xfe\xf0\xfe\x00\x00\xf1\xfe\x89\xff\xf0\xfe\xf1\xfe\x00\x00\x24\xff\x22\xff\x10\xff\x25\xff\x13\xff\xe9\xff\x00\x00\xca\xff\xd0\xff\xd3\xff\xe2\xff\xd5\xff\x00\x00\x1a\xff\x1f\xff\xbd\xff\xe3\xff\x91\xff\x00\x00\xf0\xfe\xe5\xff\xf1\xfe\x9a\xff\x00\x00\xf1\xfe\x00\x00\x59\xff\x66\xff\x5b\xff\x37\xff\x00\x00\x00\x00\xe7\xff\xf1\xfe\xcd\xff\x92\xff\x00\x00\x90\xff\x00\x00\xe6\xff\x3a\xff\x36\xff\x8f\xff"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x03\x00\x01\x00\x0b\x00\x25\x00\x03\x00\x08\x00\x1a\x00\x29\x00\x1a\x00\x02\x00\x03\x00\x02\x00\x0c\x00\x0c\x00\x1a\x00\x12\x00\x10\x00\x4c\x00\x0b\x00\x13\x00\x0a\x00\x21\x00\x4c\x00\x1a\x00\x11\x00\x12\x00\x13\x00\x4c\x00\x15\x00\x01\x00\x17\x00\x02\x00\x19\x00\x20\x00\x21\x00\x16\x00\x1d\x00\x2a\x00\x1d\x00\x1a\x00\x0c\x00\x22\x00\x23\x00\x4d\x00\x10\x00\x26\x00\x27\x00\x2a\x00\x27\x00\x45\x00\x46\x00\x45\x00\x46\x00\x2e\x00\x2f\x00\x2e\x00\x41\x00\x4c\x00\x1d\x00\x31\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x25\x00\x01\x00\x1a\x00\x4d\x00\x3c\x00\x1d\x00\x2e\x00\x4b\x00\x4d\x00\x4e\x00\x4d\x00\x43\x00\x0c\x00\x4d\x00\x2a\x00\x54\x00\x10\x00\x02\x00\x57\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5a\x00\x5b\x00\x01\x00\x5d\x00\x11\x00\x02\x00\x03\x00\x1a\x00\x4d\x00\x4e\x00\x25\x00\x4d\x00\x4d\x00\x0c\x00\x0b\x00\x54\x00\x1d\x00\x10\x00\x57\x00\x74\x00\x13\x00\x4d\x00\x13\x00\x78\x00\x15\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x20\x00\x21\x00\x25\x00\x1d\x00\x2e\x00\x4c\x00\x7d\x00\x11\x00\x22\x00\x23\x00\x20\x00\x21\x00\x1a\x00\x27\x00\x02\x00\x1a\x00\x1a\x00\x25\x00\x74\x00\x43\x00\x2e\x00\x4d\x00\x78\x00\x4c\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x07\x00\x11\x00\x25\x00\x25\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x1d\x00\x4d\x00\x4b\x00\x20\x00\x02\x00\x03\x00\x1a\x00\x1b\x00\x4d\x00\x4e\x00\x27\x00\x42\x00\x4b\x00\x0b\x00\x42\x00\x54\x00\x4d\x00\x2e\x00\x57\x00\x11\x00\x12\x00\x13\x00\x25\x00\x15\x00\x07\x00\x17\x00\x05\x00\x19\x00\x4d\x00\x4d\x00\x4d\x00\x1d\x00\x34\x00\x02\x00\x03\x00\x4c\x00\x22\x00\x23\x00\x3a\x00\x4c\x00\x26\x00\x27\x00\x0b\x00\x1a\x00\x1b\x00\x25\x00\x02\x00\x74\x00\x2e\x00\x2f\x00\x13\x00\x78\x00\x15\x00\x7a\x00\x7b\x00\x7c\x00\x25\x00\x4c\x00\x7d\x00\x26\x00\x1d\x00\x11\x00\x4d\x00\x25\x00\x4c\x00\x22\x00\x23\x00\x02\x00\x03\x00\x34\x00\x27\x00\x1a\x00\x25\x00\x1d\x00\x25\x00\x3a\x00\x0b\x00\x2e\x00\x2e\x00\x25\x00\x30\x00\x24\x00\x26\x00\x25\x00\x13\x00\x4d\x00\x15\x00\x03\x00\x02\x00\x03\x00\x2e\x00\x01\x00\x5a\x00\x5b\x00\x1d\x00\x5d\x00\x4d\x00\x0b\x00\x25\x00\x22\x00\x23\x00\x4d\x00\x12\x00\x4d\x00\x27\x00\x13\x00\x10\x00\x15\x00\x25\x00\x02\x00\x03\x00\x2e\x00\x4d\x00\x11\x00\x4d\x00\x1d\x00\x0a\x00\x0b\x00\x0b\x00\x4d\x00\x22\x00\x23\x00\x1a\x00\x4d\x00\x25\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x25\x00\x02\x00\x03\x00\x2e\x00\x0a\x00\x0b\x00\x25\x00\x1d\x00\x25\x00\x4d\x00\x0b\x00\x25\x00\x22\x00\x23\x00\x1a\x00\x01\x00\x25\x00\x27\x00\x13\x00\x4d\x00\x15\x00\x21\x00\x02\x00\x03\x00\x2e\x00\x0d\x00\x0e\x00\x7d\x00\x1d\x00\x25\x00\x10\x00\x0b\x00\x25\x00\x22\x00\x23\x00\x4d\x00\x1a\x00\x25\x00\x27\x00\x13\x00\x4d\x00\x15\x00\x20\x00\x02\x00\x03\x00\x2e\x00\x4d\x00\x1a\x00\x4d\x00\x1d\x00\x1a\x00\x4d\x00\x0b\x00\x25\x00\x22\x00\x23\x00\x4d\x00\x24\x00\x13\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x1a\x00\x02\x00\x03\x00\x2e\x00\x1e\x00\x1f\x00\x4d\x00\x1d\x00\x20\x00\x4d\x00\x0b\x00\x1a\x00\x22\x00\x23\x00\x4d\x00\x02\x00\x1a\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x24\x00\x02\x00\x03\x00\x2e\x00\x23\x00\x1a\x00\x42\x00\x1d\x00\x1a\x00\x4d\x00\x0b\x00\x1a\x00\x22\x00\x23\x00\x23\x00\x21\x00\x1a\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x1d\x00\x02\x00\x03\x00\x2e\x00\x4c\x00\x22\x00\x23\x00\x1d\x00\x1a\x00\x1a\x00\x0b\x00\x1d\x00\x22\x00\x23\x00\x13\x00\x20\x00\x4c\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x1a\x00\x02\x00\x03\x00\x2e\x00\x02\x00\x03\x00\x1a\x00\x1d\x00\x0a\x00\x1a\x00\x0b\x00\x0d\x00\x22\x00\x23\x00\x28\x00\x20\x00\x4d\x00\x27\x00\x13\x00\x7d\x00\x15\x00\x18\x00\x19\x00\x31\x00\x2e\x00\x33\x00\x34\x00\x0a\x00\x1d\x00\x37\x00\x0d\x00\x1d\x00\x3a\x00\x22\x00\x23\x00\x4c\x00\x22\x00\x23\x00\x27\x00\x1a\x00\x7d\x00\x27\x00\x4c\x00\x1e\x00\x1f\x00\x2e\x00\x4c\x00\x49\x00\x2e\x00\x2e\x00\x4d\x00\x30\x00\x3d\x00\x1a\x00\x1b\x00\x1a\x00\x1b\x00\x02\x00\x03\x00\x4d\x00\x01\x00\x7d\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0d\x00\x0e\x00\x2d\x00\x09\x00\x2d\x00\x10\x00\x31\x00\x32\x00\x31\x00\x14\x00\x4c\x00\x16\x00\x7d\x00\x18\x00\x1d\x00\x3a\x00\x1b\x00\x3a\x00\x4c\x00\x22\x00\x23\x00\x18\x00\x19\x00\x26\x00\x27\x00\x48\x00\x25\x00\x4a\x00\x48\x00\x28\x00\x4a\x00\x2e\x00\x48\x00\x7d\x00\x4a\x00\x1a\x00\x48\x00\x4c\x00\x4a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4c\x00\x28\x00\x4f\x00\x50\x00\x5e\x00\x5f\x00\x7d\x00\x48\x00\x49\x00\x7d\x00\x31\x00\x4d\x00\x33\x00\x34\x00\x4c\x00\x2a\x00\x37\x00\x55\x00\x56\x00\x3a\x00\x3b\x00\x1a\x00\x51\x00\x52\x00\x53\x00\x2f\x00\x4c\x00\x4c\x00\x57\x00\x58\x00\x5d\x00\x4c\x00\x47\x00\x01\x00\x02\x00\x5e\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x0e\x00\x0f\x00\x10\x00\x75\x00\x76\x00\x77\x00\x14\x00\x03\x00\x16\x00\x4c\x00\x18\x00\x4c\x00\x08\x00\x1b\x00\x4d\x00\x1d\x00\x4d\x00\x4d\x00\x4d\x00\x4c\x00\x22\x00\x23\x00\x12\x00\x25\x00\x26\x00\x4d\x00\x28\x00\x4c\x00\x4c\x00\x4c\x00\x1a\x00\x4c\x00\x2e\x00\x4c\x00\x4c\x00\x4c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x4f\x00\x4c\x00\x51\x00\x52\x00\x53\x00\x4c\x00\x4c\x00\x4c\x00\x57\x00\x58\x00\x59\x00\x01\x00\x02\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x4d\x00\x4d\x00\x09\x00\x03\x00\x0e\x00\x0f\x00\x10\x00\x4d\x00\x08\x00\x4d\x00\x14\x00\x1a\x00\x16\x00\x4c\x00\x18\x00\x1a\x00\x4c\x00\x1b\x00\x12\x00\x1d\x00\x4c\x00\x0e\x00\x02\x00\x03\x00\x22\x00\x23\x00\x1a\x00\x25\x00\x4c\x00\x4c\x00\x28\x00\x02\x00\x03\x00\x1a\x00\x1b\x00\x4c\x00\x06\x00\x1e\x00\x1f\x00\x4c\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\x4c\x00\x4c\x00\x2d\x00\x4d\x00\x22\x00\x23\x00\x31\x00\x32\x00\x1d\x00\x27\x00\x4d\x00\x4d\x00\x4c\x00\x22\x00\x23\x00\x3a\x00\x2e\x00\x4c\x00\x27\x00\x4f\x00\x4c\x00\x51\x00\x52\x00\x53\x00\x4d\x00\x2e\x00\x2f\x00\x57\x00\x58\x00\x59\x00\x01\x00\x4d\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x4c\x00\x4c\x00\x1a\x00\x1b\x00\x0e\x00\x0f\x00\x10\x00\x4d\x00\x4c\x00\x4c\x00\x14\x00\x2a\x00\x16\x00\x2b\x00\x18\x00\x4c\x00\x2a\x00\x1b\x00\x4c\x00\x1d\x00\x4d\x00\x2d\x00\x5b\x00\x02\x00\x03\x00\x31\x00\x4c\x00\x25\x00\x4c\x00\x2a\x00\x28\x00\x02\x00\x03\x00\x05\x00\x3a\x00\x1a\x00\x4d\x00\x4d\x00\x4d\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x4d\x00\x1d\x00\x05\x00\x1a\x00\x1a\x00\x19\x00\x22\x00\x23\x00\x4d\x00\x1d\x00\x4d\x00\x27\x00\x1a\x00\x1a\x00\x22\x00\x23\x00\x02\x00\x03\x00\x2e\x00\x27\x00\x4f\x00\x0e\x00\x51\x00\x52\x00\x53\x00\x0b\x00\x2e\x00\x17\x00\x57\x00\x58\x00\x59\x00\x01\x00\x06\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x4d\x00\x4d\x00\x4d\x00\x1d\x00\x0e\x00\x0f\x00\x10\x00\x1a\x00\x22\x00\x23\x00\x14\x00\x4d\x00\x16\x00\x27\x00\x18\x00\x1a\x00\x26\x00\x1b\x00\x4d\x00\x1d\x00\x2e\x00\x4d\x00\x5a\x00\x02\x00\x03\x00\x1a\x00\x48\x00\x25\x00\x13\x00\x11\x00\x28\x00\x02\x00\x03\x00\x11\x00\x15\x00\x15\x00\x15\x00\x2e\x00\x11\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x26\x00\x1d\x00\x03\x00\x17\x00\x13\x00\x4a\x00\x22\x00\x23\x00\x10\x00\x1d\x00\x26\x00\x27\x00\x04\x00\x13\x00\x22\x00\x23\x00\x02\x00\x03\x00\x2e\x00\x27\x00\x4f\x00\x15\x00\x51\x00\x52\x00\x53\x00\x26\x00\x2e\x00\x11\x00\x57\x00\x58\x00\x59\x00\x01\x00\x12\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x11\x00\x26\x00\x14\x00\x1d\x00\x0e\x00\x0f\x00\x10\x00\x0c\x00\x22\x00\x23\x00\x14\x00\x0b\x00\x16\x00\x27\x00\x18\x00\x2e\x00\x14\x00\x1b\x00\x14\x00\x1d\x00\x2e\x00\x20\x00\x02\x00\x03\x00\x2e\x00\x11\x00\x11\x00\x25\x00\x11\x00\x11\x00\x28\x00\x02\x00\x03\x00\x1a\x00\x1b\x00\x11\x00\x14\x00\x2e\x00\x2e\x00\x13\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\x15\x00\x11\x00\x2d\x00\x11\x00\x22\x00\x23\x00\x31\x00\x0a\x00\x1d\x00\x27\x00\x15\x00\x13\x00\x31\x00\x22\x00\x23\x00\x3a\x00\x2e\x00\x26\x00\x27\x00\x4f\x00\x20\x00\x51\x00\x52\x00\x53\x00\x14\x00\x2e\x00\x0b\x00\x57\x00\x58\x00\x59\x00\x01\x00\x26\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x04\x00\x20\x00\x0b\x00\x13\x00\x0e\x00\x0f\x00\x10\x00\x20\x00\x26\x00\x11\x00\x14\x00\x11\x00\x16\x00\x0a\x00\x18\x00\x11\x00\x13\x00\x1b\x00\x13\x00\x1d\x00\x13\x00\x13\x00\x02\x00\x03\x00\x02\x00\x03\x00\x13\x00\x25\x00\x0b\x00\x15\x00\x28\x00\x26\x00\x5e\x00\x0c\x00\x0b\x00\x31\x00\x20\x00\x11\x00\x26\x00\x11\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\x13\x00\x1d\x00\x0d\x00\x15\x00\x22\x00\x23\x00\x22\x00\x23\x00\x26\x00\x27\x00\x26\x00\x27\x00\x15\x00\x0b\x00\x13\x00\x13\x00\x2e\x00\x11\x00\x2e\x00\x4f\x00\x11\x00\x51\x00\x52\x00\x53\x00\x26\x00\x11\x00\x0a\x00\x57\x00\x58\x00\x59\x00\x01\x00\x26\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x03\x00\x1a\x00\x1b\x00\x26\x00\x0e\x00\x0f\x00\x10\x00\x13\x00\x20\x00\x2f\x00\x14\x00\x0a\x00\x16\x00\x11\x00\x18\x00\x0a\x00\x26\x00\x1b\x00\x03\x00\x1d\x00\x2d\x00\x11\x00\x5d\x00\x11\x00\x31\x00\x11\x00\x0a\x00\x25\x00\x0a\x00\x12\x00\x28\x00\x02\x00\x03\x00\x3a\x00\x0b\x00\x0b\x00\x11\x00\x10\x00\x1a\x00\x1b\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x04\x00\x04\x00\x01\x00\x12\x00\x04\x00\x19\x00\x10\x00\x41\x00\x2d\x00\x1d\x00\x10\x00\x10\x00\x31\x00\x14\x00\x22\x00\x23\x00\x02\x00\x03\x00\x26\x00\x27\x00\x4f\x00\x3a\x00\x51\x00\x52\x00\x53\x00\x0b\x00\x2e\x00\x12\x00\x57\x00\x58\x00\x59\x00\x01\x00\x0c\x00\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x12\x00\x12\x00\x12\x00\x1d\x00\x0e\x00\x0f\x00\x10\x00\x12\x00\x22\x00\x23\x00\x14\x00\x05\x00\x16\x00\x27\x00\x18\x00\x7d\x00\x7d\x00\x1b\x00\x20\x00\x1d\x00\x2e\x00\xff\xff\x02\x00\x03\x00\x02\x00\x03\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\x0b\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x22\x00\x23\x00\x22\x00\x23\x00\xff\xff\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x2e\x00\x4f\x00\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\x57\x00\x58\x00\x59\x00\x01\x00\xff\xff\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x0f\x00\x10\x00\xff\xff\xff\xff\xff\xff\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x02\x00\x03\x00\x02\x00\x03\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x22\x00\x23\x00\x22\x00\x23\x00\xff\xff\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x2e\x00\x4f\x00\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\x57\x00\x58\x00\x59\x00\x01\x00\xff\xff\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x0f\x00\x10\x00\xff\xff\xff\xff\xff\xff\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x02\x00\x03\x00\x02\x00\x03\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\xff\xff\x1d\x00\xff\xff\xff\xff\x22\x00\x23\x00\x22\x00\x23\x00\xff\xff\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x2e\x00\x4f\x00\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x1a\x00\x1b\x00\x57\x00\x58\x00\x59\x00\x01\x00\xff\xff\x5c\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x10\x00\xff\xff\xff\xff\x31\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\x3a\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x03\x00\x25\x00\x0a\x00\x0b\x00\x28\x00\xff\xff\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x20\x00\xff\xff\x1d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\xff\xff\x01\x00\xff\xff\x27\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x2e\x00\x0b\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\xff\xff\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x01\x00\x31\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x3a\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\xff\xff\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x01\x00\x31\x00\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x3a\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x13\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\x01\x00\x31\x00\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x3a\x00\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x11\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x11\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x11\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x11\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\xff\xff\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x3b\x00\x25\x00\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x1a\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\x10\x00\x28\x00\x57\x00\x58\x00\x14\x00\xff\xff\x16\x00\xff\xff\x18\x00\xff\xff\x31\x00\x1b\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x25\x00\xff\xff\xff\xff\x01\x00\x1a\x00\x1b\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x22\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2c\x00\x2d\x00\x16\x00\xff\xff\x18\x00\x31\x00\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\x57\x00\x58\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x02\x00\x03\x00\x01\x00\x02\x00\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x0f\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\xff\xff\xff\xff\x1d\x00\x57\x00\x58\x00\x1d\x00\xff\xff\x22\x00\x23\x00\xff\xff\x22\x00\x23\x00\x27\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x01\x00\xff\xff\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x10\x00\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x01\x00\xff\xff\xff\xff\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x4d\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x0f\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0c\x00\x52\x00\x53\x00\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\xff\xff\x01\x00\x1a\x00\x1b\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\xff\xff\x22\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x10\x00\xff\xff\xff\xff\xff\xff\x2c\x00\x2d\x00\x52\x00\x53\x00\x18\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x03\x00\x3a\x00\xff\xff\xff\xff\x25\x00\xff\xff\xff\xff\xff\xff\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x11\x00\xff\xff\x13\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x1d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\x2e\x00\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\x52\x00\x53\x00\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\xff\xff\x41\x00\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x4a\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\x0c\x00\x14\x00\x15\x00\x0f\x00\x10\x00\xff\xff\x12\x00\x1a\x00\x14\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\x1a\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\x1a\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\x0c\x00\x14\x00\x15\x00\x0f\x00\x10\x00\xff\xff\x12\x00\x1a\x00\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\x0c\x00\xff\xff\xff\xff\x0f\x00\x10\x00\xff\xff\x12\x00\xff\xff\x14\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\x1a\x00\x3a\x00\x1c\x00\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\x4d\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\x31\x00\x37\x00\x33\x00\x34\x00\x3a\x00\xff\xff\x37\x00\xff\xff\x1a\x00\x3a\x00\x1c\x00\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\x4d\x00\xff\xff\x26\x00\x27\x00\x28\x00\x4d\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\x31\x00\x37\x00\x33\x00\x34\x00\x3a\x00\x0e\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\x0e\x00\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x1c\x00\xff\xff\xff\xff\xff\xff\x4d\x00\xff\xff\x1a\x00\xff\xff\x1c\x00\x4d\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\x31\x00\xff\xff\x33\x00\x34\x00\x35\x00\xff\xff\x37\x00\xff\xff\x31\x00\x3a\x00\x33\x00\x34\x00\x35\x00\x1a\x00\x37\x00\x1c\x00\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x36\x00\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\x35\x00\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x36\x00\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1b\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\x22\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\xff\xff\xff\xff\x31\x00\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\x3a\x00\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x31\x00\x1c\x00\x33\x00\x34\x00\x1a\x00\xff\xff\x37\x00\xff\xff\x28\x00\x3a\x00\xff\xff\x26\x00\x27\x00\x28\x00\xff\xff\xff\xff\xff\xff\x31\x00\x28\x00\x33\x00\x34\x00\x1a\x00\x31\x00\x37\x00\x33\x00\x34\x00\x3a\x00\x31\x00\x37\x00\x33\x00\x34\x00\x3a\x00\xff\xff\x37\x00\x1a\x00\x28\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\x28\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x1a\x00\x28\x00\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\x31\x00\x3a\x00\x33\x00\x34\x00\x28\x00\xff\xff\x37\x00\x1a\x00\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\x28\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\x19\x02\x25\x00\x30\x02\xbf\x00\xc3\x00\x6c\x02\xfd\x01\x04\x01\xfd\x01\xc2\x00\xc3\x00\xf6\x00\x57\x00\xd9\xff\x72\x02\x4d\x00\x58\x00\x88\x02\x9d\xff\xfc\xff\xec\x00\x8b\x02\x7f\x02\x50\x00\x9d\xff\x9d\xff\x9d\xff\x81\x02\x9d\xff\x25\x00\x9d\xff\xf6\x00\x9d\xff\xd9\xff\xd9\xff\x71\x01\xc4\x00\x89\x01\xf7\x00\x72\x01\x57\x00\xc5\x00\xc6\x00\xc0\x00\x58\x00\x9d\xff\xc7\x00\x0c\x01\xb0\x01\x65\x02\xff\x01\xfe\x01\xff\x01\xc8\x00\x9d\xff\xf8\x00\x5e\x00\x75\x02\xf7\x00\x70\xff\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xbf\x00\x25\x00\xbb\x00\xc8\x00\x73\x01\xcc\x01\xf8\x00\xd9\xff\x62\x00\x63\x00\x82\x02\x74\x01\x57\x00\x3f\x01\x0c\x01\x64\x00\x58\x00\xf6\x00\x65\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x9d\xff\x9d\xff\x25\x00\x9d\xff\x3e\x02\xc2\x00\xc3\x00\x72\x01\x62\x00\x63\x00\xbf\x00\x76\x02\x79\x02\x57\x00\x06\xff\x64\x00\xf7\x00\x58\x00\x65\x00\x66\x00\xfc\xff\xc8\x00\x06\xff\x67\x00\x06\xff\x68\x00\x69\x00\x6a\x00\xfc\xff\x28\x01\x29\x01\xbf\x00\xc4\x00\xf8\x00\x77\x02\x9d\xff\x70\x02\xc5\x00\xc6\x00\x42\x01\x43\x01\x44\x01\xc7\x00\xf6\x00\x44\x01\x4e\x01\xbf\x00\x66\x00\x00\x02\xc8\x00\x59\x02\x67\x00\x7a\x02\x68\x00\x69\x00\x6a\x00\xfc\xff\x25\x01\xae\x01\xbf\x00\xbf\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\xf7\x00\x5c\x02\x2a\x01\xaf\x01\xc2\x00\xc3\x00\x7d\x00\x7e\x00\x62\x00\x63\x00\xb0\x01\x6e\x02\x2a\x01\x9c\xff\x45\x01\x64\x00\xc0\x00\xf8\x00\x65\x00\x9c\xff\x9c\xff\x9c\xff\xbf\x00\x9c\xff\x7c\x00\x9c\xff\x85\x02\x9c\xff\x57\x02\x37\x02\xc0\x00\xc4\x00\x7f\x00\xc2\x00\xc3\x00\x7b\x02\xc5\x00\xc6\x00\x80\x00\x56\x02\x9c\xff\xc7\x00\x08\xff\x7d\x00\x7e\x00\xbf\x00\xf6\x00\x66\x00\xc8\x00\x9c\xff\x08\xff\x67\x00\x08\xff\x68\x00\x69\x00\x6a\x00\xbf\x00\x58\x02\x06\xff\x86\x02\xc4\x00\x6b\xff\x88\x01\xbf\x00\x5b\x02\xc5\x00\xc6\x00\xc2\x00\xc3\x00\x7f\x00\xc7\x00\x97\x00\xbf\x00\xf7\x00\xbf\x00\x80\x00\x0c\xff\xc8\x00\x4d\x02\xbf\x00\x7d\x02\x5d\x02\x6b\xff\xbf\x00\x0c\xff\x9c\x01\x0c\xff\x9c\x00\xc2\x00\xc3\x00\xf8\x00\x25\x00\x9c\xff\x9c\xff\xc4\x00\x9c\xff\x9e\x01\x0b\xff\xbf\x00\xc5\x00\xc6\x00\x5f\x02\x9d\x00\xa0\x01\xc7\x00\x0b\xff\x58\x00\x0b\xff\xbf\x00\xc2\x00\xc3\x00\xc8\x00\xa2\x01\x4d\x01\xc0\x00\xc4\x00\x69\x02\x1f\x02\x09\xff\xbb\x01\xc5\x00\xc6\x00\x4e\x01\xbe\x01\xbf\x00\xc7\x00\x09\xff\x9c\xff\x09\xff\xbf\x00\xc2\x00\xc3\x00\xc8\x00\x1e\x02\x1f\x02\xbf\x00\xc4\x00\xfb\x00\xbf\x01\x07\xff\xbf\x00\xc5\x00\xc6\x00\x72\x02\x25\x00\xbf\x00\xc7\x00\x07\xff\xc0\x01\x07\xff\x86\x02\xc2\x00\xc3\x00\xc8\x00\xf4\x01\x24\x01\x08\xff\xc4\x00\xbf\x00\x58\x00\x02\xff\xbf\x00\xc5\x00\xc6\x00\xc1\x01\xd6\x00\xfb\x00\xc7\x00\x02\xff\xc2\x01\x02\xff\xaa\x01\xc2\x00\xc3\x00\xc8\x00\xc0\x00\x85\x01\xfc\x00\xc4\x00\x44\x01\xc0\x00\x01\xff\xbf\x00\xc5\x00\xc6\x00\x14\x01\x98\x00\x32\x01\xc7\x00\x01\xff\x0c\xff\x01\xff\xec\x00\xc2\x00\xc3\x00\xc8\x00\xcf\x01\xee\x00\x16\x01\xc4\x00\x33\x01\xc0\x00\xfe\xfe\x97\x00\xc5\x00\xc6\x00\xfc\x00\x79\x00\x48\x01\xc7\x00\xfe\xfe\x0b\xff\xfe\xfe\x98\x00\xc2\x00\xc3\x00\xc8\x00\x59\x01\x48\x01\x47\x01\xc4\x00\x72\x02\xc0\x00\xfd\xfe\x60\x02\xc5\x00\xc6\x00\x49\x01\x73\x02\x6d\x02\xc7\x00\xfd\xfe\x09\xff\xfd\xfe\x7a\x00\xc2\x00\xc3\x00\xc8\x00\x62\x02\x7b\x00\x7c\x00\xc4\x00\xbb\x00\xd6\x00\xfc\xfe\xbc\x00\xc5\x00\xc6\x00\x8a\x00\xc3\x01\x66\x02\xc7\x00\xfc\xfe\x07\xff\xfc\xfe\x1a\x00\xc2\x00\xc3\x00\xc8\x00\xc2\x00\xc3\x00\x14\x02\xc4\x00\xb2\x01\xd6\x00\xfb\xfe\x70\xff\xc5\x00\xc6\x00\x1e\x00\xd7\x00\x25\x02\xc7\x00\xfb\xfe\x02\xff\xfb\xfe\xf8\x01\x2b\x01\x1f\x00\xc8\x00\x8b\x00\x21\x00\xec\x00\xc4\x00\x22\x00\x70\xff\xc4\x00\x23\x00\xc5\x00\xc6\x00\x1b\x02\xc5\x00\xc6\x00\xc7\x00\xec\x00\x01\xff\xc7\x00\x1d\x02\xed\x00\xee\x00\xc8\x00\x26\x02\x8c\x00\xc8\x00\x4d\x02\x2d\x02\x4e\x02\x2e\x02\x7d\x00\xb2\x00\x7d\x00\xb2\x00\xc2\x00\xc3\x00\x3b\x02\x25\x00\xfe\xfe\x8e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x8f\x00\x23\x01\x24\x01\xd3\x01\x33\x02\x53\x02\x2e\x00\xb6\x00\xd4\x01\xb6\x00\x2f\x00\x30\x02\x30\x00\xfd\xfe\x31\x00\xc4\x00\x80\x00\x32\x00\x80\x00\x31\x02\xc5\x00\xc6\x00\x2a\x01\x2b\x01\x36\x02\xc7\x00\x0d\x01\x34\x00\xe9\x01\x0d\x01\x35\x00\x70\x01\xc8\x00\x0d\x01\xfc\xfe\x0e\x01\x1a\x00\x0d\x01\x47\x02\x0f\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x49\x02\x1e\x00\x50\x02\x51\x02\xa7\x00\xa8\x00\xfb\xfe\x2d\x01\x2e\x01\xff\xff\x1f\x00\x4c\x02\x29\x02\x21\x00\x4a\x02\xf0\x01\x22\x00\x21\x02\x22\x02\x23\x00\x2a\x02\x06\x00\x40\x00\x41\x00\x42\x00\xd1\x01\x4b\x02\xc4\x01\x43\x00\x44\x00\x8a\xff\xc5\x01\x2b\x02\x25\x00\xad\x00\x90\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xc6\x01\xc7\x01\xc8\x01\xc9\x01\x2c\x00\x2d\x00\x2e\x00\x23\x02\x24\x02\x25\x02\x2f\x00\x19\x02\x30\x00\xca\x01\x31\x00\xcb\x01\x1a\x02\x32\x00\xd6\x01\xae\x00\xd7\x01\xd8\x01\xda\x01\xdc\x01\xaf\x00\xb0\x00\x4d\x00\x34\x00\xb1\x00\xf9\x01\x35\x00\xde\x01\xe0\x01\xe1\x01\x50\x00\xe2\x01\xb2\x00\xe3\x01\xe4\x01\xe5\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x3f\x00\xe6\x01\x40\x00\x41\x00\x42\x00\xe7\x01\xec\x01\xef\x01\x43\x00\x44\x00\x45\x00\x25\x00\x79\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xfa\x01\x01\x02\x03\x02\x19\x02\x2c\x00\x2d\x00\x2e\x00\x05\x02\x34\x02\x07\x02\x2f\x00\x0c\x02\x30\x00\x52\x01\x31\x00\x55\x01\x57\x01\x32\x00\x4d\x00\xae\x00\x61\x01\x77\x00\xc2\x00\xc3\x00\x7b\x00\x7c\x00\x50\x00\x34\x00\x62\x01\x66\x01\x35\x00\xc2\x00\xc3\x00\xef\x00\xb2\x00\x67\x01\x7e\x01\xf0\x00\xee\x00\x8a\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x8b\x01\x8c\x01\xf1\x00\x8e\x01\xc5\x00\xc6\x00\xb6\x00\xf2\x00\xc4\x00\xc7\x00\x9b\x01\x9d\x01\x9f\x01\xc5\x00\xc6\x00\x80\x00\xc8\x00\xa1\x01\xc7\x00\x3f\x00\xa3\x01\x40\x00\x41\x00\x42\x00\xb8\x01\xc8\x00\x51\x01\x43\x00\x44\x00\x45\x00\x25\x00\xb9\x01\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xbd\x01\xdc\x00\x7d\x00\xb2\x00\x2c\x00\x2d\x00\x2e\x00\xe2\x00\xe5\x00\xe8\x00\x2f\x00\xea\x00\x30\x00\xf9\x00\x31\x00\x10\x01\x1e\x01\x32\x00\x17\x01\x33\x00\x15\x01\x52\x02\xf3\x01\xc2\x00\xc3\x00\xb6\x00\x18\x01\x34\x00\x1f\x01\x22\x01\x35\x00\xc2\x00\xc3\x00\x26\x01\x80\x00\x2e\x01\x3a\x01\x3b\x01\x3e\x01\xd2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x01\xc4\x00\x40\x01\x46\x01\x71\x00\xee\x01\xc5\x00\xc6\x00\x4a\x01\xc4\x00\x4f\x01\xc7\x00\x72\x00\x73\x00\xc5\x00\xc6\x00\xc2\x00\xc3\x00\xc8\x00\xc7\x00\x3f\x00\x77\x00\x40\x00\x41\x00\x42\x00\x16\x02\xc8\x00\x90\x00\x43\x00\x44\x00\x45\x00\x25\x00\x92\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x9a\x00\x9d\x00\x9e\x00\xc4\x00\x2c\x00\x2d\x00\x2e\x00\xa0\x00\xc5\x00\xc6\x00\x2f\x00\xa5\x00\x30\x00\xc7\x00\x31\x00\xcf\x00\x88\x02\x32\x00\xbd\x00\x33\x00\xc8\x00\xc8\x00\x21\x01\xc2\x00\xc3\x00\xd5\x00\x04\x00\x34\x00\x8a\x02\x84\x02\x35\x00\xc2\x00\xc3\x00\x7d\x02\x72\x02\x75\x02\x55\x02\xf8\x00\x40\xff\xd4\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x56\x02\xc4\x00\x00\x00\x12\x01\x5f\x02\x62\x02\xc5\x00\xc6\x00\x68\x02\xc4\x00\x66\x01\xc7\x00\x69\x02\x6c\x02\xc5\x00\xc6\x00\xc2\x00\xc3\x00\xc8\x00\xc7\x00\x3f\x00\x6b\x02\x40\x00\x41\x00\x42\x00\x14\x02\xc8\x00\x70\x02\x43\x00\x44\x00\x45\x00\x25\x00\xf6\x01\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x17\x02\x18\x02\x19\x02\xc4\x00\x2c\x00\x2d\x00\x2e\x00\x28\x02\xc5\x00\xc6\x00\x2f\x00\x29\x02\x30\x00\xc7\x00\x31\x00\x52\x02\x33\x02\x32\x00\x05\x02\x33\x00\xc8\x00\x39\x02\xc2\x00\xc3\x00\xcf\x01\x3f\x02\x40\x02\x34\x00\x41\x02\x42\x02\x35\x00\xc2\x00\xc3\x00\x7d\x00\xb2\x00\x43\x02\xd3\x01\xf8\x00\xda\x01\x87\xff\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x3d\xff\xde\x01\xd5\x01\xe0\x01\xc5\x00\xc6\x00\xb6\x00\xec\x00\xc4\x00\xc7\x00\xeb\x01\x03\x02\xef\x01\xc5\x00\xc6\x00\x80\x00\xc8\x00\xec\x01\xc7\x00\x3f\x00\xfd\x01\x40\x00\x41\x00\x42\x00\x05\x02\xc8\x00\x0f\x02\x43\x00\x44\x00\x45\x00\x25\x00\x10\x02\x1e\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x11\x02\x54\x01\x12\x02\x55\x01\x2c\x00\x2d\x00\x2e\x00\x59\x01\x5c\x01\x5b\x01\x2f\x00\x5d\x01\x30\x00\x5e\x01\x31\x00\x64\x01\x69\x01\x32\x00\x6a\x01\x33\x00\x6b\x01\x6c\x01\xc2\x00\xc3\x00\x06\x01\xc3\x00\x6d\x01\x34\x00\x70\x01\x7a\x01\x35\x00\x79\x01\x7b\x01\x94\x00\x81\x01\x85\x01\x82\x01\x65\x01\x80\x01\x07\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x88\x01\x08\x01\x95\x01\x92\x01\xc5\x00\xc6\x00\x09\x01\x0a\x01\x66\x01\xc7\x00\x0b\x01\xc7\x00\x93\x01\x94\x01\xa5\x01\xa7\x01\xc8\x00\xad\x01\x0c\x01\x3f\x00\xb1\x01\x40\x00\x41\x00\x42\x00\xb3\x01\xb4\x01\xb5\x01\x43\x00\x44\x00\x45\x00\x25\x00\xb7\x01\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x7d\x00\xb2\x00\xda\x00\x2c\x00\x2d\x00\x2e\x00\xe7\x00\xe4\x00\xea\x00\x2f\x00\xec\x00\x30\x00\xf9\x00\x31\x00\xfb\x00\xf5\x00\x32\x00\x00\x00\x33\x00\xe8\x01\xc3\xff\x22\x01\xc4\xff\xb6\x00\x03\x01\xec\x00\x34\x00\xec\x00\x30\x01\x35\x00\xc2\x00\xc3\x00\x80\x00\x34\x01\x4c\x01\x44\x01\x4d\x01\x7d\x00\xb2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x6b\x00\x6c\x00\x6e\x00\x6f\x00\x71\x00\x13\x01\x75\x00\x70\x00\xa5\x01\xc4\x00\x76\x00\x77\x00\xb6\x00\x92\x00\xc5\x00\xc6\x00\xc2\x00\xc3\x00\x14\x01\xc7\x00\x3f\x00\x80\x00\x40\x00\x41\x00\x42\x00\xf7\x01\xc8\x00\x86\x00\x43\x00\x44\x00\x45\x00\x25\x00\x94\x00\x1e\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x87\x00\x88\x00\x89\x00\xc4\x00\x2c\x00\x2d\x00\x2e\x00\x8a\x00\xc5\x00\xc6\x00\x2f\x00\x95\x00\x30\x00\xc7\x00\x31\x00\xff\xff\xff\xff\x32\x00\xbf\x00\x33\x00\xc8\x00\x00\x00\xc2\x00\xc3\x00\xc2\x00\xc3\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\xf8\x01\x00\x00\x0a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x00\x00\xc4\x00\x00\x00\x00\x00\xc5\x00\xc6\x00\xc5\x00\xc6\x00\x00\x00\xc7\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x3f\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x43\x00\x44\x00\x45\x00\x25\x00\x00\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x33\x00\x00\x00\x00\x00\xc2\x00\xc3\x00\xc2\x00\xc3\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x0b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x00\x00\xc4\x00\x00\x00\x00\x00\xc5\x00\xc6\x00\xc5\x00\xc6\x00\x00\x00\xc7\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x3f\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x43\x00\x44\x00\x45\x00\x25\x00\x00\x00\x1e\x01\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x33\x00\x00\x00\x00\x00\xc2\x00\xc3\x00\xc2\x00\xc3\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x13\x02\x00\x00\x00\x00\x00\x00\x00\x00\x09\x02\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xc4\x00\x00\x00\xc4\x00\x00\x00\x00\x00\xc5\x00\xc6\x00\xc5\x00\xc6\x00\x00\x00\xc7\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\xc8\x00\x3f\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x7d\x00\xb2\x00\x43\x00\x44\x00\x45\x00\x25\x00\x00\x00\x46\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x8b\x02\x00\x00\x00\x00\x00\x00\xa7\x01\x2e\x00\x00\x00\x00\x00\xb6\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x80\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc3\x00\x34\x00\x76\x01\x77\x01\x35\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x78\x01\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc6\x00\x00\x00\x25\x00\x00\x00\xc7\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xc8\x00\x7f\x02\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x00\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x79\x02\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\x8b\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x01\x00\x00\x00\x00\x25\x00\xb6\x00\x8e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x80\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x00\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x01\x00\x00\xa9\x01\x00\x00\x00\x00\x25\x00\xb6\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2d\x02\x80\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\x8b\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x01\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x3a\x02\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\x8b\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x00\x00\x25\x00\xb6\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x80\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x44\x02\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x45\x02\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x46\x02\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x47\x02\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x8e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x00\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\x29\x02\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x64\x02\x34\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x1a\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x2e\x00\x1e\x00\x43\x00\x44\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x1f\x00\x32\x00\xba\x01\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x63\x02\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x43\x00\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc3\x00\x25\x00\x79\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x01\xb9\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x7a\x00\x00\x00\xc5\x00\xc6\x00\x00\x00\x7b\x00\x7c\x00\xc7\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xbb\x00\x25\x00\x00\x00\xb8\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xba\x00\x1a\x00\x00\x00\x96\x01\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x21\x00\x97\x01\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xbb\x00\x25\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x98\x01\x56\x01\x47\x00\x48\x00\x49\x00\x00\x00\xb9\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x84\x00\x85\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\xbb\x00\x00\x00\x25\x00\x7d\x00\xb2\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\xb3\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x82\x00\x00\x00\x00\x00\x00\x00\x48\x02\xb5\x00\x84\x00\x85\x00\x31\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xff\xc3\x00\x80\x00\x00\x00\x00\x00\x83\x00\x00\x00\x00\x00\x00\x00\x65\xff\x65\xff\x65\xff\x00\x00\x00\x00\x00\x00\x65\xff\x00\x00\x65\xff\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x65\xff\x00\x00\x00\x00\x65\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\xff\x65\xff\x00\x00\x00\x00\x35\x01\x47\x00\x48\x00\x49\x00\x65\xff\x65\xff\x00\x00\x65\xff\x00\x00\x00\x00\x84\x00\x85\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x00\x00\x65\xff\x00\x00\x00\x00\x50\x00\x36\x01\x47\x00\x48\x00\x49\x00\x00\x00\x65\xff\x00\x00\x37\x01\x47\x00\x48\x00\x49\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x4a\x00\x4e\x00\x4f\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x50\x00\x4e\x00\x4f\x00\x38\x01\x47\x00\x48\x00\x49\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x01\x47\x00\x48\x00\x49\x00\x00\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x95\x00\x47\x00\x48\x00\x49\x00\x50\x00\x00\x00\x00\x00\x96\x00\x47\x00\x48\x00\x49\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x4a\x00\x4e\x00\x4f\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x50\x00\x4e\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x46\x00\x47\x00\x48\x00\x49\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x4b\x00\x4c\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x4f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\xdd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x1f\x00\x00\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x1a\x00\x23\x00\xe1\x00\x00\x00\x00\x00\x1a\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x95\x01\x00\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x21\x00\x00\x00\x1f\x00\x22\x00\x20\x00\x21\x00\x23\x00\x00\x00\x22\x00\x00\x00\x1a\x00\x23\x00\xfd\x00\x00\x00\x00\x00\x1a\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x99\x01\x00\x00\x1c\x00\x1d\x00\x1e\x00\x9a\x01\x00\x00\x00\x00\x1f\x00\x00\x00\x20\x00\x21\x00\x00\x00\x1f\x00\x22\x00\x20\x00\x21\x00\x23\x00\x77\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x1a\x00\x00\x00\x3c\x01\x00\x01\x1c\x00\x1d\x00\x1e\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x00\x00\x20\x00\x21\x00\xab\x00\x00\x00\x22\x00\x00\x00\x1f\x00\x23\x00\x20\x00\x21\x00\x3d\x01\x19\x01\x22\x00\x1a\x01\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x1f\x00\x1a\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x02\x1c\x01\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x1f\x00\x1a\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x86\x01\x1c\x01\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x8f\x01\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x1b\x01\x1c\x01\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\xcd\x01\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x96\x01\x20\x00\x21\x00\x00\x00\x3c\x02\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x8f\x01\x20\x00\x21\x00\x97\x01\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\xcd\x01\xd0\x01\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x5a\x02\x20\x00\x21\x00\x00\x00\x90\x01\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x36\x02\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\xfb\x01\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x3a\x02\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\xf1\x01\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x0b\x02\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\xf3\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x0d\x02\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x30\x01\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x51\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\xb2\x00\x1a\x00\x1f\x00\x5e\x01\x20\x00\x21\x00\x00\x00\xb3\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\xb4\x00\xb5\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x1a\x00\x1f\x00\x5f\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x80\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x60\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x6d\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x7b\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x7c\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x7d\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x82\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x83\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x8d\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xdf\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xe0\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xb7\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xbc\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xda\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xdb\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xdd\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xde\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xdf\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xe0\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xe1\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xe4\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xf3\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xa1\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x01\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x03\x01\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x6c\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x99\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x9f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xa1\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xa3\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xa4\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xc9\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xca\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xcb\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xcc\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xcd\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xce\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xd0\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xd2\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xd4\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\xd8\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x1f\x00\x1b\x00\x20\x00\x21\x00\x1a\x00\x00\x00\x22\x00\x00\x00\x1e\x00\x23\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x1e\x00\xba\x01\x21\x00\x1a\x00\x1f\x00\x22\x00\x20\x00\x21\x00\x23\x00\x1f\x00\x22\x00\xba\x01\x21\x00\x23\x00\x00\x00\x22\x00\x1a\x00\x1e\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x1f\x00\x00\x00\xdb\x01\x21\x00\x1e\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x1a\x00\x1e\x00\x1f\x00\x00\x00\xba\x01\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x1f\x00\x23\x00\xba\x01\x21\x00\x1e\x00\x00\x00\x22\x00\x1a\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\xe7\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x1e\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\xa2\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyReduceArr = Happy_Data_Array.array (3, 272) [-	(3 , happyReduce_3),-	(4 , happyReduce_4),-	(5 , happyReduce_5),-	(6 , happyReduce_6),-	(7 , happyReduce_7),-	(8 , happyReduce_8),-	(9 , happyReduce_9),-	(10 , happyReduce_10),-	(11 , happyReduce_11),-	(12 , happyReduce_12),-	(13 , happyReduce_13),-	(14 , happyReduce_14),-	(15 , happyReduce_15),-	(16 , happyReduce_16),-	(17 , happyReduce_17),-	(18 , happyReduce_18),-	(19 , happyReduce_19),-	(20 , happyReduce_20),-	(21 , happyReduce_21),-	(22 , happyReduce_22),-	(23 , happyReduce_23),-	(24 , happyReduce_24),-	(25 , happyReduce_25),-	(26 , happyReduce_26),-	(27 , happyReduce_27),-	(28 , happyReduce_28),-	(29 , happyReduce_29),-	(30 , happyReduce_30),-	(31 , happyReduce_31),-	(32 , happyReduce_32),-	(33 , happyReduce_33),-	(34 , happyReduce_34),-	(35 , happyReduce_35),-	(36 , happyReduce_36),-	(37 , happyReduce_37),-	(38 , happyReduce_38),-	(39 , happyReduce_39),-	(40 , happyReduce_40),-	(41 , happyReduce_41),-	(42 , happyReduce_42),-	(43 , happyReduce_43),-	(44 , happyReduce_44),-	(45 , happyReduce_45),-	(46 , happyReduce_46),-	(47 , happyReduce_47),-	(48 , happyReduce_48),-	(49 , happyReduce_49),-	(50 , happyReduce_50),-	(51 , happyReduce_51),-	(52 , happyReduce_52),-	(53 , happyReduce_53),-	(54 , happyReduce_54),-	(55 , happyReduce_55),-	(56 , happyReduce_56),-	(57 , happyReduce_57),-	(58 , happyReduce_58),-	(59 , happyReduce_59),-	(60 , happyReduce_60),-	(61 , happyReduce_61),-	(62 , happyReduce_62),-	(63 , happyReduce_63),-	(64 , happyReduce_64),-	(65 , happyReduce_65),-	(66 , happyReduce_66),-	(67 , happyReduce_67),-	(68 , happyReduce_68),-	(69 , happyReduce_69),-	(70 , happyReduce_70),-	(71 , happyReduce_71),-	(72 , happyReduce_72),-	(73 , happyReduce_73),-	(74 , happyReduce_74),-	(75 , happyReduce_75),-	(76 , happyReduce_76),-	(77 , happyReduce_77),-	(78 , happyReduce_78),-	(79 , happyReduce_79),-	(80 , happyReduce_80),-	(81 , happyReduce_81),-	(82 , happyReduce_82),-	(83 , happyReduce_83),-	(84 , happyReduce_84),-	(85 , happyReduce_85),-	(86 , happyReduce_86),-	(87 , happyReduce_87),-	(88 , happyReduce_88),-	(89 , happyReduce_89),-	(90 , happyReduce_90),-	(91 , happyReduce_91),-	(92 , happyReduce_92),-	(93 , happyReduce_93),-	(94 , happyReduce_94),-	(95 , happyReduce_95),-	(96 , happyReduce_96),-	(97 , happyReduce_97),-	(98 , happyReduce_98),-	(99 , happyReduce_99),-	(100 , happyReduce_100),-	(101 , happyReduce_101),-	(102 , happyReduce_102),-	(103 , happyReduce_103),-	(104 , happyReduce_104),-	(105 , happyReduce_105),-	(106 , happyReduce_106),-	(107 , happyReduce_107),-	(108 , happyReduce_108),-	(109 , happyReduce_109),-	(110 , happyReduce_110),-	(111 , happyReduce_111),-	(112 , happyReduce_112),-	(113 , happyReduce_113),-	(114 , happyReduce_114),-	(115 , happyReduce_115),-	(116 , happyReduce_116),-	(117 , happyReduce_117),-	(118 , happyReduce_118),-	(119 , happyReduce_119),-	(120 , happyReduce_120),-	(121 , happyReduce_121),-	(122 , happyReduce_122),-	(123 , happyReduce_123),-	(124 , happyReduce_124),-	(125 , happyReduce_125),-	(126 , happyReduce_126),-	(127 , happyReduce_127),-	(128 , happyReduce_128),-	(129 , happyReduce_129),-	(130 , happyReduce_130),-	(131 , happyReduce_131),-	(132 , happyReduce_132),-	(133 , happyReduce_133),-	(134 , happyReduce_134),-	(135 , happyReduce_135),-	(136 , happyReduce_136),-	(137 , happyReduce_137),-	(138 , happyReduce_138),-	(139 , happyReduce_139),-	(140 , happyReduce_140),-	(141 , happyReduce_141),-	(142 , happyReduce_142),-	(143 , happyReduce_143),-	(144 , happyReduce_144),-	(145 , happyReduce_145),-	(146 , happyReduce_146),-	(147 , happyReduce_147),-	(148 , happyReduce_148),-	(149 , happyReduce_149),-	(150 , happyReduce_150),-	(151 , happyReduce_151),-	(152 , happyReduce_152),-	(153 , happyReduce_153),-	(154 , happyReduce_154),-	(155 , happyReduce_155),-	(156 , happyReduce_156),-	(157 , happyReduce_157),-	(158 , happyReduce_158),-	(159 , happyReduce_159),-	(160 , happyReduce_160),-	(161 , happyReduce_161),-	(162 , happyReduce_162),-	(163 , happyReduce_163),-	(164 , happyReduce_164),-	(165 , happyReduce_165),-	(166 , happyReduce_166),-	(167 , happyReduce_167),-	(168 , happyReduce_168),-	(169 , happyReduce_169),-	(170 , happyReduce_170),-	(171 , happyReduce_171),-	(172 , happyReduce_172),-	(173 , happyReduce_173),-	(174 , happyReduce_174),-	(175 , happyReduce_175),-	(176 , happyReduce_176),-	(177 , happyReduce_177),-	(178 , happyReduce_178),-	(179 , happyReduce_179),-	(180 , happyReduce_180),-	(181 , happyReduce_181),-	(182 , happyReduce_182),-	(183 , happyReduce_183),-	(184 , happyReduce_184),-	(185 , happyReduce_185),-	(186 , happyReduce_186),-	(187 , happyReduce_187),-	(188 , happyReduce_188),-	(189 , happyReduce_189),-	(190 , happyReduce_190),-	(191 , happyReduce_191),-	(192 , happyReduce_192),-	(193 , happyReduce_193),-	(194 , happyReduce_194),-	(195 , happyReduce_195),-	(196 , happyReduce_196),-	(197 , happyReduce_197),-	(198 , happyReduce_198),-	(199 , happyReduce_199),-	(200 , happyReduce_200),-	(201 , happyReduce_201),-	(202 , happyReduce_202),-	(203 , happyReduce_203),-	(204 , happyReduce_204),-	(205 , happyReduce_205),-	(206 , happyReduce_206),-	(207 , happyReduce_207),-	(208 , happyReduce_208),-	(209 , happyReduce_209),-	(210 , happyReduce_210),-	(211 , happyReduce_211),-	(212 , happyReduce_212),-	(213 , happyReduce_213),-	(214 , happyReduce_214),-	(215 , happyReduce_215),-	(216 , happyReduce_216),-	(217 , happyReduce_217),-	(218 , happyReduce_218),-	(219 , happyReduce_219),-	(220 , happyReduce_220),-	(221 , happyReduce_221),-	(222 , happyReduce_222),-	(223 , happyReduce_223),-	(224 , happyReduce_224),-	(225 , happyReduce_225),-	(226 , happyReduce_226),-	(227 , happyReduce_227),-	(228 , happyReduce_228),-	(229 , happyReduce_229),-	(230 , happyReduce_230),-	(231 , happyReduce_231),-	(232 , happyReduce_232),-	(233 , happyReduce_233),-	(234 , happyReduce_234),-	(235 , happyReduce_235),-	(236 , happyReduce_236),-	(237 , happyReduce_237),-	(238 , happyReduce_238),-	(239 , happyReduce_239),-	(240 , happyReduce_240),-	(241 , happyReduce_241),-	(242 , happyReduce_242),-	(243 , happyReduce_243),-	(244 , happyReduce_244),-	(245 , happyReduce_245),-	(246 , happyReduce_246),-	(247 , happyReduce_247),-	(248 , happyReduce_248),-	(249 , happyReduce_249),-	(250 , happyReduce_250),-	(251 , happyReduce_251),-	(252 , happyReduce_252),-	(253 , happyReduce_253),-	(254 , happyReduce_254),-	(255 , happyReduce_255),-	(256 , happyReduce_256),-	(257 , happyReduce_257),-	(258 , happyReduce_258),-	(259 , happyReduce_259),-	(260 , happyReduce_260),-	(261 , happyReduce_261),-	(262 , happyReduce_262),-	(263 , happyReduce_263),-	(264 , happyReduce_264),-	(265 , happyReduce_265),-	(266 , happyReduce_266),-	(267 , happyReduce_267),-	(268 , happyReduce_268),-	(269 , happyReduce_269),-	(270 , happyReduce_270),-	(271 , happyReduce_271),-	(272 , happyReduce_272)-	]--happy_n_terms = 126 :: Int-happy_n_nonterms = 79 :: Int--happyReduce_3 = happySpecReduce_0  0# happyReduction_3-happyReduction_3  =  happyIn6-		 ([]-	)--happyReduce_4 = happySpecReduce_2  0# happyReduction_4-happyReduction_4 happy_x_2-	happy_x_1-	 =  case happyOut7 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_2 of { happy_var_2 -> -	happyIn6-		 (happy_var_1:happy_var_2-	)}}--happyReduce_5 = happySpecReduce_2  0# happyReduction_5-happyReduction_5 happy_x_2-	happy_x_1-	 =  case happyOut18 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_2 of { happy_var_2 -> -	happyIn6-		 (map RealDecl happy_var_1 ++ happy_var_2-	)}}--happyReduce_6 = happyReduce 4# 0# happyReduction_6-happyReduction_6 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> -	case happyOut6 happy_x_4 of { happy_var_4 -> -	happyIn6-		 (RealDecl (PInclude happy_var_2) : happy_var_4-	) `HappyStk` happyRest}}--happyReduce_7 = happySpecReduce_1  1# happyReduction_7-happyReduction_7 happy_x_1-	 =  case happyOut9 happy_x_1 of { happy_var_1 -> -	happyIn7-		 (happy_var_1-	)}--happyReduce_8 = happySpecReduce_1  1# happyReduction_8-happyReduction_8 happy_x_1-	 =  case happyOut26 happy_x_1 of { happy_var_1 -> -	happyIn7-		 (RealDecl (DataDecl happy_var_1)-	)}--happyReduce_9 = happySpecReduce_1  1# happyReduction_9-happyReduction_9 happy_x_1-	 =  case happyOut22 happy_x_1 of { happy_var_1 -> -	happyIn7-		 (RealDecl happy_var_1-	)}--happyReduce_10 = happyReduce 5# 1# happyReduction_10-happyReduction_10 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { (TokenName happy_var_2) -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn7-		 (RealDecl (Freeze happy_var_3 happy_var_4 [] happy_var_2)-	) `HappyStk` happyRest}}}--happyReduce_11 = happyReduce 4# 1# happyReduction_11-happyReduction_11 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut67 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PUsing happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_12 = happyReduce 4# 1# happyReduction_12-happyReduction_12 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut68 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PDoUsing happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_13 = happyReduce 4# 1# happyReduction_13-happyReduction_13 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut69 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PIdiom happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_14 = happyReduce 4# 1# happyReduction_14-happyReduction_14 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut70 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PParams happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_15 = happyReduce 4# 1# happyReduction_15-happyReduction_15 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut71 happy_x_1 of { happy_var_1 -> -	case happyOut6 happy_x_3 of { happy_var_3 -> -	happyIn7-		 (PNamespace happy_var_1 happy_var_3-	) `HappyStk` happyRest}}--happyReduce_16 = happySpecReduce_1  1# happyReduction_16-happyReduction_16 happy_x_1-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> -	happyIn7-		 (RealDecl happy_var_1-	)}--happyReduce_17 = happyReduce 6# 1# happyReduction_17-happyReduction_17 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut41 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_5 of { happy_var_5 -> -	happyIn7-		 (RealDecl (SynDef happy_var_2 happy_var_3 happy_var_5)-	) `HappyStk` happyRest}}}--happyReduce_18 = happyReduce 5# 1# happyReduction_18-happyReduction_18 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn7-		 (RealDecl (SynDef happy_var_2 [] (RVar happy_var_3 happy_var_4 (mkhidden happy_var_2) Unknown))-	) `HappyStk` happyRest}}}--happyReduce_19 = happySpecReduce_2  1# happyReduction_19-happyReduction_19 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> -	happyIn7-		 (RealDecl (CInclude happy_var_2)-	)}--happyReduce_20 = happySpecReduce_2  1# happyReduction_20-happyReduction_20 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> -	happyIn7-		 (RealDecl (CLib happy_var_2)-	)}--happyReduce_21 = happyReduce 5# 2# happyReduction_21-happyReduction_21 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn8-		 (Transform happy_var_2 happy_var_4-	) `HappyStk` happyRest}}--happyReduce_22 = happyReduce 7# 3# happyReduction_22-happyReduction_22 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut50 happy_x_3 of { happy_var_3 -> -	case happyOut15 happy_x_5 of { happy_var_5 -> -	case happyOut83 happy_x_6 of { happy_var_6 -> -	case happyOut82 happy_x_7 of { happy_var_7 -> -	happyIn9-		 (FunType happy_var_1 happy_var_3 (nub happy_var_5) happy_var_6 happy_var_7-	) `HappyStk` happyRest}}}}}--happyReduce_23 = happySpecReduce_3  3# happyReduction_23-happyReduction_23 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut79 happy_x_2 of { happy_var_2 -> -	happyIn9-		 (ProofScript happy_var_1 happy_var_2-	)}}--happyReduce_24 = happyReduce 9# 3# happyReduction_24-happyReduction_24 (happy_x_9 `HappyStk`-	happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut24 happy_x_1 of { happy_var_1 -> -	case happyOut12 happy_x_2 of { happy_var_2 -> -	case happyOut11 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut14 happy_x_6 of { happy_var_6 -> -	case happyOut83 happy_x_8 of { happy_var_8 -> -	case happyOut82 happy_x_9 of { happy_var_9 -> -	happyIn9-		 (WithClause (mkDef happy_var_8 happy_var_9 happy_var_1) happy_var_2 happy_var_3 happy_var_4 happy_var_6-	) `HappyStk` happyRest}}}}}}}--happyReduce_25 = happyReduce 10# 3# happyReduction_25-happyReduction_25 (happy_x_10 `HappyStk`-	happy_x_9 `HappyStk`-	happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut24 happy_x_1 of { happy_var_1 -> -	case happyOut12 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut32 happy_x_7 of { happy_var_7 -> -	case happyOut83 happy_x_9 of { happy_var_9 -> -	case happyOut82 happy_x_10 of { happy_var_10 -> -	happyIn9-		 (FunClauseP (mkDef happy_var_9 happy_var_10 happy_var_1) happy_var_2 happy_var_4 happy_var_7-	) `HappyStk` happyRest}}}}}}--happyReduce_26 = happyReduce 8# 3# happyReduction_26-happyReduction_26 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut24 happy_x_1 of { happy_var_1 -> -	case happyOut12 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut15 happy_x_6 of { happy_var_6 -> -	case happyOut83 happy_x_7 of { happy_var_7 -> -	case happyOut82 happy_x_8 of { happy_var_8 -> -	happyIn9-		 (FunClause (mkDef happy_var_7 happy_var_8 happy_var_1) happy_var_2 happy_var_4 (nub happy_var_6)-	) `HappyStk` happyRest}}}}}}--happyReduce_27 = happyReduce 5# 3# happyReduction_27-happyReduction_27 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut13 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn9-		 (FunClause RPlaceholder [happy_var_2] happy_var_4 []-	) `HappyStk` happyRest}}--happyReduce_28 = happyReduce 8# 3# happyReduction_28-happyReduction_28 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut13 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut32 happy_x_7 of { happy_var_7 -> -	happyIn9-		 (FunClauseP RPlaceholder [happy_var_2] happy_var_4 happy_var_7-	) `HappyStk` happyRest}}}--happyReduce_29 = happyReduce 7# 3# happyReduction_29-happyReduction_29 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut13 happy_x_2 of { happy_var_2 -> -	case happyOut11 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut14 happy_x_6 of { happy_var_6 -> -	happyIn9-		 (WithClause RPlaceholder [happy_var_2] happy_var_3 happy_var_4 happy_var_6-	) `HappyStk` happyRest}}}}--happyReduce_30 = happySpecReduce_1  4# happyReduction_30-happyReduction_30 happy_x_1-	 =  happyIn10-		 (Vis Public-	)--happyReduce_31 = happySpecReduce_1  4# happyReduction_31-happyReduction_31 happy_x_1-	 =  happyIn10-		 (Vis Private-	)--happyReduce_32 = happySpecReduce_1  4# happyReduction_32-happyReduction_32 happy_x_1-	 =  happyIn10-		 (Vis Abstract-	)--happyReduce_33 = happySpecReduce_0  4# happyReduction_33-happyReduction_33  =  happyIn10-		 (Vis Public-	)--happyReduce_34 = happySpecReduce_1  5# happyReduction_34-happyReduction_34 happy_x_1-	 =  happyIn11-		 (False-	)--happyReduce_35 = happySpecReduce_2  5# happyReduction_35-happyReduction_35 happy_x_2-	happy_x_1-	 =  happyIn11-		 (True-	)--happyReduce_36 = happySpecReduce_3  6# happyReduction_36-happyReduction_36 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut13 happy_x_2 of { happy_var_2 -> -	case happyOut12 happy_x_3 of { happy_var_3 -> -	happyIn12-		 (happy_var_2:happy_var_3-	)}}--happyReduce_37 = happySpecReduce_0  6# happyReduction_37-happyReduction_37  =  happyIn12-		 ([]-	)--happyReduce_38 = happySpecReduce_1  7# happyReduction_38-happyReduction_38 happy_x_1-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> -	happyIn13-		 (happy_var_1-	)}--happyReduce_39 = happySpecReduce_1  7# happyReduction_39-happyReduction_39 happy_x_1-	 =  case happyOut58 happy_x_1 of { happy_var_1 -> -	happyIn13-		 (happy_var_1-	)}--happyReduce_40 = happySpecReduce_3  7# happyReduction_40-happyReduction_40 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn13-		 (happy_var_2-	)}--happyReduce_41 = happyReduce 5# 7# happyReduction_41-happyReduction_41 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut59 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn13-		 (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "mkPair") Unknown) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_42 = happySpecReduce_2  8# happyReduction_42-happyReduction_42 happy_x_2-	happy_x_1-	 =  case happyOut9 happy_x_1 of { happy_var_1 -> -	case happyOut14 happy_x_2 of { happy_var_2 -> -	happyIn14-		 (happy_var_1:happy_var_2-	)}}--happyReduce_43 = happySpecReduce_1  8# happyReduction_43-happyReduction_43 happy_x_1-	 =  case happyOut9 happy_x_1 of { happy_var_1 -> -	happyIn14-		 ([happy_var_1]-	)}--happyReduce_44 = happySpecReduce_3  9# happyReduction_44-happyReduction_44 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut16 happy_x_2 of { happy_var_2 -> -	happyIn15-		 (happy_var_2-	)}--happyReduce_45 = happySpecReduce_0  9# happyReduction_45-happyReduction_45  =  happyIn15-		 ([]-	)--happyReduce_46 = happySpecReduce_0  10# happyReduction_46-happyReduction_46  =  happyIn16-		 ([]-	)--happyReduce_47 = happySpecReduce_2  10# happyReduction_47-happyReduction_47 happy_x_2-	happy_x_1-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> -	case happyOut16 happy_x_2 of { happy_var_2 -> -	happyIn16-		 (happy_var_1 ++ happy_var_2-	)}}--happyReduce_48 = happySpecReduce_1  11# happyReduction_48-happyReduction_48 happy_x_1-	 =  happyIn17-		 ([NoCG]-	)--happyReduce_49 = happySpecReduce_1  11# happyReduction_49-happyReduction_49 happy_x_1-	 =  happyIn17-		 ([CGEval, Inline]-	)--happyReduce_50 = happyReduce 4# 11# happyReduction_50-happyReduction_50 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut39 happy_x_3 of { happy_var_3 -> -	happyIn17-		 ([CGSpec happy_var_3]-	) `HappyStk` happyRest}--happyReduce_51 = happySpecReduce_1  11# happyReduction_51-happyReduction_51 happy_x_1-	 =  happyIn17-		 ([CGSpec []]-	)--happyReduce_52 = happySpecReduce_1  11# happyReduction_52-happyReduction_52 happy_x_1-	 =  happyIn17-		 ([Inline]-	)--happyReduce_53 = happySpecReduce_2  11# happyReduction_53-happyReduction_53 happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_2 of { (TokenString happy_var_2) -> -	happyIn17-		 ([CExport happy_var_2]-	)}--happyReduce_54 = happyReduce 4# 12# happyReduction_54-happyReduction_54 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut21 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> -	case happyOut19 happy_x_3 of { happy_var_3 -> -	happyIn18-		 (map (\x -> Fixity x happy_var_1 happy_var_2) happy_var_3-	) `HappyStk` happyRest}}}--happyReduce_55 = happySpecReduce_1  13# happyReduction_55-happyReduction_55 happy_x_1-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> -	happyIn19-		 ([happy_var_1]-	)}--happyReduce_56 = happySpecReduce_3  13# happyReduction_56-happyReduction_56 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> -	case happyOut19 happy_x_3 of { happy_var_3 -> -	happyIn19-		 (happy_var_1:happy_var_3-	)}}--happyReduce_57 = happySpecReduce_1  14# happyReduction_57-happyReduction_57 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenInfixName happy_var_1) -> -	happyIn20-		 (happy_var_1-	)}--happyReduce_58 = happySpecReduce_1  14# happyReduction_58-happyReduction_58 happy_x_1-	 =  happyIn20-		 ("-"-	)--happyReduce_59 = happySpecReduce_1  14# happyReduction_59-happyReduction_59 happy_x_1-	 =  happyIn20-		 ("<"-	)--happyReduce_60 = happySpecReduce_1  14# happyReduction_60-happyReduction_60 happy_x_1-	 =  happyIn20-		 (">"-	)--happyReduce_61 = happySpecReduce_1  15# happyReduction_61-happyReduction_61 happy_x_1-	 =  happyIn21-		 (LeftAssoc-	)--happyReduce_62 = happySpecReduce_1  15# happyReduction_62-happyReduction_62 happy_x_1-	 =  happyIn21-		 (RightAssoc-	)--happyReduce_63 = happySpecReduce_1  15# happyReduction_63-happyReduction_63 happy_x_1-	 =  happyIn21-		 (NonAssoc-	)--happyReduce_64 = happyReduce 4# 16# happyReduction_64-happyReduction_64 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut23 happy_x_3 of { happy_var_3 -> -	happyIn22-		 (LatexDefs happy_var_3-	) `HappyStk` happyRest}--happyReduce_65 = happySpecReduce_3  17# happyReduction_65-happyReduction_65 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_3 of { (TokenString happy_var_3) -> -	happyIn23-		 ([(happy_var_1,happy_var_3)]-	)}}--happyReduce_66 = happyReduce 5# 17# happyReduction_66-happyReduction_66 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_3 of { (TokenString happy_var_3) -> -	case happyOut23 happy_x_5 of { happy_var_5 -> -	happyIn23-		 ((happy_var_1,happy_var_3):happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_67 = happySpecReduce_2  18# happyReduction_67-happyReduction_67 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut25 happy_x_2 of { happy_var_2 -> -	happyIn24-		 ((happy_var_1, happy_var_2)-	)}}--happyReduce_68 = happySpecReduce_0  19# happyReduction_68-happyReduction_68  =  happyIn25-		 ([]-	)--happyReduce_69 = happySpecReduce_2  19# happyReduction_69-happyReduction_69 happy_x_2-	happy_x_1-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> -	case happyOut25 happy_x_2 of { happy_var_2 -> -	happyIn25-		 ((happy_var_1,Nothing):happy_var_2-	)}}--happyReduce_70 = happyReduce 5# 19# happyReduction_70-happyReduction_70 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut25 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn25-		 ((RVar happy_var_4 happy_var_5 happy_var_1 Unknown, Just happy_var_1):happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_71 = happyReduce 5# 19# happyReduction_71-happyReduction_71 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut25 happy_x_5 of { happy_var_5 -> -	happyIn25-		 ((happy_var_3, Just happy_var_1):happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_72 = happyReduce 6# 20# happyReduction_72-happyReduction_72 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut27 happy_x_1 of { happy_var_1 -> -	case happyOut29 happy_x_2 of { happy_var_2 -> -	case happyOut32 happy_x_3 of { happy_var_3 -> -	case happyOut28 happy_x_4 of { happy_var_4 -> -	case happyOut83 happy_x_5 of { happy_var_5 -> -	case happyOut82 happy_x_6 of { happy_var_6 -> -	happyIn26-		 (mkDatatype happy_var_1 happy_var_5 happy_var_6 happy_var_3 happy_var_4 happy_var_2-	) `HappyStk` happyRest}}}}}}--happyReduce_73 = happySpecReduce_1  21# happyReduction_73-happyReduction_73 happy_x_1-	 =  happyIn27-		 (False-	)--happyReduce_74 = happySpecReduce_1  21# happyReduction_74-happyReduction_74 happy_x_1-	 =  happyIn27-		 (True-	)--happyReduce_75 = happySpecReduce_3  22# happyReduction_75-happyReduction_75 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut66 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_2 of { happy_var_2 -> -	happyIn28-		 (Right (happy_var_1,happy_var_2)-	)}}--happyReduce_76 = happySpecReduce_3  22# happyReduction_76-happyReduction_76 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_2 of { happy_var_2 -> -	happyIn28-		 (Left happy_var_2-	)}--happyReduce_77 = happySpecReduce_3  22# happyReduction_77-happyReduction_77 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn28-		 (Left (RConst happy_var_2 happy_var_3 TYPE)-	)}}--happyReduce_78 = happySpecReduce_0  23# happyReduction_78-happyReduction_78  =  happyIn29-		 ([]-	)--happyReduce_79 = happySpecReduce_3  23# happyReduction_79-happyReduction_79 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut30 happy_x_2 of { happy_var_2 -> -	happyIn29-		 (happy_var_2-	)}--happyReduce_80 = happySpecReduce_1  24# happyReduction_80-happyReduction_80 happy_x_1-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> -	happyIn30-		 ([happy_var_1]-	)}--happyReduce_81 = happySpecReduce_3  24# happyReduction_81-happyReduction_81 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> -	case happyOut30 happy_x_3 of { happy_var_3 -> -	happyIn30-		 (happy_var_1:happy_var_3-	)}}--happyReduce_82 = happySpecReduce_1  25# happyReduction_82-happyReduction_82 happy_x_1-	 =  happyIn31-		 (NoElim-	)--happyReduce_83 = happySpecReduce_1  25# happyReduction_83-happyReduction_83 happy_x_1-	 =  happyIn31-		 (Collapsible-	)--happyReduce_84 = happySpecReduce_1  26# happyReduction_84-happyReduction_84 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenName happy_var_1) -> -	happyIn32-		 (happy_var_1-	)}--happyReduce_85 = happySpecReduce_3  26# happyReduction_85-happyReduction_85 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut20 happy_x_2 of { happy_var_2 -> -	happyIn32-		 (useropFn happy_var_2-	)}--happyReduce_86 = happyReduce 4# 27# happyReduction_86-happyReduction_86 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut33 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	case happyOut57 happy_x_4 of { happy_var_4 -> -	happyIn33-		 (RApp happy_var_2 happy_var_3 happy_var_1 happy_var_4-	) `HappyStk` happyRest}}}}--happyReduce_87 = happyReduce 5# 27# happyReduction_87-happyReduction_87 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut33 happy_x_1 of { happy_var_1 -> -	case happyOut43 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn33-		 (RAppImp happy_var_4 happy_var_5 (fst happy_var_2) happy_var_1 (snd happy_var_2)-	) `HappyStk` happyRest}}}}--happyReduce_88 = happySpecReduce_3  27# happyReduction_88-happyReduction_88 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (RVar happy_var_2 happy_var_3 happy_var_1 Unknown-	)}}}--happyReduce_89 = happySpecReduce_3  27# happyReduction_89-happyReduction_89 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (RConst happy_var_2 happy_var_3 happy_var_1-	)}}}--happyReduce_90 = happySpecReduce_1  27# happyReduction_90-happyReduction_90 happy_x_1-	 =  happyIn33-		 (RPlaceholder-	)--happyReduce_91 = happySpecReduce_3  27# happyReduction_91-happyReduction_91 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (RVar happy_var_2 happy_var_3 (UN "__Empty") TypeCon-	)}}--happyReduce_92 = happySpecReduce_3  27# happyReduction_92-happyReduction_92 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn33-		 (RVar happy_var_2 happy_var_3 (UN "__Unit") TypeCon-	)}}--happyReduce_93 = happySpecReduce_1  28# happyReduction_93-happyReduction_93 happy_x_1-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> -	happyIn34-		 (happy_var_1-	)}--happyReduce_94 = happySpecReduce_3  28# happyReduction_94-happyReduction_94 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_2 of { happy_var_2 -> -	happyIn34-		 (happy_var_2-	)}--happyReduce_95 = happyReduce 4# 28# happyReduction_95-happyReduction_95 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	case happyOut57 happy_x_4 of { happy_var_4 -> -	happyIn34-		 (RApp happy_var_2 happy_var_3 happy_var_1 happy_var_4-	) `HappyStk` happyRest}}}}--happyReduce_96 = happyReduce 5# 28# happyReduction_96-happyReduction_96 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut43 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn34-		 (RAppImp happy_var_4 happy_var_5 (fst happy_var_2) happy_var_1 (snd happy_var_2)-	) `HappyStk` happyRest}}}}--happyReduce_97 = happyReduce 4# 28# happyReduction_97-happyReduction_97 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn34-		 (RApp happy_var_3 happy_var_4 (RApp happy_var_3 happy_var_4 (RVar happy_var_3 happy_var_4 (UN "__lazy") Free) RPlaceholder) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_98 = happyReduce 4# 28# happyReduction_98-happyReduction_98 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut35 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn34-		 (doBind Lam happy_var_2 happy_var_4-	) `HappyStk` happyRest}}--happyReduce_99 = happyReduce 4# 28# happyReduction_99-happyReduction_99 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut42 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn34-		 (doLetBind happy_var_2 happy_var_4-	) `HappyStk` happyRest}}--happyReduce_100 = happySpecReduce_1  28# happyReduction_100-happyReduction_100 happy_x_1-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> -	happyIn34-		 (happy_var_1-	)}--happyReduce_101 = happyReduce 8# 28# happyReduction_101-happyReduction_101 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut34 happy_x_6 of { happy_var_6 -> -	case happyOut83 happy_x_7 of { happy_var_7 -> -	case happyOut82 happy_x_8 of { happy_var_8 -> -	happyIn34-		 (mkApp happy_var_7 happy_var_8 (RVar happy_var_7 happy_var_8 (UN "if_then_else") Free) [happy_var_2,happy_var_4,happy_var_6]-	) `HappyStk` happyRest}}}}}--happyReduce_102 = happySpecReduce_2  29# happyReduction_102-happyReduction_102 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	happyIn35-		 ([(happy_var_1,happy_var_2)]-	)}}--happyReduce_103 = happyReduce 4# 29# happyReduction_103-happyReduction_103 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	case happyOut35 happy_x_4 of { happy_var_4 -> -	happyIn35-		 ((happy_var_1,happy_var_2):happy_var_4-	) `HappyStk` happyRest}}}--happyReduce_104 = happySpecReduce_3  30# happyReduction_104-happyReduction_104 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> -	case happyOut36 happy_x_3 of { happy_var_3 -> -	happyIn36-		 (happy_var_1 ++ happy_var_3-	)}}--happyReduce_105 = happySpecReduce_1  30# happyReduction_105-happyReduction_105 happy_x_1-	 =  case happyOut37 happy_x_1 of { happy_var_1 -> -	happyIn36-		 (happy_var_1-	)}--happyReduce_106 = happySpecReduce_3  31# happyReduction_106-happyReduction_106 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut50 happy_x_3 of { happy_var_3 -> -	happyIn37-		 (map ( \x -> (x,happy_var_3)) [happy_var_1]-	)}}--happyReduce_107 = happySpecReduce_1  32# happyReduction_107-happyReduction_107 happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	happyIn38-		 ([happy_var_1]-	)}--happyReduce_108 = happySpecReduce_3  32# happyReduction_108-happyReduction_108 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut38 happy_x_3 of { happy_var_3 -> -	happyIn38-		 (happy_var_1:happy_var_3-	)}}--happyReduce_109 = happySpecReduce_2  33# happyReduction_109-happyReduction_109 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> -	happyIn39-		 ([(happy_var_1,happy_var_2)]-	)}}--happyReduce_110 = happySpecReduce_1  33# happyReduction_110-happyReduction_110 happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	happyIn39-		 ([(happy_var_1, 0)]-	)}--happyReduce_111 = happySpecReduce_3  33# happyReduction_111-happyReduction_111 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut39 happy_x_3 of { happy_var_3 -> -	happyIn39-		 ((happy_var_1,0):happy_var_3-	)}}--happyReduce_112 = happyReduce 4# 33# happyReduction_112-happyReduction_112 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInt happy_var_2) -> -	case happyOut39 happy_x_4 of { happy_var_4 -> -	happyIn39-		 ((happy_var_1,happy_var_2):happy_var_4-	) `HappyStk` happyRest}}}--happyReduce_113 = happySpecReduce_1  34# happyReduction_113-happyReduction_113 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	happyIn40-		 ([happy_var_1]-	)}--happyReduce_114 = happySpecReduce_3  34# happyReduction_114-happyReduction_114 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut38 happy_x_3 of { happy_var_3 -> -	happyIn40-		 (happy_var_1:happy_var_3-	)}}--happyReduce_115 = happySpecReduce_0  35# happyReduction_115-happyReduction_115  =  happyIn41-		 ([]-	)--happyReduce_116 = happySpecReduce_2  35# happyReduction_116-happyReduction_116 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut41 happy_x_2 of { happy_var_2 -> -	happyIn41-		 (happy_var_1:happy_var_2-	)}}--happyReduce_117 = happyReduce 4# 36# happyReduction_117-happyReduction_117 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	happyIn42-		 ([(happy_var_1,happy_var_2,happy_var_4)]-	) `HappyStk` happyRest}}}--happyReduce_118 = happyReduce 6# 36# happyReduction_118-happyReduction_118 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut42 happy_x_6 of { happy_var_6 -> -	happyIn42-		 ((happy_var_1,happy_var_2,happy_var_4):happy_var_6-	) `HappyStk` happyRest}}}}--happyReduce_119 = happySpecReduce_3  37# happyReduction_119-happyReduction_119 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn43-		 ((happy_var_1, RVar happy_var_2 happy_var_3 happy_var_1 Unknown)-	)}}}--happyReduce_120 = happySpecReduce_3  37# happyReduction_120-happyReduction_120 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBrackName happy_var_1) -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn43-		 ((happy_var_1, happy_var_3)-	)}}--happyReduce_121 = happyReduce 4# 38# happyReduction_121-happyReduction_121 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn44-		 (RInfix happy_var_3 happy_var_4 Minus (RConst happy_var_3 happy_var_4 (Num 0)) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_122 = happyReduce 5# 38# happyReduction_122-happyReduction_122 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (RUserInfix happy_var_4 happy_var_5 False "-" happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_123 = happyReduce 5# 38# happyReduction_123-happyReduction_123 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (mkApp happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "Pair") TypeCon) [happy_var_1, happy_var_3]-	) `HappyStk` happyRest}}}}--happyReduce_124 = happyReduce 5# 38# happyReduction_124-happyReduction_124 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (RUserInfix happy_var_4 happy_var_5 False "<" happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_125 = happyReduce 5# 38# happyReduction_125-happyReduction_125 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (RUserInfix happy_var_4 happy_var_5 False ">" happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_126 = happyReduce 5# 38# happyReduction_126-happyReduction_126 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn44-		 (RBind (MN "X" 0) (Pi Ex [] happy_var_1) happy_var_3-	) `HappyStk` happyRest}}--happyReduce_127 = happySpecReduce_1  38# happyReduction_127-happyReduction_127 happy_x_1-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> -	happyIn44-		 (happy_var_1-	)}--happyReduce_128 = happyReduce 5# 38# happyReduction_128-happyReduction_128 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut57 happy_x_1 of { happy_var_1 -> -	case happyOut57 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn44-		 (RInfix happy_var_4 happy_var_5 JMEq happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_129 = happyReduce 5# 39# happyReduction_129-happyReduction_129 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInfixName happy_var_2) -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn45-		 (RUserInfix happy_var_4 happy_var_5 False happy_var_2 happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}}--happyReduce_130 = happyReduce 6# 40# happyReduction_130-happyReduction_130 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { (TokenInfixName happy_var_2) -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown) happy_var_3)-	) `HappyStk` happyRest}}}}--happyReduce_131 = happyReduce 6# 40# happyReduction_131-happyReduction_131 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_3 of { (TokenInfixName happy_var_3) -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False happy_var_3 happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown))-	) `HappyStk` happyRest}}}}--happyReduce_132 = happyReduce 6# 40# happyReduction_132-happyReduction_132 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut47 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown) happy_var_3)-	) `HappyStk` happyRest}}}}--happyReduce_133 = happyReduce 6# 40# happyReduction_133-happyReduction_133 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut47 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False happy_var_3 happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown))-	) `HappyStk` happyRest}}}}--happyReduce_134 = happyReduce 6# 40# happyReduction_134-happyReduction_134 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RUserInfix happy_var_4 happy_var_5 False "-" happy_var_2 (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown))-	) `HappyStk` happyRest}}}--happyReduce_135 = happyReduce 6# 40# happyReduction_135-happyReduction_135 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RBind (MN "X" 1) (Pi Ex [] happy_var_2) (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown))-	) `HappyStk` happyRest}}}--happyReduce_136 = happyReduce 6# 40# happyReduction_136-happyReduction_136 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder) -                       (RBind (MN "X" 1) (Pi Ex [] (RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown)) happy_var_3)-	) `HappyStk` happyRest}}}--happyReduce_137 = happyReduce 5# 40# happyReduction_137-happyReduction_137 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder)-                       (RBind (MN "X" 1) (Lam RPlaceholder)-                    (RBind (MN "X" 2) (Pi Ex [] (RVar happy_var_3 happy_var_4 (MN "X" 0) Unknown))-                       (RVar happy_var_3 happy_var_4 (MN "X" 1) Unknown)))-	) `HappyStk` happyRest}}--happyReduce_138 = happyReduce 5# 40# happyReduction_138-happyReduction_138 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder)-                   (RBind (MN "X" 1) (Lam RPlaceholder)-                       (pairDesugar happy_var_3 happy_var_4 (RVar happy_var_3 happy_var_4 (UN "mkPair") DataCon)-                                    [RVar happy_var_3 happy_var_4 (MN "X" 0) Unknown,-                                     RVar happy_var_3 happy_var_4 (MN "X" 1) Unknown]))-	) `HappyStk` happyRest}}--happyReduce_139 = happyReduce 6# 40# happyReduction_139-happyReduction_139 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder)-                       (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "mkPair") DataCon)-                                    [happy_var_2,-                                     RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown])-	) `HappyStk` happyRest}}}--happyReduce_140 = happyReduce 6# 40# happyReduction_140-happyReduction_140 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn46-		 (RBind (MN "X" 0) (Lam RPlaceholder)-                       (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "mkPair") DataCon)-                                    [RVar happy_var_4 happy_var_5 (MN "X" 0) Unknown, happy_var_3])-	) `HappyStk` happyRest}}}--happyReduce_141 = happySpecReduce_1  41# happyReduction_141-happyReduction_141 happy_x_1-	 =  happyIn47-		 ("<"-	)--happyReduce_142 = happySpecReduce_1  41# happyReduction_142-happyReduction_142 happy_x_1-	 =  happyIn47-		 (">"-	)--happyReduce_143 = happySpecReduce_0  42# happyReduction_143-happyReduction_143  =  happyIn48-		 (RPlaceholder-	)--happyReduce_144 = happySpecReduce_2  42# happyReduction_144-happyReduction_144 happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_2 of { happy_var_2 -> -	happyIn48-		 (happy_var_2-	)}--happyReduce_145 = happySpecReduce_0  43# happyReduction_145-happyReduction_145  =  happyIn49-		 (RPlaceholder-	)--happyReduce_146 = happySpecReduce_2  43# happyReduction_146-happyReduction_146 happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_2 of { happy_var_2 -> -	happyIn49-		 (happy_var_2-	)}--happyReduce_147 = happyReduce 5# 44# happyReduction_147-happyReduction_147 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut40 happy_x_1 of { happy_var_1 -> -	case happyOut49 happy_x_2 of { happy_var_2 -> -	case happyOut50 happy_x_5 of { happy_var_5 -> -	happyIn50-		 (doBind (Pi Im []) (map (\x -> (x, happy_var_2)) happy_var_1) happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_148 = happySpecReduce_1  44# happyReduction_148-happyReduction_148 happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	happyIn50-		 (happy_var_1-	)}--happyReduce_149 = happySpecReduce_3  45# happyReduction_149-happyReduction_149 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut51 happy_x_3 of { happy_var_3 -> -	happyIn51-		 (RBind (MN "X" 0) (Pi Ex [] happy_var_1) happy_var_3-	)}}--happyReduce_150 = happyReduce 6# 45# happyReduction_150-happyReduction_150 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut36 happy_x_2 of { happy_var_2 -> -	case happyOut53 happy_x_4 of { happy_var_4 -> -	case happyOut51 happy_x_6 of { happy_var_6 -> -	happyIn51-		 (doBind (Pi Ex happy_var_4) happy_var_2 happy_var_6-	) `HappyStk` happyRest}}}--happyReduce_151 = happyReduce 5# 45# happyReduction_151-happyReduction_151 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut36 happy_x_2 of { happy_var_2 -> -	case happyOut51 happy_x_5 of { happy_var_5 -> -	happyIn51-		 (doBind (Pi Ex [Lazy]) happy_var_2 happy_var_5-	) `HappyStk` happyRest}}--happyReduce_152 = happySpecReduce_3  45# happyReduction_152-happyReduction_152 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_2 of { happy_var_2 -> -	happyIn51-		 (bracket happy_var_2-	)}--happyReduce_153 = happyReduce 7# 45# happyReduction_153-happyReduction_153 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut51 happy_x_2 of { happy_var_2 -> -	case happyOut51 happy_x_4 of { happy_var_4 -> -	case happyOut83 happy_x_5 of { happy_var_5 -> -	case happyOut82 happy_x_6 of { happy_var_6 -> -	happyIn51-		 (RInfix happy_var_5 happy_var_6 JMEq happy_var_2 happy_var_4-	) `HappyStk` happyRest}}}}--happyReduce_154 = happySpecReduce_1  45# happyReduction_154-happyReduction_154 happy_x_1-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> -	happyIn51-		 (happy_var_1-	)}--happyReduce_155 = happySpecReduce_3  45# happyReduction_155-happyReduction_155 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn51-		 (happy_var_2-	)}--happyReduce_156 = happyReduce 5# 45# happyReduction_156-happyReduction_156 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { (TokenInfixName happy_var_2) -> -	case happyOut51 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn51-		 (RUserInfix happy_var_4 happy_var_5 False happy_var_2 happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}}--happyReduce_157 = happyReduce 5# 45# happyReduction_157-happyReduction_157 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut51 happy_x_3 of { happy_var_3 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn51-		 (RUserInfix happy_var_4 happy_var_5 False "-" happy_var_1 happy_var_3-	) `HappyStk` happyRest}}}}--happyReduce_158 = happyReduce 5# 45# happyReduction_158-happyReduction_158 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut56 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn51-		 (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "Pair") TypeCon) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_159 = happySpecReduce_1  45# happyReduction_159-happyReduction_159 happy_x_1-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> -	happyIn51-		 (happy_var_1-	)}--happyReduce_160 = happySpecReduce_1  46# happyReduction_160-happyReduction_160 happy_x_1-	 =  happyIn52-		 (Lazy-	)--happyReduce_161 = happySpecReduce_1  46# happyReduction_161-happyReduction_161 happy_x_1-	 =  happyIn52-		 (Static-	)--happyReduce_162 = happySpecReduce_3  47# happyReduction_162-happyReduction_162 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut54 happy_x_2 of { happy_var_2 -> -	happyIn53-		 (happy_var_2-	)}--happyReduce_163 = happySpecReduce_0  47# happyReduction_163-happyReduction_163  =  happyIn53-		 ([]-	)--happyReduce_164 = happySpecReduce_3  48# happyReduction_164-happyReduction_164 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> -	case happyOut54 happy_x_3 of { happy_var_3 -> -	happyIn54-		 (happy_var_1:happy_var_3-	)}}--happyReduce_165 = happySpecReduce_1  48# happyReduction_165-happyReduction_165 happy_x_1-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> -	happyIn54-		 ([happy_var_1]-	)}--happyReduce_166 = happyReduce 8# 49# happyReduction_166-happyReduction_166 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut48 happy_x_3 of { happy_var_3 -> -	case happyOut51 happy_x_5 of { happy_var_5 -> -	case happyOut83 happy_x_7 of { happy_var_7 -> -	case happyOut82 happy_x_8 of { happy_var_8 -> -	happyIn55-		 (sigDesugar happy_var_7 happy_var_8 (happy_var_2, happy_var_3) happy_var_5-	) `HappyStk` happyRest}}}}}--happyReduce_167 = happySpecReduce_3  50# happyReduction_167-happyReduction_167 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut51 happy_x_3 of { happy_var_3 -> -	happyIn56-		 (happy_var_1:happy_var_3:[]-	)}}--happyReduce_168 = happySpecReduce_3  50# happyReduction_168-happyReduction_168 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut51 happy_x_1 of { happy_var_1 -> -	case happyOut56 happy_x_3 of { happy_var_3 -> -	happyIn56-		 (happy_var_1:happy_var_3-	)}}--happyReduce_169 = happySpecReduce_3  51# happyReduction_169-happyReduction_169 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RVar happy_var_2 happy_var_3 happy_var_1 Unknown-	)}}}--happyReduce_170 = happySpecReduce_3  51# happyReduction_170-happyReduction_170 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RReturn happy_var_2 happy_var_3-	)}}--happyReduce_171 = happySpecReduce_3  51# happyReduction_171-happyReduction_171 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn57-		 (bracket happy_var_2-	)}--happyReduce_172 = happySpecReduce_2  51# happyReduction_172-happyReduction_172 happy_x_2-	happy_x_1-	 =  case happyOut57 happy_x_2 of { happy_var_2 -> -	happyIn57-		 (RPure happy_var_2-	)}--happyReduce_173 = happySpecReduce_1  51# happyReduction_173-happyReduction_173 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenMetavar happy_var_1) -> -	happyIn57-		 (RMetavar happy_var_1-	)}--happyReduce_174 = happyReduce 4# 51# happyReduction_174-happyReduction_174 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RMetavarPrf (UN "") happy_var_3 False-	) `HappyStk` happyRest}--happyReduce_175 = happyReduce 4# 51# happyReduction_175-happyReduction_175 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RMetavarPrf (UN "") happy_var_3 True-	) `HappyStk` happyRest}--happyReduce_176 = happyReduce 4# 51# happyReduction_176-happyReduction_176 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn57-		 (RExpVar happy_var_3 happy_var_4 happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_177 = happySpecReduce_3  51# happyReduction_177-happyReduction_177 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RConst happy_var_2 happy_var_3 happy_var_1-	)}}}--happyReduce_178 = happySpecReduce_1  51# happyReduction_178-happyReduction_178 happy_x_1-	 =  happyIn57-		 (RRefl-	)--happyReduce_179 = happySpecReduce_3  51# happyReduction_179-happyReduction_179 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RVar happy_var_2 happy_var_3 (UN "__Empty") TypeCon-	)}}--happyReduce_180 = happySpecReduce_3  51# happyReduction_180-happyReduction_180 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn57-		 (RVar happy_var_2 happy_var_3 (UN "__Unit") TypeCon-	)}}--happyReduce_181 = happySpecReduce_1  51# happyReduction_181-happyReduction_181 happy_x_1-	 =  happyIn57-		 (RPlaceholder-	)--happyReduce_182 = happySpecReduce_1  51# happyReduction_182-happyReduction_182 happy_x_1-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> -	happyIn57-		 (RDo happy_var_1-	)}--happyReduce_183 = happySpecReduce_3  51# happyReduction_183-happyReduction_183 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn57-		 (RIdiom happy_var_2-	)}--happyReduce_184 = happyReduce 5# 51# happyReduction_184-happyReduction_184 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut59 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn57-		 (pairDesugar happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "mkPair") DataCon) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_185 = happySpecReduce_1  51# happyReduction_185-happyReduction_185 happy_x_1-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> -	happyIn57-		 (happy_var_1-	)}--happyReduce_186 = happySpecReduce_1  51# happyReduction_186-happyReduction_186 happy_x_1-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> -	happyIn57-		 (happy_var_1-	)}--happyReduce_187 = happySpecReduce_1  51# happyReduction_187-happyReduction_187 happy_x_1-	 =  case happyOut58 happy_x_1 of { happy_var_1 -> -	happyIn57-		 (happy_var_1-	)}--happyReduce_188 = happyReduce 5# 51# happyReduction_188-happyReduction_188 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	case happyOut60 happy_x_4 of { happy_var_4 -> -	happyIn57-		 (mkConsList happy_var_2 happy_var_3 happy_var_4-	) `HappyStk` happyRest}}}--happyReduce_189 = happyReduce 7# 52# happyReduction_189-happyReduction_189 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut83 happy_x_6 of { happy_var_6 -> -	case happyOut82 happy_x_7 of { happy_var_7 -> -	happyIn58-		 (RApp happy_var_6 happy_var_7 (RApp happy_var_6 happy_var_7 (RVar happy_var_6 happy_var_7 (UN "Exists") DataCon) happy_var_2) happy_var_4-	) `HappyStk` happyRest}}}}--happyReduce_190 = happyReduce 5# 52# happyReduction_190-happyReduction_190 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_2 of { happy_var_2 -> -	case happyOut83 happy_x_4 of { happy_var_4 -> -	case happyOut82 happy_x_5 of { happy_var_5 -> -	happyIn58-		 (RApp happy_var_4 happy_var_5 (RApp happy_var_4 happy_var_5 (RVar happy_var_4 happy_var_5 (UN "Exists") DataCon) RPlaceholder) happy_var_2-	) `HappyStk` happyRest}}}--happyReduce_191 = happySpecReduce_3  53# happyReduction_191-happyReduction_191 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn59-		 (happy_var_1:happy_var_3:[]-	)}}--happyReduce_192 = happySpecReduce_3  53# happyReduction_192-happyReduction_192 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut59 happy_x_3 of { happy_var_3 -> -	happyIn59-		 (happy_var_1:happy_var_3-	)}}--happyReduce_193 = happySpecReduce_0  54# happyReduction_193-happyReduction_193  =  happyIn60-		 ([]-	)--happyReduce_194 = happySpecReduce_1  54# happyReduction_194-happyReduction_194 happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	happyIn60-		 ([happy_var_1]-	)}--happyReduce_195 = happySpecReduce_3  54# happyReduction_195-happyReduction_195 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut60 happy_x_3 of { happy_var_3 -> -	happyIn60-		 (happy_var_1:happy_var_3-	)}}--happyReduce_196 = happyReduce 4# 55# happyReduction_196-happyReduction_196 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut62 happy_x_3 of { happy_var_3 -> -	happyIn61-		 (happy_var_3-	) `HappyStk` happyRest}--happyReduce_197 = happyReduce 10# 55# happyReduction_197-happyReduction_197 (happy_x_10 `HappyStk`-	happy_x_9 `HappyStk`-	happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOutTok happy_x_2 of { (TokenBrackName happy_var_2) -> -	case happyOut48 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_5 of { happy_var_5 -> -	case happyOut83 happy_x_6 of { happy_var_6 -> -	case happyOut82 happy_x_7 of { happy_var_7 -> -	case happyOut62 happy_x_9 of { happy_var_9 -> -	happyIn61-		 (DoBinding happy_var_6 happy_var_7 happy_var_2 happy_var_3 happy_var_5 : happy_var_9-	) `HappyStk` happyRest}}}}}}--happyReduce_198 = happySpecReduce_2  56# happyReduction_198-happyReduction_198 happy_x_2-	happy_x_1-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> -	case happyOut62 happy_x_2 of { happy_var_2 -> -	happyIn62-		 (happy_var_1:happy_var_2-	)}}--happyReduce_199 = happySpecReduce_1  56# happyReduction_199-happyReduction_199 happy_x_1-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> -	happyIn62-		 ([happy_var_1]-	)}--happyReduce_200 = happyReduce 7# 57# happyReduction_200-happyReduction_200 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut48 happy_x_2 of { happy_var_2 -> -	case happyOut34 happy_x_4 of { happy_var_4 -> -	case happyOut83 happy_x_5 of { happy_var_5 -> -	case happyOut82 happy_x_6 of { happy_var_6 -> -	happyIn63-		 (DoBinding happy_var_5 happy_var_6 happy_var_1 happy_var_2 happy_var_4-	) `HappyStk` happyRest}}}}}--happyReduce_201 = happyReduce 8# 57# happyReduction_201-happyReduction_201 (happy_x_8 `HappyStk`-	happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_2 of { happy_var_2 -> -	case happyOut48 happy_x_3 of { happy_var_3 -> -	case happyOut34 happy_x_5 of { happy_var_5 -> -	case happyOut83 happy_x_6 of { happy_var_6 -> -	case happyOut82 happy_x_7 of { happy_var_7 -> -	happyIn63-		 (DoLet happy_var_6 happy_var_7 happy_var_2 happy_var_3 happy_var_5-	) `HappyStk` happyRest}}}}}--happyReduce_202 = happyReduce 4# 57# happyReduction_202-happyReduction_202 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut34 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn63-		 (DoExp happy_var_2 happy_var_3 happy_var_1-	) `HappyStk` happyRest}}}--happyReduce_203 = happySpecReduce_1  58# happyReduction_203-happyReduction_203 happy_x_1-	 =  happyIn64-		 (TYPE-	)--happyReduce_204 = happySpecReduce_1  58# happyReduction_204-happyReduction_204 happy_x_1-	 =  happyIn64-		 (LTYPE-	)--happyReduce_205 = happySpecReduce_1  58# happyReduction_205-happyReduction_205 happy_x_1-	 =  happyIn64-		 (StringType-	)--happyReduce_206 = happySpecReduce_1  58# happyReduction_206-happyReduction_206 happy_x_1-	 =  happyIn64-		 (IntType-	)--happyReduce_207 = happySpecReduce_1  58# happyReduction_207-happyReduction_207 happy_x_1-	 =  happyIn64-		 (CharType-	)--happyReduce_208 = happySpecReduce_1  58# happyReduction_208-happyReduction_208 happy_x_1-	 =  happyIn64-		 (FloatType-	)--happyReduce_209 = happySpecReduce_1  58# happyReduction_209-happyReduction_209 happy_x_1-	 =  happyIn64-		 (PtrType-	)--happyReduce_210 = happySpecReduce_1  58# happyReduction_210-happyReduction_210 happy_x_1-	 =  happyIn64-		 (Builtin "Handle"-	)--happyReduce_211 = happySpecReduce_1  58# happyReduction_211-happyReduction_211 happy_x_1-	 =  happyIn64-		 (Builtin "Lock"-	)--happyReduce_212 = happySpecReduce_1  58# happyReduction_212-happyReduction_212 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenInt happy_var_1) -> -	happyIn64-		 (Num happy_var_1-	)}--happyReduce_213 = happySpecReduce_1  58# happyReduction_213-happyReduction_213 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenChar happy_var_1) -> -	happyIn64-		 (Ch happy_var_1-	)}--happyReduce_214 = happySpecReduce_1  58# happyReduction_214-happyReduction_214 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenString happy_var_1) -> -	happyIn64-		 (Str happy_var_1-	)}--happyReduce_215 = happySpecReduce_1  58# happyReduction_215-happyReduction_215 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenBool happy_var_1) -> -	happyIn64-		 (Bo happy_var_1-	)}--happyReduce_216 = happySpecReduce_1  58# happyReduction_216-happyReduction_216 happy_x_1-	 =  case happyOutTok happy_x_1 of { (TokenFloat happy_var_1) -> -	happyIn64-		 (Fl happy_var_1-	)}--happyReduce_217 = happySpecReduce_0  59# happyReduction_217-happyReduction_217  =  happyIn65-		 ([]-	)--happyReduce_218 = happySpecReduce_2  59# happyReduction_218-happyReduction_218 happy_x_2-	happy_x_1-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	happyIn65-		 (happy_var_1:happy_var_2-	)}}--happyReduce_219 = happyReduce 4# 60# happyReduction_219-happyReduction_219 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut50 happy_x_2 of { happy_var_2 -> -	case happyOut67 happy_x_3 of { happy_var_3 -> -	happyIn66-		 ((happy_var_2, happy_var_3)-	) `HappyStk` happyRest}}--happyReduce_220 = happySpecReduce_3  60# happyReduction_220-happyReduction_220 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOut82 happy_x_3 of { happy_var_3 -> -	happyIn66-		 ((RConst happy_var_2 happy_var_3 TYPE, [])-	)}}--happyReduce_221 = happyReduce 4# 60# happyReduction_221-happyReduction_221 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut73 happy_x_1 of { happy_var_1 -> -	case happyOut83 happy_x_3 of { happy_var_3 -> -	case happyOut82 happy_x_4 of { happy_var_4 -> -	happyIn66-		 ((mkTyParams happy_var_3 happy_var_4 happy_var_1, [])-	) `HappyStk` happyRest}}}--happyReduce_222 = happySpecReduce_0  61# happyReduction_222-happyReduction_222  =  happyIn67-		 ([]-	)--happyReduce_223 = happyReduce 4# 61# happyReduction_223-happyReduction_223 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut72 happy_x_3 of { happy_var_3 -> -	happyIn67-		 (happy_var_3-	) `HappyStk` happyRest}--happyReduce_224 = happyReduce 7# 62# happyReduction_224-happyReduction_224 (happy_x_7 `HappyStk`-	happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_4 of { happy_var_4 -> -	case happyOut32 happy_x_6 of { happy_var_6 -> -	happyIn68-		 ((happy_var_4,happy_var_6)-	) `HappyStk` happyRest}}--happyReduce_225 = happyReduce 6# 63# happyReduction_225-happyReduction_225 (happy_x_6 `HappyStk`-	happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_3 of { happy_var_3 -> -	case happyOut32 happy_x_5 of { happy_var_5 -> -	happyIn69-		 ((happy_var_3,happy_var_5)-	) `HappyStk` happyRest}}--happyReduce_226 = happyReduce 4# 64# happyReduction_226-happyReduction_226 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut72 happy_x_3 of { happy_var_3 -> -	happyIn70-		 (happy_var_3-	) `HappyStk` happyRest}--happyReduce_227 = happySpecReduce_2  65# happyReduction_227-happyReduction_227 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_2 of { happy_var_2 -> -	happyIn71-		 (happy_var_2-	)}--happyReduce_228 = happySpecReduce_3  66# happyReduction_228-happyReduction_228 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut50 happy_x_3 of { happy_var_3 -> -	happyIn72-		 ([(happy_var_1, happy_var_3)]-	)}}--happyReduce_229 = happyReduce 5# 66# happyReduction_229-happyReduction_229 (happy_x_5 `HappyStk`-	happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut50 happy_x_3 of { happy_var_3 -> -	case happyOut72 happy_x_5 of { happy_var_5 -> -	happyIn72-		 ((happy_var_1,happy_var_3):happy_var_5-	) `HappyStk` happyRest}}}--happyReduce_230 = happySpecReduce_1  67# happyReduction_230-happyReduction_230 happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	happyIn73-		 ([happy_var_1]-	)}--happyReduce_231 = happySpecReduce_2  67# happyReduction_231-happyReduction_231 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut73 happy_x_2 of { happy_var_2 -> -	happyIn73-		 (happy_var_1:happy_var_2-	)}}--happyReduce_232 = happySpecReduce_1  68# happyReduction_232-happyReduction_232 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn74-		 (happy_var_1-	)}--happyReduce_233 = happySpecReduce_1  68# happyReduction_233-happyReduction_233 happy_x_1-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> -	happyIn74-		 (happy_var_1-	)}--happyReduce_234 = happySpecReduce_0  69# happyReduction_234-happyReduction_234  =  happyIn75-		 ([]-	)--happyReduce_235 = happySpecReduce_1  69# happyReduction_235-happyReduction_235 happy_x_1-	 =  case happyOut76 happy_x_1 of { happy_var_1 -> -	happyIn75-		 ([happy_var_1]-	)}--happyReduce_236 = happySpecReduce_3  69# happyReduction_236-happyReduction_236 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut76 happy_x_1 of { happy_var_1 -> -	case happyOut75 happy_x_3 of { happy_var_3 -> -	happyIn75-		 (happy_var_1:happy_var_3-	)}}--happyReduce_237 = happySpecReduce_2  70# happyReduction_237-happyReduction_237 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut77 happy_x_2 of { happy_var_2 -> -	happyIn76-		 (Full happy_var_1 happy_var_2-	)}}--happyReduce_238 = happySpecReduce_2  70# happyReduction_238-happyReduction_238 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> -	case happyOut65 happy_x_2 of { happy_var_2 -> -	happyIn76-		 (Simple happy_var_1 happy_var_2-	)}}--happyReduce_239 = happySpecReduce_2  71# happyReduction_239-happyReduction_239 happy_x_2-	happy_x_1-	 =  case happyOut50 happy_x_2 of { happy_var_2 -> -	happyIn77-		 (happy_var_2-	)}--happyReduce_240 = happySpecReduce_2  72# happyReduction_240-happyReduction_240 happy_x_2-	happy_x_1-	 =  case happyOut38 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Intro happy_var_2-	)}--happyReduce_241 = happySpecReduce_1  72# happyReduction_241-happyReduction_241 happy_x_1-	 =  happyIn78-		 (Intro []-	)--happyReduce_242 = happySpecReduce_2  72# happyReduction_242-happyReduction_242 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Refine happy_var_2-	)}--happyReduce_243 = happySpecReduce_2  72# happyReduction_243-happyReduction_243 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Exists happy_var_2-	)}--happyReduce_244 = happySpecReduce_2  72# happyReduction_244-happyReduction_244 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Generalise happy_var_2-	)}--happyReduce_245 = happySpecReduce_1  72# happyReduction_245-happyReduction_245 happy_x_1-	 =  happyIn78-		 (ReflP-	)--happyReduce_246 = happySpecReduce_2  72# happyReduction_246-happyReduction_246 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Rewrite False False happy_var_2-	)}--happyReduce_247 = happySpecReduce_3  72# happyReduction_247-happyReduction_247 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn78-		 (Rewrite False True happy_var_3-	)}--happyReduce_248 = happySpecReduce_2  72# happyReduction_248-happyReduction_248 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Rewrite True False happy_var_2-	)}--happyReduce_249 = happySpecReduce_3  72# happyReduction_249-happyReduction_249 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_3 of { happy_var_3 -> -	happyIn78-		 (Rewrite True True happy_var_3-	)}--happyReduce_250 = happySpecReduce_1  72# happyReduction_250-happyReduction_250 happy_x_1-	 =  happyIn78-		 (Compute-	)--happyReduce_251 = happySpecReduce_2  72# happyReduction_251-happyReduction_251 happy_x_2-	happy_x_1-	 =  case happyOut32 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Unfold happy_var_2-	)}--happyReduce_252 = happySpecReduce_1  72# happyReduction_252-happyReduction_252 happy_x_1-	 =  happyIn78-		 (Undo-	)--happyReduce_253 = happySpecReduce_2  72# happyReduction_253-happyReduction_253 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Induction happy_var_2-	)}--happyReduce_254 = happySpecReduce_2  72# happyReduction_254-happyReduction_254 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Fill happy_var_2-	)}--happyReduce_255 = happySpecReduce_1  72# happyReduction_255-happyReduction_255 happy_x_1-	 =  happyIn78-		 (Trivial-	)--happyReduce_256 = happySpecReduce_1  72# happyReduction_256-happyReduction_256 happy_x_1-	 =  happyIn78-		 (SimpleSearch-	)--happyReduce_257 = happySpecReduce_2  72# happyReduction_257-happyReduction_257 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (RunTactic happy_var_2-	)}--happyReduce_258 = happySpecReduce_2  72# happyReduction_258-happyReduction_258 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Believe happy_var_2-	)}--happyReduce_259 = happySpecReduce_2  72# happyReduction_259-happyReduction_259 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Use happy_var_2-	)}--happyReduce_260 = happySpecReduce_2  72# happyReduction_260-happyReduction_260 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_2 of { happy_var_2 -> -	happyIn78-		 (Decide happy_var_2-	)}--happyReduce_261 = happySpecReduce_1  72# happyReduction_261-happyReduction_261 happy_x_1-	 =  happyIn78-		 (Abandon-	)--happyReduce_262 = happySpecReduce_1  72# happyReduction_262-happyReduction_262 happy_x_1-	 =  happyIn78-		 (ProofTerm-	)--happyReduce_263 = happySpecReduce_1  72# happyReduction_263-happyReduction_263 happy_x_1-	 =  happyIn78-		 (Qed-	)--happyReduce_264 = happyReduce 4# 73# happyReduction_264-happyReduction_264 (happy_x_4 `HappyStk`-	happy_x_3 `HappyStk`-	happy_x_2 `HappyStk`-	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn79-		 (happy_var_3-	) `HappyStk` happyRest}--happyReduce_265 = happySpecReduce_2  74# happyReduction_265-happyReduction_265 happy_x_2-	happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	happyIn80-		 ([happy_var_1]-	)}--happyReduce_266 = happySpecReduce_1  74# happyReduction_266-happyReduction_266 happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	happyIn80-		 ([happy_var_1]-	)}--happyReduce_267 = happySpecReduce_3  74# happyReduction_267-happyReduction_267 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn80-		 (happy_var_1:happy_var_3-	)}}--happyReduce_268 = happySpecReduce_1  75# happyReduction_268-happyReduction_268 happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	happyIn81-		 ([happy_var_1]-	)}--happyReduce_269 = happySpecReduce_3  75# happyReduction_269-happyReduction_269 happy_x_3-	happy_x_2-	happy_x_1-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> -	case happyOut80 happy_x_3 of { happy_var_3 -> -	happyIn81-		 (happy_var_1:happy_var_3-	)}}--happyReduce_270 = happyMonadReduce 0# 76# happyReduction_270-happyReduction_270 (happyRest) tk-	 = happyThen (( getLineNo)-	) (\r -> happyReturn (happyIn82 r))--happyReduce_271 = happyMonadReduce 0# 77# happyReduction_271-happyReduction_271 (happyRest) tk-	 = happyThen (( getFileName)-	) (\r -> happyReturn (happyIn83 r))--happyReduce_272 = happyMonadReduce 0# 78# happyReduction_272-happyReduction_272 (happyRest) tk-	 = happyThen (( getOps)-	) (\r -> happyReturn (happyIn84 r))--happyNewToken action sts stk-	= lexer(\tk -> -	let cont i = happyDoAction i tk action sts stk in-	case tk of {-	TokenEOF -> happyDoAction 125# tk action sts stk;-	TokenName happy_dollar_dollar -> cont 1#;-	TokenInfixName happy_dollar_dollar -> cont 2#;-	TokenBrackName happy_dollar_dollar -> cont 3#;-	TokenString happy_dollar_dollar -> cont 4#;-	TokenInt happy_dollar_dollar -> cont 5#;-	TokenFloat happy_dollar_dollar -> cont 6#;-	TokenChar happy_dollar_dollar -> cont 7#;-	TokenBool happy_dollar_dollar -> cont 8#;-	TokenMetavar happy_dollar_dollar -> cont 9#;-	TokenColon -> cont 10#;-	TokenSemi -> cont 11#;-	TokenBar -> cont 12#;-	TokenStars -> cont 13#;-	TokenLambda -> cont 14#;-	TokenHashOB -> cont 15#;-	TokenOB -> cont 16#;-	TokenCB -> cont 17#;-	TokenOCB -> cont 18#;-	TokenCCB -> cont 19#;-	TokenOSB -> cont 20#;-	TokenCSB -> cont 21#;-	TokenOId -> cont 22#;-	TokenCId -> cont 23#;-	TokenLPair -> cont 24#;-	TokenRPair -> cont 25#;-	TokenExists -> cont 26#;-	TokenTilde -> cont 27#;-	TokenPlus -> cont 28#;-	TokenMinus -> cont 29#;-	TokenTimes -> cont 30#;-	TokenDivide -> cont 31#;-	TokenEquals -> cont 32#;-	TokenMightEqual -> cont 33#;-	TokenLT -> cont 34#;-	TokenGT -> cont 35#;-	TokenEllipsis -> cont 36#;-	TokenUnderscore -> cont 37#;-	TokenComma -> cont 38#;-	TokenTuple -> cont 39#;-	TokenBang -> cont 40#;-	TokenConcat -> cont 41#;-	TokenGE -> cont 42#;-	TokenLE -> cont 43#;-	TokenOr -> cont 44#;-	TokenAnd -> cont 45#;-	TokenArrow -> cont 46#;-	TokenFatArrow -> cont 47#;-	TokenTransArrow -> cont 48#;-	TokenLeftArrow -> cont 49#;-	TokenIntType -> cont 50#;-	TokenCharType -> cont 51#;-	TokenFloatType -> cont 52#;-	TokenStringType -> cont 53#;-	TokenHandleType -> cont 54#;-	TokenPtrType -> cont 55#;-	TokenLockType -> cont 56#;-	TokenType -> cont 57#;-	TokenLType -> cont 58#;-	TokenLazyBracket -> cont 59#;-	TokenDataType -> cont 60#;-	TokenCoDataType -> cont 61#;-	TokenInfix -> cont 62#;-	TokenInfixL -> cont 63#;-	TokenInfixR -> cont 64#;-	TokenUsing -> cont 65#;-	TokenIdiom -> cont 66#;-	TokenParams -> cont 67#;-	TokenNamespace -> cont 68#;-	TokenPublic -> cont 69#;-	TokenPrivate -> cont 70#;-	TokenAbstract -> cont 71#;-	TokenNoElim -> cont 72#;-	TokenCollapsible -> cont 73#;-	TokenWhere -> cont 74#;-	TokenWith -> cont 75#;-	TokenPartial -> cont 76#;-	TokenSyntax -> cont 77#;-	TokenHide -> cont 78#;-	TokenLazy -> cont 79#;-	TokenStatic -> cont 80#;-	TokenRefl -> cont 81#;-	TokenEmptyType -> cont 82#;-	TokenUnitType -> cont 83#;-	TokenInclude -> cont 84#;-	TokenExport -> cont 85#;-	TokenInline -> cont 86#;-	TokenDo -> cont 87#;-	TokenReturn -> cont 88#;-	TokenIf -> cont 89#;-	TokenThen -> cont 90#;-	TokenElse -> cont 91#;-	TokenLet -> cont 92#;-	TokenIn -> cont 93#;-	TokenProof -> cont 94#;-	TokenTryProof -> cont 95#;-	TokenIntro -> cont 96#;-	TokenRefine -> cont 97#;-	TokenGeneralise -> cont 98#;-	TokenReflP -> cont 99#;-	TokenRewrite -> cont 100#;-	TokenRewriteAll -> cont 101#;-	TokenCompute -> cont 102#;-	TokenUnfold -> cont 103#;-	TokenUndo -> cont 104#;-	TokenInduction -> cont 105#;-	TokenFill -> cont 106#;-	TokenTrivial -> cont 107#;-	TokenSimpleSearch -> cont 108#;-	TokenMkTac -> cont 109#;-	TokenBelieve -> cont 110#;-	TokenUse -> cont 111#;-	TokenDecide -> cont 112#;-	TokenAbandon -> cont 113#;-	TokenProofTerm -> cont 114#;-	TokenQED -> cont 115#;-	TokenLaTeX -> cont 116#;-	TokenNoCG -> cont 117#;-	TokenEval -> cont 118#;-	TokenSpec -> cont 119#;-	TokenFreeze -> cont 120#;-	TokenThaw -> cont 121#;-	TokenTransform -> cont 122#;-	TokenCInclude -> cont 123#;-	TokenCLib -> cont 124#;-	_ -> happyError' tk-	})--happyError_ tk = happyError' tk--happyThen :: () => P a -> (a -> P b) -> P b-happyThen = (thenP)-happyReturn :: () => a -> P a-happyReturn = (returnP)-happyThen1 = happyThen-happyReturn1 :: () => a -> P a-happyReturn1 = happyReturn-happyError' :: () => (Token) -> P a-happyError' tk = (\token -> happyError) tk--mkparse = happySomeParser where-  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))--mkparseTerm = happySomeParser where-  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut34 x))--mkparseTactic = happySomeParser where-  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut78 x))--happySeq = happyDontSeq---data ConParse = Full Id RawTerm-              | Simple Id [RawTerm]--parse :: String -> FilePath -> Result [Decl]-parse s fn = do ds <- mkparse s fn 1 []-                collectDecls ds--processImports :: [Opt] -> [FilePath] -> Result [Decl] -> -                  IO ([Decl], [FilePath])-processImports opts imped (Success ds) = pi imped [] ds-  where pi imps decls ((PInclude fp):xs)-           | fp `elem` imps = pi imps decls xs-           | otherwise = do-                 f <- readLibFile defaultLibPath fp-                 when (Verbose `elem` opts) $ putStrLn ("Reading " ++ fp)-                 case parse f fp of-                   Success t -> pi (fp:imps) decls (t++xs)-                   Failure e f l ->-                     fail $ f ++ ":" ++ show l ++ ":" ++ e-        pi imps decls ((Using t ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Using t ds']) xs-        pi imps decls ((Params t ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Params t ds']) xs-        pi imps decls ((DoUsing b r ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[DoUsing b r ds']) xs-        pi imps decls ((Idiom b r ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Idiom b r ds']) xs-        pi imps decls ((Namespace n ds):xs)-            = do (ds',imps') <- pi imps [] ds-                 pi imps' (decls++[Namespace n ds']) xs-        pi imps decls (x:xs) = pi imps (decls++[x]) xs-        pi imps decls [] = return (decls, imps)--processImports _ imped (Failure e f l) -    = fail $ show f ++ ":" ++ show l ++ ":" ++ show e---parseTerm :: String -> Result RawTerm-parseTerm s = mkparseTerm s "(input)" 0 []--parseTactic :: String -> Result ITactic-parseTactic s = mkparseTactic s "(tactic)" 0 []---- Make a constructor type, and make arguments lazy if it's codata--mkCon :: Bool -> RawTerm -> ConParse -> (Id,RawTerm)-mkCon co _ (Full n t) = (n,if co then lazify t else t)-mkCon co ty (Simple n args) = (n, mkConTy args ty)-   where mkConTy [] ty = ty-         mkConTy (a:as) ty = let opts = if co then [Lazy] else [] in-                                 RBind (MN "X" 0) (Pi Ex opts a) (mkConTy as ty)---- Make sure all arguments are lazy--lazify :: RawTerm -> RawTerm-lazify (RBind n (Pi p opts a) sc) -    = RBind n (Pi p (nub (Lazy:opts)) a) (lazify sc)-lazify t = t--mkDef file line (n, tms) = mkImpApp (RVar file line n Unknown) tms-   where mkImpApp f [] = f-         mkImpApp f ((tm,Just n):ts) = mkImpApp (RAppImp file line n f tm) ts-         mkImpApp f ((tm, Nothing):ts) = mkImpApp (RApp file line f tm) ts--doBind :: (RawTerm -> RBinder) -> [(Id,RawTerm)] -> RawTerm -> RawTerm-doBind b [] t = t-doBind b ((x,ty):ts) tm = RBind x (b ty) (doBind b ts tm)--doLetBind :: [(Id,RawTerm,RawTerm)] -> RawTerm -> RawTerm-doLetBind [] t = t-doLetBind ((x,ty,val):ts) tm = RBind x (RLet val ty) (doLetBind ts tm)--mkTyApp :: String -> Int -> Id -> RawTerm -> RawTerm-mkTyApp file line n ty = mkApp file line (RVar file line n Unknown) (getTyArgs ty)-   where getTyArgs (RBind n _ t) = (RVar file line n Unknown):(getTyArgs t)-         getTyArgs x = []--mkTyParams :: String -> Int -> [Id] -> RawTerm-mkTyParams f l [] = RConst f l TYPE-mkTyParams f l (x:xs) = RBind x (Pi Ex [] (RConst f l TYPE)) (mkTyParams f l xs)--mkDatatype :: Bool -> String -> Int ->-              Id -> Either RawTerm ((RawTerm, [(Id, RawTerm)]), [ConParse]) -> -                    [TyOpt] -> Datatype-mkDatatype co file line n (Right ((t, using), cons)) opts-    = let opts' = if co then nub (Codata:opts) else opts in-          Datatype n t (map (mkCon co (mkTyApp file line n t)) cons) using opts' file line -mkDatatype co file line n (Left t) opts-    = Latatype n t file line--bracket (RUserInfix f l _ op x y) = RUserInfix f l True op x y-bracket x = x--pairDesugar :: String -> Int -> RawTerm -> [RawTerm] -> RawTerm-pairDesugar file line pair [x,y] = mkApp file line pair [x,y]-pairDesugar file line pair (x:y:xs) -    = pairDesugar file line pair ((mkApp file line pair [x,y]):xs)--sigDesugar :: String -> Int -> (Id, RawTerm) -> RawTerm -> RawTerm-sigDesugar file line (n, tm) sc-    = mkApp file line (RVar file line (UN "Sigma") TypeCon) [tm, lam]-   where lam = RBind n (Lam tm) sc--mkConsList :: String -> Int -> [RawTerm] -> RawTerm-mkConsList f l [] = RVar f l (UN "Nil") Unknown-mkConsList f l (x:xs) = RApp f l (RApp f l (RVar f l (UN "Cons") Unknown) x)-                                 (mkConsList f l xs)--mkhidden (UN n) = MN (n++" is hidden") 0-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp --{-# LINE 30 "templates/GenericTemplate.hs" #-}---data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList------{-# LINE 51 "templates/GenericTemplate.hs" #-}--{-# LINE 61 "templates/GenericTemplate.hs" #-}--{-# LINE 70 "templates/GenericTemplate.hs" #-}--infixr 9 `HappyStk`-data HappyStk a = HappyStk a (HappyStk a)---------------------------------------------------------------------------------- starting the parse--happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll---------------------------------------------------------------------------------- Accepting the parse---- If the current token is 0#, it means we've just accepted a partial--- parse (a %partial parser).  We must ignore the saved token on the top of--- the stack in this case.-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =-	happyReturn1 ans-happyAccept j tk st sts (HappyStk ans _) = -	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)---------------------------------------------------------------------------------- Arrays only: do the next action----happyDoAction i tk st-	= {- nothing -}---	  case action of-		0#		  -> {- nothing -}-				     happyFail i tk st-		-1# 	  -> {- nothing -}-				     happyAccept i tk st-		n | (n Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}--				     (happyReduceArr Happy_Data_Array.! rule) i tk st-				     where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))-		n		  -> {- nothing -}---				     happyShift new_state i tk st-				     where !(new_state) = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))-   where !(off)    = indexShortOffAddr happyActOffsets st-         !(off_i)  = (off Happy_GHC_Exts.+# i)-	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))-			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i)-			else False-         !(action)-          | check     = indexShortOffAddr happyTable off_i-          | otherwise = indexShortOffAddr happyDefActions st--{-# LINE 130 "templates/GenericTemplate.hs" #-}---indexShortOffAddr (HappyA# arr) off =-	Happy_GHC_Exts.narrow16Int# i-  where-	!i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)-	!high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))-	!low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))-	!off' = off Happy_GHC_Exts.*# 2#------data HappyAddr = HappyA# Happy_GHC_Exts.Addr#------------------------------------------------------------------------------------- HappyState data type (not arrays)--{-# LINE 163 "templates/GenericTemplate.hs" #-}---------------------------------------------------------------------------------- Shifting a token--happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =-     let !(i) = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in---     trace "shifting the error token" $-     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)--happyShift new_state i tk st sts stk =-     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)---- happyReduce is specialised for the common cases.--happySpecReduce_0 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_0 nt fn j tk st@((action)) sts stk-     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)--happySpecReduce_1 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')-     = let r = fn v1 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_2 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')-     = let r = fn v1 v2 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_3 i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')-     = let r = fn v1 v2 v3 in-       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happyReduce k i fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyReduce k nt fn j tk st sts stk-     = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of-	 sts1@((HappyCons (st1@(action)) (_))) ->-        	let r = fn stk in  -- it doesn't hurt to always seq here...-       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)--happyMonadReduce k nt fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyMonadReduce k nt fn j tk st sts stk =-        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))-       where !(sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))-             drop_stk = happyDropStk k stk--happyMonad2Reduce k nt fn 0# tk st sts stk-     = happyFail 0# tk st sts stk-happyMonad2Reduce k nt fn j tk st sts stk =-       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))-       where !(sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))-             drop_stk = happyDropStk k stk--             !(off) = indexShortOffAddr happyGotoOffsets st1-             !(off_i) = (off Happy_GHC_Exts.+# nt)-             !(new_state) = indexShortOffAddr happyTable off_i-----happyDrop 0# l = l-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t--happyDropStk 0# l = l-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs---------------------------------------------------------------------------------- Moving to a new state after a reduction---happyGoto nt j tk st = -   {- nothing -}-   happyDoAction j tk new_state-   where !(off) = indexShortOffAddr happyGotoOffsets st-         !(off_i) = (off Happy_GHC_Exts.+# nt)-         !(new_state) = indexShortOffAddr happyTable off_i------------------------------------------------------------------------------------- Error recovery (0# is the error token)---- parse error if we are in recovery and we fail again-happyFail  0# tk old_st _ stk =---	trace "failing" $ -    	happyError_ tk--{-  We don't need state discarding for our restricted implementation of-    "error".  In fact, it can cause some bogus parses, so I've disabled it-    for now --SDM---- discard a state-happyFail  0# tk old_st (HappyCons ((action)) (sts)) -						(saved_tok `HappyStk` _ `HappyStk` stk) =---	trace ("discarding state, depth " ++ show (length stk))  $-	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))--}---- Enter error recovery: generate an error token,---                       save the old token and carry on.-happyFail  i tk (action) sts stk =---      trace "entering error recovery" $-	happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)---- Internal happy errors:--notHappyAtAll = error "Internal Happy error\n"---------------------------------------------------------------------------------- Hack to get the typechecker to accept our action functions---happyTcHack :: Happy_GHC_Exts.Int# -> a -> a-happyTcHack x y = y-{-# INLINE happyTcHack #-}----------------------------------------------------------------------------------- Seq-ing.  If the --strict flag is given, then Happy emits ---	happySeq = happyDoSeq--- otherwise it emits--- 	happySeq = happyDontSeq--happyDoSeq, happyDontSeq :: a -> b -> b-happyDoSeq   a b = a `seq` b-happyDontSeq a b = b---------------------------------------------------------------------------------- Don't inline any functions from the template.  GHC has a nasty habit--- of deciding to inline happyGoto everywhere, which increases the size of--- the generated parser quite a bit.---{-# NOINLINE happyDoAction #-}-{-# NOINLINE happyTable #-}-{-# NOINLINE happyCheck #-}-{-# NOINLINE happyActOffsets #-}-{-# NOINLINE happyGotoOffsets #-}-{-# NOINLINE happyDefActions #-}--{-# NOINLINE happyShift #-}-{-# NOINLINE happySpecReduce_0 #-}-{-# NOINLINE happySpecReduce_1 #-}-{-# NOINLINE happySpecReduce_2 #-}-{-# NOINLINE happySpecReduce_3 #-}-{-# NOINLINE happyReduce #-}-{-# NOINLINE happyMonadReduce #-}-{-# NOINLINE happyGoto #-}-{-# NOINLINE happyFail #-}---- end of Happy Template.
idris.cabal view
@@ -1,72 +1,75 @@ Name:           idris-Version:        0.1.7.1+Version:        0.9.0 License:        BSD3 License-file:   LICENSE Author:         Edwin Brady Maintainer:     Edwin Brady <eb@cs.st-andrews.ac.uk> Homepage:       http://www.idris-lang.org/ -Stability:      Alpha+Stability:      Beta Category:       Compilers/Interpreters, Dependent Types Synopsis:       Dependently Typed Functional Programming Language-Description:    Idris is an experimental language with full dependent types.+Description:    Idris is a general purpose language with full dependent types.+                It is compiled, with eager evaluation.                  Dependent types allow types to be predicated on values,                 meaning that some aspects of a program's behaviour can be                 specified precisely in the type. The language is closely -		related to Epigram and Agda. There is a tutorial at <http://www.cs.st-andrews.ac.uk/~eb/Idris/tutorial.html>.+		related to Epigram and Agda. There is a tutorial at <http://www.idris-lang.org/documentation>.+                Features include:                 .-                The aims of the project are:+                * Full dependent types with dependent pattern matching+                .                +                * where clauses, with rule, simple case expressions, +                  pattern matching let and lambda bindings                 .-                * To provide a platform for realistic programming with dependent types.-                By realistic, we mean the ability to interact with the outside world-                and use primitive types and operations. This includes networking,-                file handling, concurrency, etc.+                * Type classes, monad comprehensions                 .-                * To show that full dependent types do not mean we have to abandon-                the functional style we have come to know and love with languages-                like Haskell and OCaml. We aim to show that lightweight dependently typed-                programming means allowing the programmer full access to values in types,-                and letting the type checker do the hard work so you don't have to!+                * do notation, idiom brackets, syntactic conveniences for lists, +                  tuples, dependent pairs                 .-                The Darcs repository can be found at <http://www-fp.cs.st-andrews.ac.uk/~eb/darcs/Idris>.-Homepage:       http://www.cs.st-andrews.ac.uk/~eb/Idris/+                * Indentation significant syntax, extensible syntax+                .+                * Tactic based theorem proving (influenced by Coq)+                .+                * Cumulative universes+                .+                * Simple foreign function interface (to C)+                .+                * Hugs style interactive environment  Cabal-Version:  >= 1.6-Build-type:     Simple+Build-type:     Custom -Data-files:     Prelude.e *.idr-Data-dir:       lib+Extra-source-files:    lib/Makefile  lib/*.idr lib/prelude/*.idr lib/network/*.idr+                       tutorial/examples/*.idr -Extra-source-files: CHANGELOG+source-repository head+  type:     git+  location: git://github.com/edwinb/Idris-dev.git  -Library-        Exposed-modules: Idris.Parser, Idris.Lexer, Idris.Lib, -                         Idris.AbsSyntax, Idris.Context, Idris.Latex-                         Idris.Compiler, Idris.LambdaLift, Idris.PMComp, -                         Idris.MakeTerm, Idris.Prover, Idris.Fontlock,-                         Idris.ConTrans, Idris.SCTrans, Idris.RunIO,-                         Idris.SimpleCase, Idris.Serialise, Idris.PartialEval-        Other-modules:   Paths_idris -        Build-depends:   base>=4 && <5, containers, array, parsec, mtl,-                         readline, ivor>=0.1.14, directory, haskell98,-                         old-time, old-locale, binary, epic>=0.1.7, Cabal-                                -        Extensions:      MagicHash, UndecidableInstances, OverlappingInstances, PatternGuards- Executable     idris-               Main-is: Main.lhs-               Other-modules: Idris.Parser, Idris.Lexer, Idris.Lib, -                              Idris.AbsSyntax, Idris.Context,-                              Idris.Compiler, Idris.LambdaLift, Idris.PMComp, -                              Idris.MakeTerm, Idris.Prover, Idris.Fontlock,-                              Idris.ConTrans, Idris.SCTrans, Idris.RunIO,-                              Idris.SimpleCase, Idris.Serialise, -                              Idris.PartialEval+               Main-is: Main.hs+               hs-source-dirs: src+               Other-modules: Core.TT, Core.Evaluate, Core.Typecheck, +                              Core.ProofShell, Core.ProofState, Core.CoreParser, +                              Core.ShellParser, Core.Unify, Core.Elaborate,+                              Core.CaseTree, Core.Constraints, -               Build-depends:   base>=4 && <5, containers, array, parsec, mtl,-                                readline, ivor>=0.1.14, directory, haskell98,-                                old-time, old-locale, binary, epic>=0.1.6, Cabal+                              Idris.AbsSyntax, Idris.Parser, Idris.REPL,+                              Idris.REPLParser, Idris.ElabDecls, Idris.Error,+                              Idris.Delaborate, Idris.Primitives, Idris.Imports,+                              Idris.Compiler, Idris.Prover, Idris.ElabTerm,+                              Idris.Coverage, Idris.IBC, Idris.Unlit,+                              Idris.DataOpts, Idris.Transforms,++                              Paths_idris++               Build-depends:   base>=4 && <5, parsec, mtl, Cabal, haskeline,+                                containers, process, transformers, filepath, directory,+                                binary, bytestring, epic>=0.9.2                                 -               Extensions:      MagicHash, UndecidableInstances, OverlappingInstances, PatternGuards+               Extensions:      MultiParamTypeClasses, FunctionalDependencies,+                                FlexibleInstances, TemplateHaskell                ghc-prof-options: -auto-all+               ghc-options: -rtsopts
+ lib/Makefile view
@@ -0,0 +1,22 @@++check: .PHONY+	$(BINDIR)/idris --noprelude --verbose --check checkall.idr++recheck: clean check++install: check+	mkdir -p $(TARGET)/prelude+	mkdir -p $(TARGET)/network+	install *.ibc $(TARGET)+	install prelude/*.ibc $(TARGET)/prelude+	install network/*.ibc $(TARGET)/network++clean: .PHONY+	rm -f *.ibc+	rm -f prelude/*.ibc+	rm -f network/*.ibc++linecount: .PHONY+	wc -l *.idr network/*.idr prelude/*.idr++.PHONY:
− lib/Prelude.e
@@ -1,86 +0,0 @@-%include "string.h"---- IO--%inline __epic_id (x:Any) -> Any = x--%inline __epic_putStr (x:String) -> Unit =-    foreign Unit "putStr" (x:String)--__epic_readStr () -> String =-    foreign String "readStr" ()--__epic_append (x:String, y:String) -> String =-    foreign String "append" (x:String, y:String)--__epic_strlen (x:String) -> Int =-    foreign Int "strlen" (x:String)--__epic_strhead (x:String) -> Int =-    foreign Int "strHead" (x:String)--__epic_strtail (x:String) -> String =-    foreign String "strTail" (x:String)--__epic_strcons (h:Int, x:String) -> String =-    foreign String "strCons" (h:Int, x:String)--__epic_streq (x:String, y:String) -> Data =-    foreign Int "streq" (x:String, y:String)--__epic_strrev (x:String) -> String =-    foreign String "strrev" (x:String)--__epic_substr (x:String, start:Int, len:Int) -> String =-    foreign String "substr" (x:String, start: Int, len:Int)--__epic_strFind (x:String, c:Int) -> Int =-    foreign String "strFind" (x:String, c:Int)--%inline __epic_chareq (x:Int, y:Int) -> Data = x==y--%inline __epic_strlt (x:String, y:String) -> Data =-    foreign Int "strlt" (x:String, y:String)--__epic_newRef () -> Int =-    foreign Int "newRef" ()--__epic_readRef (A:Any, r:Int) -> Any =-    foreign Any "readRef" (r:Int)--__epic_writeRef (A:Any, r:Int, v:Any) -> Unit =-    foreign Unit "writeRef" (r:Int, v:Any)--__epic_newLock (l:Int) -> Int =-   foreign Int "newLock" (l:Int)--__epic_doLock (l:Int) -> Unit =-   foreign Unit "doLock" (l:Int)--__epic_doUnlock (l:Int) -> Unit =-   foreign Unit "doUnlock" (l:Int)--__epic_fork (a:Any, f:Fun) -> Unit =-   lazy foreign Unit "doFork" (f:Fun)--__epic_within (a:Any, i:Int, f:Fun, fail:Fun) -> Unit =-   lazy foreign Unit "doWithin" (i:Int, f:Fun, fail:Fun)--%inline __epic_bool (x:Int) -> Data =-   if (x==0) then (Con 1 ()) else (Con 0 ())--__epic_toInt (x:String) -> Int = -   foreign Int "strToInt" (x:String)--__epic_toString (x:Int) -> String = -   foreign String "intToStr" (x:Int)--__epic_floatToString (x:Float) -> String = -   foreign String "floatToStr" (x:Float)--__epic_stringToFloat (x:String) -> Float = -   foreign Float "strToFloat" (x:String)--__epic_native (x:Fun) -> Ptr =-   foreign Ptr "getNative" (x:Fun)-
− lib/bool.idr
@@ -1,35 +0,0 @@-data Bool = True | False;--not : Bool -> Bool;-not True = False;-not False = True;--%transform not (not ?x) => ?x;--if_then_else : Bool -> |(t:A) -> |(e:A) -> A;-if_then_else True t f = t;-if_then_else False t f = f;--data so : Bool -> Set where oh : so True;--infixl 4 &&,||;--(||) : Bool -> Bool -> Bool;-(||) False x = x;-(||) True _ = True;--(&&) : Bool -> Bool -> Bool;-(&&) True x = x;-(&&) False _ = False;--or_commutes : (x:Bool) -> (y:Bool) -> ((x || y) = (y || x));-or_commutes True False  = refl _;-or_commutes True True   = refl _;-or_commutes False False = refl _;-or_commutes False True  = refl _;--and_commutes : (x:Bool) -> (y:Bool) -> ((x && y) = (y && x));-and_commutes True False  = refl _;-and_commutes True True   = refl _;-and_commutes False False = refl _;-and_commutes False True  = refl _;
lib/builtins.idr view
@@ -1,46 +1,239 @@-include "bool.idr"; +%access public -data __Unit = II;-data __Empty = ;+data Exists : (a : Set) -> (P : a -> Set) -> Set where+    Ex_intro : {P : a -> Set} -> (x : a) -> P x -> Exists a P -data Sigma : (A:Set)->(P:A->Set)->Set where-   Exists : {P:A->Set} -> (a:A) -> P a -> Sigma A P;+getWitness : {P : a -> Set} -> Exists a P -> a+getWitness (a ** v) = a -getSigIdx : {P:a->Set} ->  (s:Sigma a P) -> a;-getSigIdx (Exists a v) = a;+getProof : {P : a -> Set} -> (s : Exists a P) -> P (getWitness s)+getProof (a ** v) = v -getSigVal : {P:a->Set} -> (s:Sigma a P) -> P (getSigIdx s);-getSigVal (Exists a v) = v;+FalseElim : _|_ -> a -data Pair a b = mkPair a b;+-- For rewrite tactic+replace : {a:_} -> {x:_} -> {y:_} -> {P : a -> Set} -> x = y -> P x -> P y+replace refl prf = prf -id : a -> a;-id x = x;+sym : {l:a} -> {r:a} -> l = r -> r = l+sym refl = refl -rewrite : {A:B->Set} -> A m -> (m=n) -> A n;-rewrite t (refl m) = t;+lazy : a -> a+lazy x = x -- compiled specially --- This way is needed for Ivor's rewriting tactic+believe_me : a -> b -- compiled specially as id, use with care!+believe_me x = prim__believe_me _ _ x -__eq_repl : (A:Set)->(x:A) -> (y:A) -> (q:(x=y)) -> (P:(m:A)->Set) -> (p:P x) -> (P y);-__eq_repl A x x (refl _) P p = p;+namespace builtins { -__eq_sym : (A:Set) -> (a:A) -> (b:A) -> (p:(a=b)) -> (b=a);-__eq_sym A a a (refl _) = refl _;+id : a -> a+id x = x --- For proofs which should not be stored at run-time. Programs can--- construct objects of type Proof A, and manipulate them,--- but not inspect them. 'Proof' is treated as collapsible.+const : a -> b -> a+const x _ = x -data Proof : (A:Set) -> Set where-  __mkProof : (a:A) -> Proof A;+fst : (s, t) -> s+fst (x, y) = x -prove : (a:A) -> Proof A;-prove x = __mkProof x;+snd : (a, b) -> b+snd (x, y) = y --- This is the only function allowed to manipulate proofs.--- It'd be easier if we could hide '__mkProof'!+infixl 9 . -proof_bind : Proof A -> (A -> Proof B) -> Proof B;-proof_bind (__mkProof a) p = p a;+(.) : (b -> c) -> (a -> b) -> a -> c+(.) f g x = f (g x)++flip : (a -> b -> c) -> b -> a -> c+flip f x y = f y x++infixr 1 $++($) : (a -> b) -> a -> b+f $ a = f a++data Bool = False | True++boolElim : (x:Bool) -> |(t : a) -> |(f : a) -> a +boolElim True  t e = t+boolElim False t e = e++data so : Bool -> Set where oh : so True++syntax if [test] then [t] else [e] = boolElim test t e+syntax [test] "?" [t] ":" [e] = if test then t else e++infixl 4 &&, ||++(||) : Bool -> Bool -> Bool+(||) False x = x+(||) True _  = True++(&&) : Bool -> Bool -> Bool+(&&) True x  = x+(&&) False _ = False++not : Bool -> Bool+not True = False+not False = True++infixl 5 ==, /=, ==.+infixl 6 <, <=, >, >=, <., <=., >., >=.+infixl 7 <<, >>+infixl 8 +,-,++,+.,-.+infixl 9 *,/,*.,/.++--- Numeric operators++intToBool : Int -> Bool+intToBool 0 = False+intToBool x = True++boolOp : (a -> a -> Int) -> a -> a -> Bool+boolOp op x y = intToBool (op x y) ++class Eq a where+    (==) : a -> a -> Bool+    (/=) : a -> a -> Bool++    x /= y = not (x == y)+    x == y = not (x /= y)++instance Eq Int where +    (==) = boolOp prim__eqInt++instance Eq Integer where+    (==) = boolOp prim__eqBigInt++instance Eq Float where+    (==) = boolOp prim__eqFloat++instance Eq Char where+    (==) = boolOp prim__eqChar++instance Eq String where+    (==) = boolOp prim__eqString++data Ordering = LT | EQ | GT++class Eq a => Ord a where +    compare : a -> a -> Ordering++    (<) : a -> a -> Bool+    (<) x y with (compare x y) +        (<) x y | LT = True+        (<) x y | _  = False++    (>) : a -> a -> Bool+    (>) x y with (compare x y)+        (>) x y | GT = True+        (>) x y | _  = False++    (<=) : a -> a -> Bool+    (<=) x y = x < y || x == y++    (>=) : a -> a -> Bool+    (>=) x y = x > y || x == y++    max : a -> a -> a+    max x y = if (x > y) then x else y++    min : a -> a -> a+    min x y = if (x < y) then x else y++++instance Ord Int where +    compare x y = if (x == y) then EQ else+                  if (boolOp prim__ltInt x y) then LT else+                  GT+++instance Ord Integer where +    compare x y = if (x == y) then EQ else+                  if (boolOp prim__ltBigInt x y) then LT else+                  GT+++instance Ord Float where +    compare x y = if (x == y) then EQ else+                  if (boolOp prim__ltFloat x y) then LT else+                  GT+++instance Ord Char where +    compare x y = if (x == y) then EQ else+                  if (boolOp prim__ltChar x y) then LT else+                  GT+++instance Ord String where +    compare x y = if (x == y) then EQ else+                  if (boolOp prim__ltString x y) then LT else+                  GT+++class (Eq a, Ord a) => Num a where +    (+) : a -> a -> a+    (-) : a -> a -> a+    (*) : a -> a -> a++    abs : a -> a+    abs x = if (x < 0) then (-x) else x++    fromInteger : Int -> a++++instance Num Int where +    (+) = prim__addInt+    (-) = prim__subInt+    (*) = prim__mulInt++    fromInteger = id+++instance Num Integer where +    (+) = prim__addBigInt+    (-) = prim__subBigInt+    (*) = prim__mulBigInt++    fromInteger = prim__intToBigInt+++instance Num Float where +    (+) = prim__addFloat+    (-) = prim__subFloat+    (*) = prim__mulFloat++    fromInteger = prim__intToFloat +++div : Int -> Int -> Int+div = prim__divInt+++(/) : Float -> Float -> Float+(/) = prim__divFloat++--- string operators++(++) : String -> String -> String+(++) = prim__concat++strHead : String -> Char+strHead = prim__strHead++strTail : String -> String+strTail = prim__strTail++strCons : Char -> String -> String+strCons = prim__strCons++strIndex : String -> Int -> Char+strIndex = prim__strIndex++rev : String -> String+rev = prim__strRev++} 
+ lib/checkall.idr view
@@ -0,0 +1,24 @@+module checkall++-- This file just exists to typecheck all the prelude modules+-- Add imports here ++import builtins+import prelude+import io+import system++import prelude.cast+import prelude.nat+import prelude.fin+import prelude.list+import prelude.maybe+import prelude.monad+import prelude.applicative+import prelude.either+import prelude.vect+import prelude.strings+import prelude.char++import network.cgi +
− lib/either.idr
@@ -1,9 +0,0 @@-data Either A B = Left A | Right B;--choose : (x:Bool) -> Either (so (not x)) (so x);-choose False = Left oh;-choose True = Right oh;--either : Either a b -> (a -> c) -> (b -> c) -> c;-either (Left  a) fa fb = fa a;-either (Right b) fa fb = fb b;
− lib/equalities.idr
@@ -1,39 +0,0 @@-include "maybe.idr";-include "vect.idr";--data EqNat : Nat -> Nat -> Set where-    eqO : EqNat O O-  | eqS : EqNat x y -> EqNat (S x) (S y);--eqNat' : (x:Nat) -> (y:Nat) -> Maybe (EqNat x y);-eqNat' O O = Just eqO;-eqNat' (S x) (S y) with eqNat' x y {-  eqNat' (S x) (S x) | Just p = Just (eqS p);-  eqNat' (S x) (S y) | Nothing = Nothing;-}-eqNat' _ _ = Nothing;--eqNat : Nat -> Nat -> Bool;-eqNat x y with eqNat' x y {-  eqNat x x | Just _ = True;-  eqNat x y | Nothing = False;-}--data EqFin : Fin n -> Fin n -> Set where-    eqfO : {k:Nat} -> EqFin {n=S k} fO fO-  | eqfS : {x:Fin n} -> {y:Fin n} -> EqFin x y -> EqFin (fS x) (fS y);--eqFin' : (x:Fin n) -> (y:Fin n) -> Maybe (EqFin x y);-eqFin' fO fO = Just eqfO;-eqFin' (fS x) (fS y) with eqFin' x y {-  eqFin' (fS x) (fS x) | Just p = Just (eqfS p);-  eqFin' (fS x) (fS y) | Nothing = Nothing;-}-eqFin' _ _ = Nothing;--eqFin : Fin n -> Fin n -> Bool;-eqFin x y with eqFin' x y {-  eqFin x x | Just _ = True;-  eqFin x y | Nothing = False;-}-
lib/io.idr view
@@ -1,272 +1,45 @@-include "list.idr";+import prelude.list --- FAny is to allow C functions to build up Idris data--- types. Obviously this needs care...+%access public -data FType = FUnit | FInt | FStr | FPtr | FFloat | FAny Set-           | FIntP (Int -> Bool);+abstract data IO a = prim__IO a -i_ftype : FType -> Set;-i_ftype FInt = Int;-i_ftype FStr = String;-i_ftype FPtr = Ptr;-i_ftype FFloat = Float;-i_ftype FUnit = ();-i_ftype (FAny ty) = ty;-i_ftype (FIntP p) = (x : Int ** so (p x)); +abstract+io_bind : IO a -> (a -> IO b) -> IO b+io_bind (prim__IO v) k = k v -data ForeignFun = FFun String (List FType) FType;+abstract+io_return : a -> IO a+io_return x = prim__IO x -f_retType : ForeignFun -> FType;-f_retType (FFun nm args ret) = ret;+-- This may seem pointless, but we can use it to force an+-- evaluation of main that Epic wouldn't otherwise do... -f_args : ForeignFun -> (List FType);-f_args (FFun nm args ret) = args;+run__IO : IO () -> IO ()+run__IO v = io_bind v (\v' => io_return v') -f_name : ForeignFun -> String;-f_name (FFun nm args ret) = nm;+data FTy = FInt | FFloat | FChar | FString | FPtr | FUnit -data FArgList : (List FType) -> Set where-    fNil : FArgList Nil-  | fCons : {x:FType} -> (fx:i_ftype x) -> (fxs:FArgList xs) ->-			 (FArgList (Cons x xs));+interpFTy : FTy -> Set+interpFTy FInt    = Int+interpFTy FFloat  = Float+interpFTy FChar   = Char+interpFTy FString = String+interpFTy FPtr    = Ptr+interpFTy FUnit   = () -fapp : {xs,ys:List FType} -> -       (FArgList xs) -> (FArgList ys) -> (FArgList (app xs ys));-fapp fNil fxs = fxs;-fapp (fCons fx fxs) fys = fCons fx (fapp fxs fys);+ForeignTy : (xs:List FTy) -> (t:FTy) -> Set+ForeignTy xs t = mkForeign' (rev xs) (IO (interpFTy t)) where +   mkForeign' : List FTy -> Set -> Set+   mkForeign' Nil ty       = ty+   mkForeign' (s :: ss) ty = mkForeign' ss (interpFTy s -> ty) -namespace IO { -  data IO : Set -> Set;--  data Command : Set where-      PutStr : String -> Command-    | GetStr : Command-    | Fork : {A:Set} -> A -> Command-    | NewLock : Int -> Command-    | DoLock : Lock -> Command-    | DoUnlock : Lock -> Command-    | NewRef : Command-    | ReadRef : Set -> Int -> Command-    | WriteRef : {A:Set} -> Int -> A -> Command-    | While : (IO Bool) -> (IO ()) -> Command-    | WhileAcc : {A:Set} -> (IO Bool) -> A -> (A -> IO A) -> Command-    | Within : Int -> (IO A) -> (IO A) -> Command-    | IOLift : {A:Set} -> (IO A) -> Command -    | Foreign : (f:ForeignFun) -> -  	        (args:FArgList (f_args f)) -> Command;+data Foreign : Set -> Set where+    FFun : String -> (xs:List FTy) -> (t:FTy) -> +           Foreign (ForeignTy xs t) -  Response : Command -> Set;-  Response (PutStr s) = ();-  Response GetStr = String;-  Response (Fork proc) = ();-  Response (NewLock i) = Lock;-  Response (DoLock l) = ();-  Response (DoUnlock l) = ();-  Response NewRef = Int;-  Response (ReadRef A i) = A;-  Response (WriteRef i val) = ();-  Response (While _ body) = ();-  Response (WhileAcc {A} _ acc body) = A;-  Response (Within {A} time body failure) = A;-  Response (IOLift {A} f) = A;-  Response (Foreign t args) = i_ftype (f_retType t);+mkForeign : Foreign x -> x+-- mkForeign compiled as primitive  -  data IO : Set -> Set where-     IOReturn : A -> (IO A)-   | IODo : (c:Command) -> ((Response c) -> (IO A)) -> (IO A);--  data IORef A = MkIORef Int;--  bind : (IO a) -> (a -> (IO b)) -> (IO b);-  bind (IOReturn a) k = k a;-  -- bind (IODo (IOLift {A} c) p) k = bind (bind c p) k;-  bind (IODo c p) k = IODo c (\y => (bind (p y) k));-  -- bind (IOError str) k = IOError str;--  ret : a -> IO a;-  ret x = IOReturn x;-}--kbind : (IO a) -> (a -> b) -> (IO b);-kbind (IOReturn a) k = IOReturn (k a);-kbind (IODo c p) k = IODo c (\x => (kbind (p x) k));--while : |(test:IO Bool) -> |(body: IO ()) -> IO ();-while t body = IODo (While t body) (\a => (IOReturn II));--while_accTR : Bool -> -            |(test:IO Bool) -> acc -> |(body: acc -> IO acc) -> IO acc;--while_acc : |(test:IO Bool) -> acc -> |(body: acc -> IO acc) -> IO acc;-{--while_acc test acc body = do { test' <- test;-	       	   	       while_accTR test' test acc body; };--while_accTR True test acc body = do { acc' <- body acc;-	    	      	       	      test' <- test;-	       	       	              while_accTR test' test acc' body; };-while_accTR False test acc body = return acc;--}-while_acc test acc body = IODo (WhileAcc test acc body) (\a => (IOReturn a));--{--ioReturn : a -> (IO a);-ioReturn x = IOReturn x;--}--apply : IO (a -> b) -> IO a -> IO b;-apply {a} {b} fn arg = do { f : (a->b) <- fn; -- grr-                            x <- arg;-              		    return (f x); };--data IOException = IOExcept String; --data IOe : Set -> Set where-   IOK : (IO A) -> (IOe A)- | IOError : String -> (IOe A);--{--catch : (IOe A) -> (IOException -> (IO A)) -> (IO A);-catch (IOK action) = action;-catch (IOError str) handler = handler (IOExcept str);--}---- No code for this - only works in compiled code, certainly shouldn't--- be evaluted in pure code!-unsafePerformIO : (IO A) -> A;---- get the rts representation of a value-unsafeNative : A -> Ptr;--putStr : String -> (IO ());-putStr str = IODo (PutStr str) (\a => (IOReturn a));--getStr : IO String;-getStr = IODo GetStr (\b => (IOReturn b));--getInt : IO Int;-getInt = do { inp <- getStr;-              let val = __toInt inp;-	      return val; };--putStrLn : String -> (IO ());-putStrLn str = do { putStr str;-		    putStr "\n"; };--fork : |(proc:IO ()) -> (IO ());-fork proc = IODo (Fork proc) (\a => (IOReturn a));--newLock : Int -> (IO Lock);-newLock i = IODo (NewLock i) (\l => (IOReturn l));--lock : Lock -> (IO ());-lock l = IODo (DoLock l) (\a => (IOReturn a));--unlock : Lock -> (IO ());-unlock l = IODo (DoUnlock l) (\a => (IOReturn a));---- Perform an action within "time" milliseconds, execute failure--- routine if it doesn't complete--within : Int -> |(action : IO a) -> |(failure : IO a) -> IO a;-within time act fail = IODo (Within time act fail) (\a => (IOReturn a));--newIORefPrim : IO Int;-newIORefPrim = IODo (NewRef) (\i => (IOReturn i));--readIORefPrim : Int -> (IO A);-readIORefPrim {A} i = IODo (ReadRef A i) (\a => (IOReturn a));--writeIORefPrim : Int -> A -> (IO ());-writeIORefPrim {A} i val = IODo (WriteRef {A} i val) (\a => (IOReturn a));--newIORef : A -> (IO (IORef A));-newIORef val = do { i <- newIORefPrim;-		    writeIORefPrim i val;-		    return (MkIORef i);-		  };--readIORef : (IORef A) -> (IO A);-readIORef (MkIORef i) = readIORefPrim i;--writeIORef : (IORef A) -> A -> (IO ());-writeIORef (MkIORef i) val = writeIORefPrim i val;--mkFType' : (List FType) -> FType -> Set  ; [%nocg]--mkFType' Nil rt = IO (i_ftype rt);-mkFType' (Cons t ts) rt = (i_ftype t) -> (mkFType' ts rt);--mkFType : ForeignFun -> Set   ; [%nocg]-mkFType (FFun fn args rt) = mkFType' args rt;--mkFDef : String -> (ts:List FType) -> (xs:List FType) -> (FArgList xs) ->-	 (rt:FType) -> (mkFType' ts rt)  ; [%nocg]-mkFDef nm Nil accA fs rt -   = IODo (Foreign (FFun nm accA rt) fs)-				 (\a => (IOReturn a));-mkFDef nm (Cons t ts) accA fs rt -   = \x:i_ftype t => mkFDef nm ts (app accA (Cons t Nil)) -				   (fapp fs (fCons x fNil)) rt;--mkForeign : (f:ForeignFun) -> (mkFType f)  ; [%nocg]-mkForeign (FFun fn args rt) = mkFDef fn args Nil fNil rt;--_isNull = mkForeign (FFun "isNull" (Cons FPtr Nil) FInt); [%eval]--isNull : Ptr -> Bool;-isNull ptr = if_then_else ((unsafePerformIO (_isNull ptr))==0) False True;--data File = FHandle Ptr;--_fopen-  = mkForeign (FFun "fileOpen" (Cons FStr (Cons FStr Nil)) FPtr); [%eval]-_fclose -  = mkForeign (FFun "fileClose" (Cons FPtr Nil) FUnit); [%eval]-_fread-  = mkForeign (FFun "freadStr" (Cons FPtr Nil) (FAny String)); [%eval]-_fwrite-  = mkForeign (FFun "fputStr" (Cons FPtr (Cons FStr Nil)) FUnit); [%eval]-_feof-  = mkForeign (FFun "feof" (Cons FPtr Nil) FInt); [%eval]--gc_details-  = mkForeign (FFun "epicMemInfo" Nil FUnit); [%eval]--gc_collect-  = mkForeign (FFun "epicGC" Nil FUnit); [%eval]--validFile : File -> Bool;-validFile (FHandle p) = not (isNull p);--fopen : String -> String -> IO File;-fopen str mode = do { ho <- _fopen str mode;-		      return (FHandle ho); };--fclose : File -> IO ();-fclose (FHandle h) = _fclose h;--fread : File -> IO String;-fread (FHandle hn) = _fread hn;--fwrite : File -> String -> IO ();-fwrite (FHandle h) str = _fwrite h str;--feof : File -> IO Bool;-feof (FHandle h) = do { eof <- _feof h;-     	      	      	return (not (eof==0)); };--sequence : (List (IO a)) -> (IO (List a));-sequence Nil = return Nil;-sequence (Cons x xs) = do { a <- x;-			    as <- sequence xs;-			    return (Cons a as); };--sleep = mkForeign (FFun "sleep" (Cons FInt Nil) FUnit); [%eval]---- Return time in microseconds since some unspecified starting point--utime = mkForeign (FFun "do_utime" Nil FInt); [%eval]
− lib/list.idr
@@ -1,79 +0,0 @@-data List a = Nil | Cons a (List a);--map : (a->b) -> (List a) -> (List b);-map f Nil = Nil;-map f (Cons x xs) = Cons (f x) (map f xs);--consp : Bool -> a -> (List a) -> (List a);-consp True x xs = Cons x xs;-consp False x xs = xs;--filter : (a->Bool) -> (List a) -> (List a);-filter p Nil = Nil;-filter p (Cons x xs) = consp (p x) x (filter p xs);--maybeCons : (Maybe a) -> (List a) -> (List a);-maybeCons Nothing xs = xs;-maybeCons (Just a) xs = (Cons a xs);--mapMaybe : (a->(Maybe b)) -> (List a) -> (List b);-mapMaybe f Nil = Nil;-mapMaybe f (Cons x xs) = maybeCons (f x) (mapMaybe f xs);--app : (List a) -> (List a) -> (List a);-app Nil xs = xs;-app (Cons x xs) ys = Cons x (app xs ys);--foldl : (a -> b -> a) -> a -> (List b) -> a;-foldl f z Nil = z;-foldl f z (Cons x xs) = foldl f (f z x) xs;--foldr : (a -> b -> b) -> b -> (List a) -> b;-foldr f z Nil = z;-foldr f z (Cons x xs) = f x (foldr f z xs);--rev : (List a) -> (List a);-rev xs = foldl (flip Cons) Nil xs;--eq_resp_Cons : {xs,ys:List A} -> (xs=ys) -> ((Cons x xs) = (Cons x ys));-eq_resp_Cons {A} {x} (refl xs) = refl _;--elem : (a->a->Bool) -> a -> (List a) -> Bool;-elem q x Nil = False;-elem q x (Cons y ys) = if_then_else (q x y) True (elem q x ys);--app_assoc : (xs:List a) -> (ys:List a) -> (zs:List a) ->-	    (app xs (app ys zs) = app (app xs ys) zs);--app_assoc Nil ys zs = refl _;-app_assoc (Cons x xs) ys zs = let rec = app_assoc xs ys zs in-	  	      	      ?app_assocCons;-app_assocCons proof {-	%intro;-	%rewrite rec;-	%refl;-	%qed;-};--app_Nil : (xs:List a) -> (app xs Nil = xs);-app_Nil Nil = refl _;-app_Nil (Cons x xs) = ?appNil_Cons;-appNil_Cons proof {-	%intro a;-	%intro;-	%rewrite <- app_Nil xs;-	%refl;-	%qed;-};--span' : (a -> Bool) -> List a -> List a -> (List a & List a);-span' p Nil acc         = (rev acc, Nil);-span' p (Cons x xs) acc = if (p x) then (span' p xs (Cons x acc))-      	      	      	           else (rev acc, Cons x xs);--span : (a -> Bool) -> List a -> (List a & List a);-span p xs = span' p xs Nil;--length : List a -> Int;-length Nil = 0;-length (Cons x xs) = 1 + length xs;
− lib/maybe.idr
@@ -1,13 +0,0 @@-data Maybe A = Just A | Nothing;--mMap : (f:A->B) -> (Maybe A) -> (Maybe B);-mMap f Nothing = Nothing;-mMap f (Just a) = Just (f a);--maybe : (x:Maybe a) -> |(default:b) -> (a->b) -> b;-maybe Nothing def f = def;-maybe (Just a) def f = f a;--maybeBind : Maybe a -> (a -> Maybe b) -> Maybe b;-maybeBind Nothing  mf = Nothing;-maybeBind (Just x) mf = mf x;
− lib/nat.idr
@@ -1,147 +0,0 @@-data Nat = O | S Nat;--plus : Nat -> Nat -> Nat;-plus O y = y;-plus (S k) y = S (plus k y);--mult : Nat -> Nat -> Nat;-mult O y = O;-mult (S k) y = plus y (mult k y);--eq_resp_S : (m=n) -> ((S m) = (S n));-eq_resp_S (refl n) = refl (S n);--power : Nat -> Nat -> Nat;-power n O = S O;-power n (S k) = mult n (power n k);--------- Int/String conversions ---------intToNat : Int -> Nat;--in' : Bool -> Nat -> Int -> Nat;-in' True n i = n;-in' False n i = S (intToNat (i-1));--intToNat n = in' (n<=0) O n;--natToInt : Nat -> Int;-natToInt O = 0;-natToInt (S k) = 1+(natToInt k);------------- plus theorems -------------plus_nO : (n:Nat) -> ((plus n O) = n);-plus_nO O = (refl O);-plus_nO (S n) = eq_resp_S (plus_nO n);--plus_nSm : (m:Nat, n:Nat) -> ((plus n (S m)) = (S (plus n m)));-plus_nSm m O     = refl (S m);-plus_nSm m (S k) = eq_resp_S (plus_nSm m k);--plus_comm : (x:Nat, y:Nat) -> (plus x y = plus y x);-plus_comm proof {-        %intro; %induction x;-	%rewrite <- plus_nO y;-	%refl;-	%intro n,ih;-	%rewrite <- (plus_nSm n y);-	%rewrite ih;-	%refl;-	%qed;-};--plus_assoc  : (m:Nat, n:Nat, p:Nat) -> (plus m (plus n p) = plus (plus m n) p);-plus_assoc proof {-        %intro;-        %induction m;-        %compute;-        %refl;-        %intro k;-        %intro ih;-        %compute;-        %rewrite <- ih;-        %refl;-        %qed;-};------------- mult theorems -------------mult_nO : (n:Nat) -> ((mult n O) = O);-mult_nO O = refl _;-mult_nO (S k) = mult_nO k;--mult_nSm : (n:Nat, m:Nat) -> ((mult n (S m)) = (plus n (mult n m)));-mult_nSm proof {-        %intro;-        %induction n;-        %refl;-        %intro k,ih;-        %compute;-        %refine eq_resp_S;-        %rewrite <- ih;-        %generalise mult k m;-        %intro x;-        %rewrite <- plus_comm m x;-        %rewrite <- plus_assoc k x m;-        %rewrite <- plus_comm m (plus k x);-        %refl;-        %qed;-};--mult_comm : (x:Nat, y:Nat) -> ((mult x y) = (mult y x));-mult_comm proof {-        %intro;-        %induction x;-        %rewrite <- mult_nO y;-        %refl;-        %intro k,ih;-        %compute;-        %rewrite <- mult_nSm y k;-        %rewrite <- ih;-        %refl;-        %qed;-};--mult_distrib : (m:Nat, n:Nat, p:Nat) ->-	       (plus (mult m p) (mult n p) = mult (plus m n) p);-mult_distrib proof {-        %intro;-        %induction m;-        %refl;-        %intro k,ih;-        %compute;-        %rewrite ih;-        %rewrite plus_assoc p (mult k p) (mult n p);-        %refl;-        %qed;-};------ Comparing Nats--data Compare : Nat -> Nat -> Set where-   cmpLT : (y:Nat) -> (Compare x (plus x (S y)))- | cmpEQ : Compare x x- | cmpGT : (x:Nat) -> (Compare (plus y (S x)) y);--compareAux : (Compare n m) -> (Compare (S n) (S m));-compareAux (cmpLT y) = cmpLT _;-compareAux cmpEQ = cmpEQ;-compareAux (cmpGT x) = cmpGT _;--compare : (n:Nat) -> (m:Nat) -> (Compare n m);-compare O O = cmpEQ;-compare (S n) O = cmpGT _;-compare O (S m) = cmpLT _;-compare (S n) (S m) = compareAux (compare n m);--ltNat : Nat -> Nat -> Bool;-ltNat O (S x) = True;-ltNat (S x) O = False;-ltNat O O = False;-ltNat (S x) (S y) = ltNat x y;--max : Nat -> Nat -> Nat;-max O n = n;-max (S n) O = S n;-max (S n) (S m) = S (max n m);
+ lib/network/cgi.idr view
@@ -0,0 +1,144 @@+module network.cgi++import system++public+Vars : Set+Vars = List (String, String)++data CGIInfo = CGISt Vars -- GET+                     Vars -- POST+                     Vars -- Cookies+                     String -- User agent+                     String -- headers+                     String -- output++get_GET : CGIInfo -> Vars+get_GET (CGISt g _ _ _ _ _) = g++get_POST : CGIInfo -> Vars+get_POST (CGISt _ p _ _ _ _) = p++get_Cookies : CGIInfo -> Vars+get_Cookies (CGISt _ _ c _ _ _) = c++get_UAgent : CGIInfo -> String+get_UAgent (CGISt _ _ _ a _ _) = a++get_Headers : CGIInfo -> String+get_Headers (CGISt _ _ _ _ h _) = h++get_Output : CGIInfo -> String+get_Output (CGISt _ _ _ _ _ o) = o++add_Headers : String -> CGIInfo -> CGIInfo+add_Headers str (CGISt g p c a h o) = CGISt g p c a (h ++ str) o++add_Output : String -> CGIInfo -> CGIInfo+add_Output str (CGISt g p c a h o) = CGISt g p c a h (o ++ str)++abstract+data CGI : Set -> Set where+    MkCGI : (CGIInfo -> IO (a, CGIInfo)) -> CGI a++getAction : CGI a -> CGIInfo -> IO (a, CGIInfo)+getAction (MkCGI act) = act++instance Monad CGI where {+    (>>=) (MkCGI f) k = MkCGI (\s => do v <- f s+                                        getAction (k (fst v)) (snd v))++    return v = MkCGI (\s => return (v, s))+}++setInfo : CGIInfo -> CGI ()+setInfo i = MkCGI (\s => return ((), i))++getInfo : CGI CGIInfo+getInfo = MkCGI (\s => return (s, s))++abstract+lift : IO a -> CGI a +lift op = MkCGI (\st => do { x <- op+                             return (x, st) } ) ++abstract+output : String -> CGI ()+output s = do i <- getInfo+              setInfo (add_Output s i)++abstract+queryVars : CGI Vars+queryVars = do i <- getInfo+               return (get_GET i)++abstract+postVars : CGI Vars+postVars = do i <- getInfo+              return (get_POST i)++abstract+cookieVars : CGI Vars+cookieVars = do i <- getInfo+                return (get_Cookies i)++abstract+queryVar : String -> CGI (Maybe String)+queryVar x = do vs <- queryVars+                return (lookup x vs)++getOutput : CGI String+getOutput = do i <- getInfo+               return (get_Output i)++getHeaders : CGI String+getHeaders = do i <- getInfo+                return (get_Headers i)++abstract+flushHeaders : CGI ()+flushHeaders = do o <- getHeaders+                  lift (putStrLn o)++abstract+flush : CGI ()+flush = do o <- getOutput+           lift (putStr o) ++getVars : List Char -> String -> List (String, String)+getVars seps query = mapMaybe readVar (split (\x => elem x seps) query) +  where+    readVar : String -> Maybe (String, String)+    readVar xs with (split (\x => x == '=') xs)+        | [k, v] = Just (trim k, trim v)+        | _      = Nothing++getContent : Int -> IO String+getContent x = getC x "" where+    getC : Int -> String -> IO String+    getC 0 acc = return $ rev acc+    getC n acc = do x <- getChar+                    getC (n-1) (strCons x acc)++abstract+runCGI : CGI a -> IO a+runCGI prog = do +    clen_in <- getEnv "CONTENT_LENGTH"+    let clen = prim__strToInt clen_in+    content <- getContent clen+    query   <- getEnv "QUERY_STRING"+    cookie  <- getEnv "HTTP_COOKIE"+    agent   <- getEnv "HTTP_USER_AGENT"++    let get_vars  = getVars ['&',';'] query+    let post_vars = getVars ['&'] content+    let cookies   = getVars [';'] cookie++    p <- getAction prog (CGISt get_vars post_vars cookies agent +            "Content-type: text/html\n" +            "")+    putStrLn (get_Headers (snd p))+    putStr (get_Output (snd p))+    return (fst p)++
− lib/perm.idr
@@ -1,139 +0,0 @@-include "vect.idr";---- Yes, it's a DSL! One which gives a sequence of operations for converting a--- list into its permutation.--using (x:A, xs:List A, xs':List A, xs'':List A, -       ys:List A, ys':List A,-       zs:List A)-{-  data Perm : (List A) -> (List A) -> Set where-     pnil : {A:Set} -> (Perm {A} Nil Nil)-   | pskip : (Perm xs xs') -> (Perm (Cons x xs) (Cons x xs'))-   | pswap : (Perm (Cons x (Cons y xs)) (Cons y (Cons x xs)))-   | ptrans : (Perm xs xs') -> (Perm xs' xs'') -> (Perm xs xs'');--  perm_id: Perm xs xs;-  perm_id {xs=Nil} = pnil;-  perm_id {xs=Cons x xs} = pskip perm_id;--  perm_sym : Perm xs xs' -> Perm xs' xs;-  perm_sym pnil = pnil;-  perm_sym (pskip p) = pskip (perm_sym p);-  perm_sym pswap = pswap;-  perm_sym (ptrans p q) = ptrans (perm_sym q) (perm_sym p);--  perm_refl : Perm xs xs;-  perm_refl {xs=Nil} = pnil;-  perm_refl {xs=Cons x xs} = pskip perm_refl;--  perm_app_head : (xs:List A) -> -                  Perm xs' ys' -> Perm (app xs xs') (app xs ys');-  perm_app_head Nil p = p;-  perm_app_head (Cons x xs) p = pskip (perm_app_head xs p);--  perm_add_cons : Perm (Cons x xs) (Cons x ys) -> Perm xs ys;-  perm_add_cons (pskip p) = p;-  perm_add_cons pswap = pskip perm_id;--  perm_app : Perm xs ys -> Perm xs' ys' ->-             Perm (app xs xs') (app ys ys');-  perm_app {xs=Nil} {ys=Nil} p p' = p';-  perm_app {xs=Cons x xs} {ys=Cons y ys} {xs'} {ys'} (ptrans p1 p2) p' = -     let r1 = perm_app p1 p' in-     let r2 = perm_app p2 p' in ?papp_cons;--  perm_rewrite : Perm xs xs' -> Perm xs ys -> Perm xs' ys;-  perm_rewrite p1 p2 = ptrans (perm_sym p1) p2;--  perm_rewrite_cons : Perm (Cons x xs) xs' -> Perm xs ys -> -                      Perm (Cons x ys) xs';-  perm_rewrite_cons (pskip p1) p2 = pskip (ptrans (perm_sym p2) p1);-  perm_rewrite_cons pswap p = ptrans (pskip (perm_sym p)) pswap;-  perm_rewrite_cons (ptrans p1 p2) p3 = ptrans (perm_rewrite_cons p1 p3) p2;--  perm_rewrite_app : Perm (app xs ys) xs' -> Perm ys zs ->-                     Perm (app xs zs) xs';-  perm_rewrite_app {xs=Nil} p1 p2 = perm_rewrite p2 p1;-  perm_rewrite_app {xs=Cons x xs} p1 p2 -       = perm_rewrite_cons p1 (perm_app perm_id p2);--  perm_swapr : Perm xs (Cons x (Cons y ys)) ->-               Perm xs (Cons y (Cons x ys));-  perm_swapr {xs=Cons a (Cons b xs)} p = ptrans p pswap;--  perm_swapl : Perm (Cons x (Cons y ys)) xs ->-               Perm (Cons y (Cons x ys)) xs;-  perm_swapl {xs=Cons a (Cons b xs)} p = ptrans pswap p;--  perm_move_cons : Perm xs (app ys (Cons x zs)) ->-                   Perm xs (Cons x (app ys zs));-  perm_move_cons {ys=Nil} p = p;-  perm_move_cons {ys=Cons y ys} p -        = perm_swapr (perm_sym -             (perm_rewrite_cons (perm_sym p) (perm_move_cons perm_id)));--  perm_cons_move : Perm xs (Cons x (app ys zs)) ->-                   Perm xs (app ys (Cons x zs));-                  -  perm_cons_move {ys=Nil} p = p;-  perm_cons_move {ys=Cons y ys} p -        = perm_sym (perm_rewrite_cons-             (perm_swapl (perm_sym p)) (perm_cons_move perm_id));--  -- This is by induction on the *list* xs, not the permutation, despite-  -- initial appearances.--  perm_app_cons : Perm xs (app xs' ys') ->-  		  Perm (Cons x xs) (app xs' (Cons x ys'));-  perm_app_cons {xs'=Nil} {ys'=Nil} p = pskip p;-  perm_app_cons {x} {xs=Cons x' xs} {xs'=Cons x' xs'}-                (pskip p) = let prec = perm_app_cons {x=x} p in-  		  perm_swapl (perm_rewrite_cons perm_id (perm_sym prec));-  perm_app_cons {xs=Cons x (Cons y _)} {xs'=Cons y (Cons x _)}-                pswap = perm_swapl (perm_swapr (pskip (perm_swapl-  		  (pskip (perm_app_cons perm_id))))); -- list is smaller!-  perm_app_cons {xs=Cons x' xs} {xs'=Cons x' xs'}-                (ptrans p1 p2) = perm_swapl (pskip (perm_app_cons-  		  (perm_add_cons (ptrans p1 p2)))); -- list is smaller!--  -- Again by induction on the list xs. Maybe there are shorter proofs,-  -- but it doesn't really matter, we're not going to run them...--  perm_app_swap : Perm (app xs ys) zs -> Perm (app ys xs) zs;-  perm_app_swap {xs=Nil} p ?= p;   [papp_swap_nil]-  perm_app_swap {xs=Cons x xs} {zs=Cons x zs} -                (pskip p) = perm_sym-                     (perm_app_cons (perm_sym (perm_app_swap p)));-  perm_app_swap {xs=Cons x (Cons y _)}-                pswap = perm_swapr (perm_sym -		        (perm_app_cons -			 (perm_rewrite_cons -			  (perm_app_cons perm_id) (perm_app_swap perm_id))));-  perm_app_swap {xs=Cons x xs} {zs=Cons z zs}-                (ptrans p1 p2) = perm_sym (perm_cons_move -                                  (perm_sym (perm_rewrite_cons -                                    (ptrans p1 p2) (perm_app_swap perm_id))));--}---papp_cons proof {-	%intro a;-	%intro;-	%refine ptrans;-	%fill (app X xs');-	%refine ptrans;-	%fill (app X ys');-	%fill r1;-	%fill perm_app_head X (perm_sym p');-	%fill r2;-	%qed;-};--papp_swap_nil proof {-	%intro;-	%use value;-	%fill app_Nil X1;-	%qed;-};
lib/prelude.idr view
@@ -1,121 +1,270 @@--- malloc evaluates an expression using a manual allocator, allocating 'bytes'--- Needs to be compiled specially, naturally.+module prelude -malloc : Int -> a -> a;-malloc bytes val = val;+import builtins+import io -%freeze malloc;+import prelude.cast+import prelude.nat+import prelude.fin+import prelude.list+import prelude.maybe+import prelude.monad+import prelude.applicative+import prelude.either+import prelude.vect+import prelude.strings+import prelude.char --- Used by the 'believe' tactic to make a temporary proof. Programs--- using this are not to be trusted! (Or maybe use externally trusted code)--- Generate a refl so that __eq_repl can reduce.+%access public -__Suspend_Disbelief : (m:A) -> (n:A) -> (n = m);-__Suspend_Disbelief m n = __Prove_Anything _ _ (refl n);+-- Show and instances -flip : (a -> b -> c) -> b -> a -> c;-flip f x y = f y x;+class Show a where +    show : a -> String -infixl 5 ==, /=, ==.;-infixl 6 <, <=, >, >=, <., <=., >., >=.;-infixl 7 <<, >>;-infixl 8 +,-,++,+.,-.;-infixl 9 *,/,*.,/.;+instance Show Nat where +    show O = "O"+    show (S k) = "s" ++ show k --- Integer primitives+instance Show Int where +    show = prim__intToStr -(+) : Int -> Int -> Int; [inline]-(+) x y = __addInt x y;+instance Show Integer where +    show = prim__bigIntToStr -(-) : Int -> Int -> Int; [inline]-(-) x y = __subInt x y;+instance Show Float where +    show = prim__floatToStr -(*) : Int -> Int -> Int; [inline]-(*) x y = __mulInt x y;+instance Show Char where +    show x = strCons x ""  -(/) : Int -> Int -> Int; [inline]-(/) x y = __divInt x y;+instance Show String where +    show = id -mod : Int -> Int -> Int; [inline]-mod x y = __modInt x y;+instance Show Bool where +    show True = "True"+    show False = "False" -(<) : Int -> Int -> Bool; [inline]-(<) x y = __intlt x y;+instance (Show a, Show b) => Show (a, b) where +    show (x, y) = "(" ++ show x ++ ", " ++ show y ++ ")" -(<=) : Int -> Int -> Bool; [inline]-(<=) x y = __intleq x y;+instance Show a => Show (List a) where +    show xs = "[" ++ show' xs ++ "]" where +        show' : Show a => List a -> String+        show' []        = ""+        show' [x]       = show x+        show' (x :: xs) = show x ++ ", " ++ show' xs -(>) : Int -> Int -> Bool; [inline]-(>) x y = __intgt x y;+instance Show a => Show (Vect a n) where +    show xs = "[" ++ show' xs ++ "]" where +        show' : Show a => Vect a n -> String+        show' []        = ""+        show' [x]       = show x+        show' (x :: xs) = show x ++ ", " ++ show' xs -(>=) : Int -> Int -> Bool; [inline]-(>=) x y = __intgeq x y;+instance Show a => Show (Maybe a) where +    show Nothing = "Nothing"+    show (Just x) = "Just " ++ show x -(==) : Int -> Int -> Bool; [inline]-(==) x y = __eq x y;+---- Monad instances -(/=) : Int -> Int -> Bool; [inline]-(/=) x y = not (__eq x y);+instance Monad IO where +    return t = io_return t+    b >>= k = io_bind b k -(<<) : Int -> Int -> Int; [inline]-(<<) x y = __shl x y;+instance Monad Maybe where +    return t = Just t -(>>) : Int -> Int -> Int; [inline]-(>>) x y = __shr x y;+    Nothing  >>= k = Nothing+    (Just x) >>= k = k x --- Floating point primitives+instance MonadPlus Maybe where +    mzero = Nothing -(+.) : Float -> Float -> Float; [inline]-(+.) x y = __addFloat x y;+    mplus (Just x) _       = Just x+    mplus Nothing (Just y) = Just y+    mplus Nothing Nothing  = Nothing -(-.) : Float -> Float -> Float; [inline]-(-.) x y = __subFloat x y;+instance Monad List where +    return x = [x]+    m >>= f = concatMap f m -(*.) : Float -> Float -> Float; [inline]-(*.) x y = __mulFloat x y;+instance MonadPlus List where +    mzero = []+    mplus = app -(/.) : Float -> Float -> Float; [inline]-(/.) x y = __divFloat x y;+---- Functor instances -(<.) : Float -> Float -> Bool; [inline]-(<.) x y = __floatlt x y;+instance Functor Maybe where +    fmap f (Just x) = Just (f x)+    fmap f Nothing  = Nothing -(<=.) : Float -> Float -> Bool; [inline]-(<=.) x y = __floatleq x y;+instance Functor List where +    fmap = map -(>.) : Float -> Float -> Bool; [inline]-(>.) x y = __floatgt x y;+---- Applicative instances -(>=.) : Float -> Float -> Bool; [inline]-(>=.) x y = __floatgeq x y;+instance Applicative Maybe where+    pure = Just -(==.) : Float -> Float -> Bool; [inline]-(==.) x y = __feq x y;+    (Just f) <$> (Just a) = Just (f a)+    Nothing  <$> Nothing  = Nothing --- String primitives -(++) : String -> String -> String; [inline]-(++) x y = __concat x y;+---- some mathematical operations +%include "math.h"+%lib "m" --- Function composition+exp : Float -> Float+exp x = prim__floatExp x -infixl 9 .;+log : Float -> Float+log x = prim__floatLog x -(.) : (b -> c) -> (a -> b) -> a -> c;-(.) f g x = f (g x);+pi : Float+pi = 3.141592653589793 -fst : (a & b) -> a; [inline]-fst (x, y) = x;+sin : Float -> Float+sin x = prim__floatSin x -snd : (a & b) -> b; [inline]-snd (x, y) = y;+cos : Float -> Float+cos x = prim__floatCos x -include "nat.idr";-include "maybe.idr";-include "io.idr";-include "either.idr";-include "tactics.idr";-include "vect.idr";-include "string.idr";+tan : Float -> Float+tan x = prim__floatTan x++asin : Float -> Float+asin x = prim__floatASin x++acos : Float -> Float+acos x = prim__floatACos x++atan : Float -> Float+atan x = prim__floatATan x++sqrt : Float -> Float+sqrt x = prim__floatSqrt x++floor : Float -> Float+floor x = prim__floatFloor x++ceiling : Float -> Float+ceiling x = prim__floatCeil x++---- Ranges++count : Num a => a -> a -> a -> List a+count a inc b = if a <= b then a :: count (a + inc) inc b+                          else []+  +syntax "[" [start] ".." [end] "]" +     = count start 1 end +syntax "[" [start] "," [next] ".." [end] "]" +     = count start (next - start) end ++---- More utilities++flip : (a -> b -> c) -> b -> a -> c+flip f x y = f y x++sum : Num a => List a -> a+sum = foldl (+) 0++prod : Num a => List a -> a+prod = foldl (*) 1++---- some basic io++putStr : String -> IO ()+putStr x = mkForeign (FFun "putStr" [FString] FUnit) x++putStrLn : String -> IO ()+putStrLn x = putStr (x ++ "\n")++print : Show a => a -> IO ()+print x = putStrLn (show x)++getLine : IO String+getLine = mkForeign (FFun "readStr" Nil FString)++putChar : Char -> IO ()+putChar c = mkForeign (FFun "putchar" [FChar] FUnit) c++getChar : IO Char+getChar = mkForeign (FFun "getchar" [] FChar)++---- some basic file handling++abstract +data File = FHandle Ptr++do_fopen : String -> String -> IO Ptr+do_fopen f m = mkForeign (FFun "fileOpen" [FString, FString] FPtr) f m++fopen : String -> String -> IO File+fopen f m = do h <- do_fopen f m+               return (FHandle h) ++data Mode = Read | Write | ReadWrite++openFile : String -> Mode -> IO File+openFile f m = fopen f (modeStr m) where +  modeStr : Mode -> String+  modeStr Read  = "r"+  modeStr Write = "w"+  modeStr ReadWrite = "r+"++do_fclose : Ptr -> IO ()+do_fclose h = mkForeign (FFun "fileClose" [FPtr] FUnit) h++closeFile : File -> IO ()+closeFile (FHandle h) = do_fclose h++do_fread : Ptr -> IO String+do_fread h = mkForeign (FFun "freadStr" [FPtr] FString) h++fread : File -> IO String+fread (FHandle h) = do_fread h++do_fwrite : Ptr -> String -> IO ()+do_fwrite h s = mkForeign (FFun "fputStr" [FPtr, FString] FUnit) h s++fwrite : File -> String -> IO ()+fwrite (FHandle h) s = do_fwrite h s++do_feof : Ptr -> IO Int+do_feof h = mkForeign (FFun "feof" [FPtr] FInt) h++feof : File -> IO Bool+feof (FHandle h) = do eof <- do_feof h+                      return (not (eof == 0)) ++nullPtr : Ptr -> IO Bool+nullPtr p = do ok <- mkForeign (FFun "isNull" [FPtr] FInt) p +               return (ok /= 0);++validFile : File -> IO Bool+validFile (FHandle h) = do x <- nullPtr h+                           return (not x)++while : |(test : IO Bool) -> |(body : IO ()) -> IO ()+while t b = do v <- t+               if v then do b+                            while t b+                    else return ()+               ++readFile : String -> IO String+readFile fn = do h <- openFile fn Read+                 c <- readFile' h ""+                 closeFile h+                 return c+  where +    readFile' : File -> String -> IO String+    readFile' h contents = +       do x <- feof h+          if not x then do l <- fread h+                           readFile' h (contents ++ l)+                   else return contents 
+ lib/prelude/applicative.idr view
@@ -0,0 +1,13 @@+module prelude.applicative++import builtins++---- Applicative functors/Idioms++infixl 2 <$> ++class Applicative (f : Set -> Set) where +    pure  : a -> f a+    (<$>) : f (a -> b) -> f a -> f b ++
+ lib/prelude/cast.idr view
@@ -0,0 +1,49 @@+module prelude.cast++class Cast from to where+    cast : from -> to++-- String casts++instance Cast String Int where+    cast = prim__strToInt++instance Cast String Float where+    cast = prim__strToFloat++instance Cast String Integer where+    cast = prim__strToBigInt++-- Int casts++instance Cast Int String where+    cast = prim__intToStr++instance Cast Int Float where+    cast = prim__intToFloat++instance Cast Int Integer where+    cast = prim__intToBigInt ++instance Cast Int Char where+    cast = prim__intToChar++-- Float casts++instance Cast Float String where+    cast = prim__floatToStr++instance Cast Float Int where+    cast = prim__floatToInt++-- Integer casts++instance Cast Integer String where+    cast = prim__bigIntToStr++-- Char casts++instance Cast Char Int where+    cast = prim__charToInt++
+ lib/prelude/char.idr view
@@ -0,0 +1,34 @@+module prelude.char++import builtins++isUpper : Char -> Bool+isUpper x = x >= 'A' && x <= 'Z'++isLower : Char -> Bool+isLower x = x >= 'a' && x <= 'z'++isAlpha : Char -> Bool+isAlpha x = isUpper x || isLower x ++isDigit : Char -> Bool+isDigit x = (x >= '0' && x <= '9')++isAlphaNum : Char -> Bool+isAlphaNum x = isDigit x || isAlpha x++isSpace : Char -> Bool+isSpace x = x == ' '  || x == '\t' || x == '\r' ||+            x == '\n' || x == '\f' || x == '\v' ||+            x == '\xa0'++toUpper : Char -> Char+toUpper x = if (isLower x) +               then (prim__intToChar (prim__charToInt x - 32))+               else x++toLower : Char -> Char+toLower x = if (isUpper x)+               then (prim__intToChar (prim__charToInt x + 32))+               else x+
+ lib/prelude/either.idr view
@@ -0,0 +1,13 @@+module prelude.either++import builtins++data Either a b = Left a | Right b++choose : (b : Bool) -> Either (so b) (so (not b))+choose True = Left oh+choose False = Right oh++either : Either a b -> (a -> c) -> (b -> c) -> c+either (Left x)  l r = l x+either (Right x) l r = r x
+ lib/prelude/fin.idr view
@@ -0,0 +1,13 @@+module prelude.fin++import prelude.nat++data Fin : Nat -> Set where+    fO : Fin (S k)+    fS : Fin k -> Fin (S k)++instance Eq (Fin n) where+   fO == fO = True+   (fS k) == (fS k') = k == k'+   _ == _ = False+
+ lib/prelude/list.idr view
@@ -0,0 +1,104 @@+module prelude.list++import prelude.maybe+import builtins++%access public++infixr 7 :: ++data List a = Nil | (::) a (List a)++rev : List a -> List a+rev xs = revAcc [] xs where+  revAcc : List a -> List a -> List a+  revAcc acc []        = acc+  revAcc acc (x :: xs) = revAcc (x :: acc) xs++app : List a -> List a -> List a+app []        xs = xs+app (x :: xs) ys = x :: app xs ys++length : List a -> Int+length []        = 0+length (x :: xs) = 1 + length xs++take : Int -> List a -> List a+take 0 xs = []+take n [] = []+take n (x :: xs) = x :: take (n-1) xs++drop : Int -> List a -> List a+drop 0 xs = xs+drop n [] = []+drop n (x :: xs) = drop (n-1) xs++map : (a -> b) -> List a -> List b+map f []        = []+map f (x :: xs) = f x :: map f xs++concatMap : (a -> List b) -> List a -> List b+concatMap f [] = []+concatMap f (x :: xs) = app (f x) (concatMap f xs)++mapMaybe : (a -> Maybe b) -> List a -> List b+mapMaybe f [] = []+mapMaybe f (x :: xs) = case f x of+                           Nothing => mapMaybe f xs+                           Just v  => v :: mapMaybe f xs++foldl : (a -> b -> a) -> a -> List b -> a+foldl f a []        = a+foldl f a (x :: xs) = foldl f (f a x) xs++foldr : (a -> b -> b) -> b -> List a -> b+foldr f b []        = b+foldr f b (x :: xs) = f x (foldr f b xs)++filter : (y -> Bool) -> List y -> List y+filter pred [] = []+filter pred (x :: xs) = if (pred x) then (x :: filter pred xs)+                                    else (filter pred xs)++elem : Eq a => a -> List a -> Bool+elem x [] = False+elem x (y :: ys) = if (x == y) then True else (elem x ys)++lookup : Eq k => k -> List (k, v) -> Maybe v+lookup k [] = Nothing+lookup k ((x, v) :: xs) = if (x == k) then (Just v) else (lookup k xs)++sort : Ord a => List a -> List a+sort []  = []+sort [x] = [x]+sort xs = let (x, y) = split xs in+              merge (sort x) (sort y) where+    splitrec : List a -> List a -> (List a -> List a) -> (List a, List a)+    splitrec (_ :: _ :: xs) (y :: ys) zs = splitrec xs ys (zs . ((::) y))+    splitrec _              ys        zs = (zs [], ys)++    split : List a -> (List a, List a)+    split xs = splitrec xs xs id++    merge : Ord a => List a -> List a -> List a+    merge xs        []        = xs+    merge []        ys        = ys+    merge (x :: xs) (y :: ys) = if (x < y) then (x :: merge xs (y :: ys))+                                           else (y :: merge (x :: xs) ys)++span : (a -> Bool) -> List a -> (List a, List a)+span p [] = ([], [])+span p (x :: xs) with (p x) +   | True with (span p xs)+      | (ys, zs) = (x :: ys, zs)+   | False = ([], x :: xs)++break : (a -> Bool) -> List a -> (List a, List a)+break p = span (not . p)+  +split : (a -> Bool) -> List a -> List (List a)+split p [] = []+split p xs = case break p xs of+                  (chunk, []) => [chunk]+                  (chunk, (c :: rest)) => chunk :: split p rest+
+ lib/prelude/maybe.idr view
@@ -0,0 +1,12 @@+module prelude.maybe++data Maybe a = Nothing | Just a++maybe : |(def : b) -> (a -> b) -> Maybe a -> b+maybe n j Nothing  = n+maybe n j (Just x) = j x++maybe_bind : Maybe a -> (a -> Maybe b) -> Maybe b+maybe_bind Nothing k = Nothing+maybe_bind (Just x) k = k x+
+ lib/prelude/monad.idr view
@@ -0,0 +1,44 @@+module prelude.monad++-- Monads and Functors++import builtins++%access public++infixl 5 >>=++class Monad (m : Set -> Set) where +    return : a -> m a+    (>>=)  : m a -> (a -> m b) -> m b++class Functor (f : Set -> Set) where +    fmap : (a -> b) -> f a -> f b++class Monad m => MonadPlus (m : Set -> Set) where +    mplus : m a -> m a -> m a+    mzero : m a++guard : MonadPlus m => Bool -> m ()+guard True  = return ()+guard False = mzero++when : Monad m => Bool -> m () -> m ()+when True  f = f+when False _ = return ()++sequence : Monad m => List (m a) -> m (List a)+sequence []        = return []+sequence (x :: xs) = [ x' :: xs' | x' <- x, xs' <- sequence xs ]++sequence_ : Monad m => List (m a) -> m ()+sequence_ [] = return ()+sequence_ (x :: xs) = do x; sequence_ xs++mapM : Monad m => (a -> m b) -> List a -> m (List b)+mapM f xs = sequence (map f xs)++mapM_ : Monad m => (a -> m b) -> List a -> m ()+mapM_ f xs = sequence_ (map f xs)++
+ lib/prelude/nat.idr view
@@ -0,0 +1,124 @@+module prelude.nat++import builtins+import prelude.cast++%access public++data Nat = O | S Nat++instance Cast Nat Int where+    cast O = 0+    cast (S k) = 1 + cast k++plus : Nat -> Nat -> Nat+plus O     y = y+plus (S k) y = S (plus k y)++eqRespS : m = n -> S m = S n+eqRespS refl = refl++eqRespS' : S m = S n -> m = n+eqRespS' refl = refl++sub : Nat -> Nat -> Nat+sub O      y    = O+sub (S k) (S y) = sub k y+sub x      O    = x++mult : Nat -> Nat -> Nat+mult O     y = O+mult (S k) y = plus y (mult k y)++instance Eq Nat where +    O     == O     = True+    (S x) == (S y) = x == y+    O     == (S y) = False+    (S x) == O     = False++instance Ord Nat where+    compare O O     = EQ+    compare O (S k) = LT+    compare (S k) O = GT+    compare (S x) (S y) = compare x y++instance Num Nat where+    (+) = plus+    (-) = sub+    (*) = mult++    fromInteger 0 = O+    fromInteger n = if (n > 0) then (S (fromInteger (n-1))) else O++plusnO : (m : Nat) -> m + O = m+plusnO O     = refl+plusnO (S k) = eqRespS (plusnO k)++plusn_Sm : (n, m : Nat) -> (plus n (S m)) = S (plus n m)+plusn_Sm O     m = refl+plusn_Sm (S j) m = eqRespS (plusn_Sm _ _)++plus_commutes : (n : Nat) -> (m : Nat) -> n + m = m + n+plus_commutes O     m = sym (plusnO m)+plus_commutes (S k) m = let ih = plus_commutes k m in ?plus_commutes_Sk++plus_commutes_Sk = proof {+    intros;+    refine sym;+    rewrite sym ih;+    rewrite plusn_Sm m k;+    trivial;+}++plus_assoc : (n, m, p : Nat) -> n + (m + p) = (n + m) + p+plus_assoc O     m p = refl+plus_assoc (S k) m p = let ih = plus_assoc k m p in eqRespS ih++data Cmp : Nat -> Nat -> Set where+    cmpLT : (y : Nat) -> Cmp x (x + S y)+    cmpEQ : Cmp x x+    cmpGT : (x : Nat) -> Cmp (y + S x) y+  +cmp : (n, m : Nat) -> Cmp n m+cmp O     O     = cmpEQ+cmp (S n) O     = cmpGT _+cmp O     (S n) = cmpLT _+cmp (S x) (S y) with (cmp x y)+    cmp (S x) (S x)         | cmpEQ = cmpEQ+    cmp (S (y + S x)) (S y) | cmpGT _ = cmpGT _+    cmp (S x) (S (x + S y)) | cmpLT _ = cmpLT _+  +multnO : (n : Nat) -> (n * O) = O+multnO O     = refl+multnO (S k) = multnO k++multn_Sm : (n, m : Nat) -> n * S m = n + n * m+multn_Sm O     m = refl+multn_Sm (S k) m = let ih = multn_Sm k m in ?multnSmSk++mult_commutes : (n, m : Nat) -> n * m = m * n+mult_commutes O     m = ?mult_commO+mult_commutes (S k) m = let ih = mult_commutes k m in ?mult_commSk++mult_commSk = proof {+    intros;+    rewrite sym ih;+    rewrite multn_Sm m k;+    trivial;+}++mult_commO = proof {+    intro;+    rewrite multnO m;+    trivial;+}++multnSmSk = proof {+    intros;+    rewrite plus_commutes (mult k m) m;+    rewrite sym (plus_assoc k (mult k m) m);+    rewrite ih;+    rewrite plus_commutes m (mult k (S m));+    trivial;+}+
+ lib/prelude/strings.idr view
@@ -0,0 +1,64 @@+module prelude.strings++import builtins+import prelude.list+import prelude.char+import prelude.cast++-- Some more complex string operations++data StrM : String -> Set where+    StrNil : StrM ""+    StrCons : (x : Char) -> (xs : String) -> StrM (strCons x xs)++strHead' : (x : String) -> so (not (x == "")) -> Char+strHead' x p = prim__strHead x++strTail' : (x : String) -> so (not (x == "")) -> String+strTail' x p = prim__strTail x++-- we need the 'believe_me' because the operations are primitives++strM : (x : String) -> StrM x+strM x with (choose (not (x == "")))+  strM x | (Left p)  = believe_me (StrCons (strHead' x p) (strTail' x p))+  strM x | (Right p) = believe_me StrNil++unpack : String -> List Char+unpack s with (strM s)+  unpack ""             | StrNil = []+  unpack (strCons x xs) | (StrCons _ _) = x :: unpack xs++pack : List Char -> String+pack [] = ""+pack (x :: xs) = strCons x (pack xs)++instance Cast String (List Char) where+    cast = unpack++instance Cast (List Char) String where+    cast = pack++span : (Char -> Bool) -> String -> (String, String)+span p xs with (strM xs)+  span p ""             | StrNil        = ("", "")+  span p (strCons x xs) | (StrCons _ _) with (p x)+    | True with (span p xs)+      | (ys, zs) = (strCons x ys, zs)+    | False = ("", strCons x xs)++break : (Char -> Bool) -> String -> (String, String)+break p = span (not . p)++split : (Char -> Bool) -> String -> List String+split p xs = map pack (split p (unpack xs))++ltrim : String -> String+ltrim xs with (strM xs)+    ltrim "" | StrNil = ""+    ltrim (strCons x xs) | StrCons _ _+        = if (isSpace x) then (ltrim xs) else (strCons x xs)++trim : String -> String+trim xs = ltrim (rev (ltrim (rev xs)))+
+ lib/prelude/vect.idr view
@@ -0,0 +1,56 @@+module prelude.vect++import prelude.nat+import prelude.fin++%access public++infixr 7 :: ++data Vect : Set -> Nat -> Set where+    Nil   : Vect a O+    (::)  : a -> Vect a k -> Vect a (S k) ++tail : Vect a (S n) -> Vect a n+tail (x :: xs) = xs++lookup : Fin n -> Vect a n -> a+lookup fO     (x :: xs) = x+lookup (fS k) (x :: xs) = lookup k xs+lookup fO      [] impossible+lookup (fS _)  [] impossible+ +app : Vect a n -> Vect a m -> Vect a (n + m)+app []        ys = ys+app (x :: xs) ys = x :: app xs ys++filter : (a -> Bool) -> Vect a n -> (p ** Vect a p)+filter p [] = ( _ ** [] )+filter p (x :: xs) +    = let (_ ** xs') = filter p xs in+          if (p x) then ( _ ** x :: xs' ) else ( _ ** xs' )++map : (a -> b) -> Vect a n -> Vect b n+map f [] = []+map f (x :: xs) = f x :: map f xs++rev : Vect a n -> Vect a n+rev xs = revAcc [] xs where+  revAcc : Vect a n -> Vect a m -> Vect a (n + m)+  revAcc acc []        ?= acc+  revAcc acc (x :: xs) ?= revAcc (x :: acc) xs++---------- Proofs ----------++revAcc_lemma_2 = proof {+    intros;+    rewrite sym (plusn_Sm n k);+    exact value;+}++revAcc_lemma_1 = proof {+    intros;+    rewrite sym (plusnO n);+    exact value;+}+
− lib/state.idr
@@ -1,29 +0,0 @@-namespace State {--  State : Set -> Set -> Set;-  State s a = s -> (a & s);--  bind : State s a -> (a -> State s b) -> State s b;-  bind fa k state with fa state {-     | (av, state') = k av state';-  }--  ret : a -> State s a;-  ret av state = (av, state);--  get : State s s;-  get state = (state, state);--  put : s -> State s ();-  put state _ = (II, state);--  runState : State s a -> s -> (a & s);-  runState s init = s init;--  execState : State s a -> s -> s;-  execState s init = snd (runState s init);--  evalState : State s a -> s -> a;-  evalState s init = fst (runState s init);--}
− lib/string.idr
@@ -1,247 +0,0 @@-include "list.idr";--strLen: String -> Int; [inline]-strLen str = __strlen str;--strEq: String -> String -> Bool; [inline]-strEq s1 s2 = __strEq s1 s2;--charEq : Char -> Char -> Bool; [inline]-charEq c1 c2 = __charToInt c1 == __charToInt c2;--concat: String -> String -> String; [inline]-concat s1 s2 = __concat s1 s2;--strNull: String -> Bool; [inline]-strNull s = strEq s "";--strHead: String -> Maybe Char; [inline]-strHead s = if (strNull s) then Nothing else (Just (__strHead s));--strTail: String -> Maybe String; [inline]-strTail s = if (strNull s) then Nothing else (Just (__strTail s));--strRev : String -> String; [inline]-strRev s = __strRev s;--substr : String -> Int -> Int -> String; [inline]-substr s start len = __substr s start len;--strFind : String -> Char -> Int; [inline]-strFind s c = __strFind s c;--strSplit : Char -> String -> (String & String);-strSplit c str = let idx = strFind str c in-	 if (idx == (-1)) then (str, "") else-	 (substr str 0 idx, substr str (idx+1) (strLen str - (idx+1)));---- Some more, faster, string manipulations--strHead' : (x:String) -> (so (not (strNull x))) -> Char;-strHead' x p = __strHead x;--strTail' : (x:String) -> (so (not (strNull x))) -> String;-strTail' x p = __strTail x;--strCons: Char -> String -> String; [inline]-strCons c s = __strCons c s;--strUncons: String -> Maybe (Char & String); [inline]-strUncons s with (strHead s, strTail s) {-  | (Just h,  Just t)  = Just (h, t);-  | (Nothing, Nothing) = Nothing;-}--{-- A view of strings, for better, faster, pattern matching --}--data StrM : String -> Set where-   StrNil : StrM ""- | StrCons : (x:Char) -> (xs:String) -> StrM (strCons x xs);--strM : (x:String) -> StrM x;-strM x with choose (strNull x) {-   | Left p ?= StrCons (strHead' x p) (strTail' x p);     [strMleft]-   | Right p ?= StrNil;                                   [strMright]-}--strMright proof {-  %intro;-  %believe value; -- it's a primitive operation, we have to believe it!-  %qed;-};--strMleft proof {-  %intro;-  %believe value; -- it's a primitive operation, we have to believe it!-  %qed;-};---charAt: Int -> String -> Maybe Char; [inline]-charAt x str =-  if (strLen str > x && x >= 0) then (Just (__strgetIdx str x))-                                else Nothing;--showInt: Int -> String; [inline]-showInt x = __toString x;--readInt: String -> Maybe Int;-readInt str = let x = __toInt str-              in  if (strEq str (showInt x))-                     then (Just x)-                     else Nothing;--showNat: Nat -> String;-showNat n = __toString (natToInt n);--readNat: String -> Maybe Nat;-readNat str with readInt str {-  | Just x  = if (x >= 0) then (Just (intToNat x)) else Nothing;-  | Nothing = Nothing;-}--showFloat: Float -> String;-showFloat n = __floatToString n;--strToList: String -> List Char;-strToList s with strUncons s {-  | Just (h, t) = Cons h (strToList t);-  | Nothing     = Nil;-}--listToStr: List Char -> String;-listToStr = foldr strCons "";---- TODO if the change to the parser breaks things, the sigma pattern will---      need parens around-strToVect: String -> (n ** Vect Char n);-strToVect s with strUncons s {-    | Just (c, cs) with strToVect cs {-    | <| cs' |> = <| c :: cs' |>;-  }-  | Nothing      = <| VNil |>;-}--vectToStr: Vect Char n -> String;-vectToStr (h :: t) = strCons h (vectToStr t);-vectToStr VNil     = "";---data StrCmp = StrLT | StrEQ | StrGT;-strCmp: String -> String -> StrCmp;-strCmp s t =-  if      (__strLT s t) then StrLT-  else if (strEq s t)   then StrEQ-  else                       StrGT;--strSpan' : (Char -> Bool) -> String -> String -> (String & String);-strSpan' p str acc with strM str {-  strSpan' p "" acc | StrNil -         = (strRev acc, "");-  strSpan' p (strCons c cs) acc | StrCons _ _-         = if (p c) then (strSpan' p cs (strCons c acc))-    	      	    else (strRev acc, (strCons c cs));-}--strSpan : (Char -> Bool) -> String -> (String & String);-strSpan p str = strSpan' p str "";---- TODO: A collection of these in a Char library.--isSpace : Char -> Bool;-isSpace ' ' = True;-isSpace '\t' = True;-isSpace '\r' = True;-isSpace '\n' = True;-isSpace _ = False;--isNL : Char -> Bool;-isNL '\r' = True;-isNL '\n' = True;-isNL _ = False;--isAlpha : Char -> Bool;-isAlpha x = let a = __charToInt 'a' in-            let z = __charToInt 'z' in-            let A = __charToInt 'A' in-            let Z = __charToInt 'Z' in-	    let x' = __charToInt x in-	    (x' >= a && x' <= z) || (x' >= A && x' <= Z);--isDigit : Char -> Bool;-isDigit x = let a = __charToInt '0' in-            let z = __charToInt '9' in-	    let x' = __charToInt x in-	    (x' >= a && x' <= z);--words : String -> List String;-words str with (strSpan (not . isSpace) str) {-   | ("", "") = Nil;-   | (word, rest) with choose (strNull rest) {-       | Left rp with choose (strNull word) {-         | Left wp = Cons word (words (strTail' rest rp));-         | Right wp = words (strTail' rest rp);-         }-       | Right rp = Cons word Nil;-   }-}--lines : String -> List String;-lines str with (strSpan (not . isNL) str) {-   | ("", "") = Nil;-   | (line, rest) with choose (strNull rest) {-       | Left rp with choose (strNull line) {-         | Left wp = Cons line (lines (strTail' rest rp));-         | Right wp = lines (strTail' rest rp);-         }-       | Right rp = Cons line Nil;-   }-}---- Generic version of lines/words--splitBy : (Char -> Bool) -> String -> List String;-splitBy p str with (strSpan (not . p) str) {-   | ("", "") = Nil;-   | (word, rest) with choose (strNull rest) {-       | Left rp with choose (strNull word) {-         | Left wp = Cons word (splitBy p (strTail' rest rp));-         | Right wp = splitBy p (strTail' rest rp);-         }-       | Right rp = Cons word Nil;-   }-}--unlines : List String -> String;-unlines Nil = "";-unlines (Cons x xs) = x ++ "\n" ++ unlines xs;--unwords : List String -> String;-unwords Nil = "";-unwords (Cons x Nil) = x;-unwords (Cons x xs) = x ++ " " ++ unwords xs;--trimLeft : String -> String;-trimLeft str with (strSpan isSpace str) {-   | (spcs, rest) = rest;-}--trimRight : String -> String;-trimRight x = strRev (trimLeft (strRev x));--trim : String -> String;-trim x = trimLeft (strRev (trimLeft (strRev x)));--mapStr : (Char -> Char) -> String -> String;-mapStr f str with strM str {- mapStr f ""             | StrNil      = "";- mapStr f (strCons c cs) | StrCons _ _ = strCons (f c) (mapStr f cs);-}--toLower : Char -> Char;-toLower x = let xi = __charToInt x in-	    let Ai = __charToInt 'A' in-	    let ai = __charToInt 'a' in-	    let Zi = __charToInt 'Z' in-	    if (xi>=Ai && xi<=Zi) then (__intToChar (xi+ai-Ai)) else x;-
lib/system.idr view
@@ -1,18 +1,27 @@--- System/OS interaction functions+module system -namespace System {+import prelude -  numArgs = mkForeign (FFun "epic_numArgs" [] FInt); [%eval]-  getArgn = mkForeign (FFun "epic_getArg" [FInt] FStr); [%eval]+%access public -  getArgs' : List String -> Int -> IO (List String);-  getArgs' acc 0 = return acc;-  getArgs' acc n = do { arg <- getArgn (n-1);-                        getArgs' (Cons arg acc) (n-1); -                      };+getArgs : IO (List String)+getArgs = do n <- numArgs+             ga' [] 0 n +  where+    numArgs : IO Int+    numArgs = mkForeign (FFun "epic_numArgs" [] FInt) -  getArgs : IO (List String);-  getArgs = do { num <- numArgs;-                 getArgs' [] num; };+    getArg : Int -> IO String+    getArg x = mkForeign (FFun "epic_getArg" [FInt] FString) x -}+    ga' : List String -> Int -> Int -> IO (List String)+    ga' acc i n = if (i == n) then (return $ rev acc) else+                    do arg <- getArg i+                       ga' (arg :: acc) (i+1) n++getEnv : String -> IO String+getEnv x = mkForeign (FFun "getenv" [FString] FString) x++exit : Int -> IO ()+exit code = mkForeign (FFun "exit" [FInt] FUnit) code+
− lib/tactics.idr
@@ -1,11 +0,0 @@-data Tactic : Set where-    TFill : {a:Set} -> a -> Tactic-  | TRefine : String -> Tactic-  | TTrivial : Tactic-  | TDecide : {a:Set} -> Maybe a -> Tactic-  | TSearchContext : Tactic-  | TTry : Tactic -> Tactic -> Tactic-  | TSeq : Tactic -> Tactic -> Tactic-  | TThen : Tactic -> Tactic -> Tactic-  | TThenAll : Tactic -> Tactic -> Tactic-  | TFail : String -> Tactic;
− lib/vect.idr
@@ -1,71 +0,0 @@-include "nat.idr";--infixr 5 ::;--data Vect : Set -> Nat -> Set where-   VNil : Vect A O- | (::) : A -> (Vect A k) -> (Vect A (S k));--data Fin : Nat -> Set where-   fO : Fin (S k)- | fS : (Fin k) -> (Fin (S k));--finToNat : Fin k -> Nat;-finToNat fO = O;-finToNat (fS k) = S (finToNat k);--natToFin : (x:Nat) -> Fin (S x);-natToFin O = fO;-natToFin (S k) = fS (natToFin k);--ltFin : Fin n -> Fin n -> Bool;-ltFin fO (fS x) = True;-ltFin (fS x) fO = False;-ltFin fO fO = False;-ltFin (fS x) (fS y) = ltFin x y;--vlookup : (Fin k) -> (Vect A k) -> A;-vlookup fO (x :: xs) = x;-vlookup (fS k) (x :: xs) = vlookup k xs;--weakenFin : Fin n -> Fin (S n);-weakenFin fO = fO;-weakenFin (fS k) = fS (weakenFin k);--vmap : (A->B) -> (Vect A n) -> (Vect B n);-vmap f VNil = VNil;-vmap f (x :: xs) = f x :: vmap f xs;--vapp : (Vect A n) -> (Vect A m) -> (Vect A (plus n m));-vapp VNil ys = ys;-vapp (x :: xs) ys = x :: vapp xs ys;---- Membership predicate for vectors, and means to compute one.--using (A:Set, n:Nat, i:Fin n, x:A, y:A, xs:Vect A n) {--  data ElemIs : (Fin n) -> A -> (Vect A n) -> Set where-     first : (ElemIs fO x (x :: xs))-   | later : (ElemIs i x xs) -> (ElemIs (fS i) x (y :: xs));-}--elemIs : (i:Fin n) -> (xs:Vect A n) -> (ElemIs i (vlookup i xs) xs);-elemIs fO (x :: xs) = first;-elemIs (fS k) (x :: xs) = later (elemIs k xs);--isElemAuxO : {x:A} -> {xs: Vect A n} -> -	     (y:A) ->-	     (eq: (Maybe (x=y))) ->-	     (Maybe (ElemIs fO x (y :: xs)));-isElemAuxO {x=y} y (Just (refl _)) = Just first;-isElemAuxO y Nothing = Nothing;--isElem : (eq:(a:A)->(b:A)->(Maybe (a=b)))->-	 (i:Fin n) -> (x:A) -> (xs:Vect A n) -> (Maybe (ElemIs i x xs));-isElem eq i x VNil = Nothing;-isElem eq fO x (y :: xs) = isElemAuxO y (eq x y);-isElem eq (fS i) x (y :: xs) = mMap later (isElem eq i x xs);--vfoldl : (a -> b -> a) -> a -> (Vect b n) -> a;-vfoldl f z VNil = z;-vfoldl f z (x :: xs) = vfoldl f (f z x) xs;
+ src/Core/CaseTree.hs view
@@ -0,0 +1,216 @@+module Core.CaseTree(CaseDef(..), SC(..), CaseAlt(..), CaseTree,+                     simpleCase, small) where++import Core.TT++import Control.Monad.State+import Debug.Trace++data CaseDef = CaseDef [Name] SC+    deriving Show++data SC = Case Name [CaseAlt]+        | STerm Term+        | UnmatchedCase String -- error message+    deriving Show+{-! +deriving instance Binary SC +!-}++data CaseAlt = ConCase Name Int [Name] SC+             | ConstCase Const         SC+             | DefaultCase             SC+    deriving Show+{-! +deriving instance Binary CaseAlt +!-}++type CaseTree = SC+type Clause   = ([Pat], Term)+type CS = Int++-- simple terms can be inlined trivially - good for primitives in particular+small :: SC -> Bool+-- small (STerm t) = True+small _ = False++simpleCase :: Bool -> Bool -> [(Term, Term)] -> CaseDef+simpleCase tc cover [] +                 = CaseDef [] (UnmatchedCase "No pattern clauses")+simpleCase tc cover cs +                 = let pats    = map (\ (l, r) -> (toPats tc l, r)) cs+                       numargs = length (fst (head pats)) +                       ns      = take numargs args+                       tree    = evalState (match ns pats (defaultCase cover)) numargs in+                       CaseDef ns (prune tree)+    where args = map (\i -> MN i "e") [0..]+          defaultCase True = STerm Erased+          defaultCase False = UnmatchedCase "Error"++data Pat = PCon Name Int [Pat]+         | PConst Const+         | PV Name+         | PAny+    deriving Show++-- If there are repeated variables, take the *last* one (could be name shadowing+-- in a where clause, so take the most recent).++toPats :: Bool -> Term -> [Pat]+toPats tc f = reverse (toPat tc (getArgs f)) where+   getArgs (App f a) = a : getArgs f+   getArgs _ = []++toPat :: Bool -> [Term] -> [Pat]+toPat tc tms = evalState (mapM (\x -> toPat' x []) tms) []+  where+    toPat' (P (DCon t a) n _) args = do args' <- mapM (\x -> toPat' x []) args+                                        return $ PCon n t args'+    -- Typecase+    toPat' (P (TCon t a) n _) args | tc +                                   = do args' <- mapM (\x -> toPat' x []) args+                                        return $ PCon n t args'+    toPat' (Constant IType)   [] | tc = return $ PCon (UN "Int")    1 [] +    toPat' (Constant FlType)  [] | tc = return $ PCon (UN "Float")  2 [] +    toPat' (Constant ChType)  [] | tc = return $ PCon (UN "Char")   3 [] +    toPat' (Constant StrType) [] | tc = return $ PCon (UN "String") 4 [] +    toPat' (Constant PtrType) [] | tc = return $ PCon (UN "Ptr")    5 [] +    toPat' (Constant BIType)  [] | tc = return $ PCon (UN "Integer") 6 [] ++    toPat' (P Bound n _)      []   = do ns <- get+                                        if n `elem` ns +                                          then return PAny +                                          else do put (n : ns)+                                                  return (PV n)+    toPat' (App f a)          args = toPat' f (a : args)+    toPat' (Constant (I c)) [] = return $ PConst (I c) +    toPat' _                _  = return PAny+++data Partition = Cons [Clause]+               | Vars [Clause]++isVarPat (PV _ : ps , _) = True+isVarPat (PAny : ps , _) = True+isVarPat _               = False++isConPat (PCon _ _ _ : ps, _) = True+isConPat (PConst _   : ps, _) = True+isConPat _                    = False++partition :: [Clause] -> [Partition]+partition [] = []+partition ms@(m : _)+    | isVarPat m = let (vars, rest) = span isVarPat ms in+                       Vars vars : partition rest+    | isConPat m = let (cons, rest) = span isConPat ms in+                       Cons cons : partition rest+partition xs = error $ "Partition " ++ show xs++match :: [Name] -> [Clause] -> SC -- error case+                            -> State CS SC+match [] (([], ret) : _) err = return $ STerm ret -- run out of arguments+match vs cs err = mixture vs (partition cs) err++mixture :: [Name] -> [Partition] -> SC -> State CS SC+mixture vs [] err = return err+mixture vs (Cons ms : ps) err = do fallthrough <- mixture vs ps err+                                   conRule vs ms fallthrough+mixture vs (Vars ms : ps) err = do fallthrough <- mixture vs ps err+                                   varRule vs ms fallthrough++data ConType = CName Name Int -- named constructor+             | CConst Const -- constant, not implemented yet++data Group = ConGroup ConType -- Constructor+                      [([Pat], Clause)] -- arguments and rest of alternative++conRule :: [Name] -> [Clause] -> SC -> State CS SC+conRule (v:vs) cs err = do groups <- groupCons cs+                           caseGroups (v:vs) groups err++caseGroups :: [Name] -> [Group] -> SC -> State CS SC+caseGroups (v:vs) gs err = do g <- altGroups gs+                              return $ Case v g+  where+    altGroups [] = return [DefaultCase err]+    altGroups (ConGroup (CName n i) args : cs)+        = do g <- altGroup n i args+             rest <- altGroups cs+             return (g : rest)+    altGroups (ConGroup (CConst c) args : cs) +        = do g <- altConstGroup c args+             rest <- altGroups cs+             return (g : rest)++    altGroup n i gs = do (newArgs, nextCs) <- argsToAlt gs+                         matchCs <- match (newArgs ++ vs) nextCs err+                         return $ ConCase n i newArgs matchCs+    altConstGroup n gs = do (_, nextCs) <- argsToAlt gs+                            matchCs <- match vs nextCs err+                            return $ ConstCase n matchCs++argsToAlt :: [([Pat], Clause)] -> State CS ([Name], [Clause])+argsToAlt [] = return ([], [])+argsToAlt rs@((r, m) : _)+    = do newArgs <- getNewVars r+         return (newArgs, addRs rs)+  where +    getNewVars [] = return []+    getNewVars ((PV n) : ns) = do nsv <- getNewVars ns+                                  return (n : nsv)+    getNewVars (_ : ns) = do v <- getVar+                             nsv <- getNewVars ns+                             return (v : nsv)+    addRs [] = []+    addRs ((r, (ps, res)) : rs) = ((r++ps, res) : addRs rs)++getVar :: State CS Name+getVar = do v <- get; put (v+1); return (MN v "e")++groupCons :: [Clause] -> State CS [Group]+groupCons cs = gc [] cs+  where+    gc acc [] = return acc+    gc acc ((p : ps, res) : cs) = +        do acc' <- addGroup p ps res acc+           gc acc' cs+    addGroup p ps res acc = case p of+        PCon con i args -> return $ addg con i args (ps, res) acc+        PConst cval -> return $ addConG cval (ps, res) acc+        pat -> fail $ show pat ++ " is not a constructor or constant (can't happen)"++    addg con i conargs res [] = [ConGroup (CName con i) [(conargs, res)]]+    addg con i conargs res (g@(ConGroup (CName n j) cs):gs)+        | i == j = ConGroup (CName n i) (cs ++ [(conargs, res)]) : gs+        | otherwise = g : addg con i conargs res gs++    addConG con res [] = [ConGroup (CConst con) [([], res)]]+    addConG con res (g@(ConGroup (CConst n) cs) : gs)+        | con == n = ConGroup (CConst n) (cs ++ [([], res)]) : gs+        | otherwise = g : addConG con res gs++varRule :: [Name] -> [Clause] -> SC -> State CS SC+varRule (v : vs) alts err =+    do let alts' = map (repVar v) alts+       match vs alts' err+  where+    repVar v (PV p : ps , res) = (ps, subst p (P Bound v (V 0)) res)+    repVar v (PAny : ps , res) = (ps, res)++prune :: SC -> SC+prune (Case n alts) +    = let alts' = map pruneAlt $ +                      filter notErased alts in+          case alts' of+            [] -> STerm Erased+            as  -> Case n as+    where pruneAlt (ConCase n i ns sc) = ConCase n i ns (prune sc)+          pruneAlt (ConstCase c sc) = ConstCase c (prune sc)+          pruneAlt (DefaultCase sc) = DefaultCase (prune sc)++          notErased (DefaultCase (STerm Erased)) = False+          notErased _ = True+prune t = t++
+ src/Core/Constraints.hs view
@@ -0,0 +1,52 @@+module Core.Constraints(ucheck) where
+
+import Core.TT
+
+import Control.Applicative
+import Control.Arrow
+import Control.Monad.Error
+import Control.Monad.RWS
+import Control.Monad.State
+import Data.List
+import Data.Maybe
+import qualified Data.Map as M
+
+
+ucheck :: [(UConstraint, FC)] -> TC ()
+ucheck cs = acyclic rels (map fst (M.toList rels))
+  where lhs (ULT l _) = l
+        lhs (ULE l _) = l
+        rels = mkRels cs M.empty
+
+type Relations = M.Map UExp [(UConstraint, FC)]
+
+mkRels :: [(UConstraint, FC)] -> Relations -> Relations
+mkRels [] acc = acc
+mkRels ((c, f) : cs) acc 
+    = case M.lookup (lhs c) acc of
+            Nothing -> mkRels cs (M.insert (lhs c) [(c,f)] acc)
+            Just rs -> mkRels cs (M.insert (lhs c) ((c,f):rs) acc)
+  where lhs (ULT l _) = l
+        lhs (ULE l _) = l
+
+acyclic :: Relations -> [UExp] -> TC ()
+acyclic r cvs = checkCycle (FC "root" 0) r [] 0 cvs 
+  where
+    checkCycle :: FC -> Relations -> [UExp] -> Int -> [UExp] -> TC ()
+    checkCycle fc r path inc [] = return ()
+    checkCycle fc r path inc (c : cs)
+        = do check fc path inc c
+             -- Remove c from r since we know there's no cycles now
+             let r' = M.insert c [] r
+             checkCycle fc r' path inc cs
+
+    check fc path inc (UVar x) | x < 0 = return ()
+    check fc path inc cv
+        | inc > 0 && cv `elem` path = Error $ At fc UniverseError
+        | otherwise = case M.lookup cv r of
+                            Nothing       -> return ()
+                            Just cs -> mapM_ (next (cv:path) inc) cs
+    
+    next path inc (ULT l r, fc) = check fc path (inc + 1) r
+    next path inc (ULE l r, fc) = check fc path inc r
+
+ src/Core/CoreParser.hs view
@@ -0,0 +1,148 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}++module Core.CoreParser(parseTerm, parseFile, parseDef, pTerm, iName, idrisDef) where++import Core.TT++import Text.ParserCombinators.Parsec+import Text.ParserCombinators.Parsec.Expr+import Text.ParserCombinators.Parsec.Language+import qualified Text.ParserCombinators.Parsec.Token as PTok++import Control.Monad.State+import Debug.Trace++type TokenParser a = PTok.TokenParser a++idrisDef = haskellDef { +              opStart = iOpStart,+              opLetter = iOpLetter,+              identLetter = identLetter haskellDef <|> lchar '.',+              reservedOpNames = [":", "..", "=", "\\", "|", "<-", "->", "=>", "**"],+              reservedNames = ["let", "in", "data", "Set", +                               "do", "dsl", "import", "impossible", +                               "case", "of",+                               "infix", "infixl", "infixr", "prefix",+                               "where", "with", "forall", "syntax", "proof",+                               "using", "params", "namespace", "class", "instance",+                               "public", "private", "abstract",+                               "Int", "Integer", "Float", "Char", "String", "Ptr"]+           } ++iOpStart = oneOf ":!#$%&*+./<=>?@\\^|-~"+iOpLetter = oneOf ":!#$%&*+./<=>?@\\^|-~"+--          <|> letter++lexer :: TokenParser a+lexer  = PTok.makeTokenParser idrisDef++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++type CParser a = GenParser Char a++parseFile = runParser pTestFile () "(input)"+parseDef = runParser pDef () "(input)"+parseTerm = runParser pTerm () "(input)"++pTestFile :: CParser a RProgram+pTestFile = do p <- many1 pDef ; eof+               return p++iName :: [String] -> CParser a Name+iName bad = do x <- identifier+               when (x `elem` bad) $ fail "Reserved identifier"+               return $ mkNS (reverse (parseName x))+  where+    mkNS [x] = UN x+    mkNS (x:xs) = NS (UN x) xs +    parseName x = case span (/= '.') x of+                       (x, "") -> [x]+                       (x, '.':y) -> x : parseName y++pDef :: CParser a (Name, RDef)+pDef = try (do x <- iName []; lchar ':'; ty <- pTerm+               lchar '='+               tm <- pTerm+               lchar ';'+               return (x, RFunction (RawFun ty tm)))+       <|> do x <- iName []; lchar ':'; ty <- pTerm; lchar ';'+              return (x, RConst ty)+       <|> do (x, d) <- pData; lchar ';'+              return (x, RData d)++app :: CParser a (Raw -> Raw -> Raw)+app = do whiteSpace ; return RApp++arrow :: CParser a (Raw -> Raw -> Raw)+arrow = do symbol "->" ; return $ \s t -> RBind (MN 0 "X") (Pi s) t++pTerm :: CParser a Raw+pTerm = try (do chainl1 pNoApp app)+           <|> pNoApp++pNoApp :: CParser a Raw+pNoApp = try (chainr1 pExp arrow)+           <|> pExp+pExp :: CParser a Raw+pExp = do lchar '\\'; x <- iName []; lchar ':'; ty <- pTerm+          symbol "=>";+          sc <- pTerm+          return (RBind x (Lam ty) sc)+       <|> try (do lchar '?'; x <- iName []; lchar ':'; ty <- pTerm+                   lchar '.';+                   sc <- pTerm+                   return (RBind x (Hole ty) sc))+       <|> try (do lchar '('; +                   x <- iName []; lchar ':'; ty <- pTerm+                   lchar ')';+                   symbol "->";+                   sc <- pTerm+                   return (RBind x (Pi ty) sc))+       <|> try (do lchar '('; +                   t <- pTerm+                   lchar ')'+                   return t)+       <|> try (do symbol "??";+                   x <- iName []; lchar ':'; ty <- pTerm+                   lchar '=';+                   val <- pTerm+                   sc <- pTerm+                   return (RBind x (Guess ty val) sc))+       <|> try (do reserved "let"; +                   x <- iName []; lchar ':'; ty <- pTerm+                   lchar '=';+                   val <- pTerm+                   reserved "in";+                   sc <- pTerm+                   return (RBind x (Let ty val) sc))+       <|> try (do lchar '_'; +                   x <- iName []; lchar ':'; ty <- pTerm+                   lchar '.';+                   sc <- pTerm+                   return (RBind x (PVar ty) sc))+       <|> try (do reserved "Set"+                   return RSet)+       <|> try (do x <- iName []+                   return (Var x))++pData :: CParser a (Name, RawDatatype)+pData = do reserved "data"; x <- iName []; lchar ':'; ty <- pTerm; reserved "where"+           cs <- many pConstructor+           return (x, RDatatype x ty cs)++pConstructor :: CParser a (Name, Raw)+pConstructor = do lchar '|'+                  c <- iName []; lchar ':'; ty <- pTerm+                  return (c, ty)+
+ src/Core/Elaborate.hs view
@@ -0,0 +1,435 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, PatternGuards #-}++{- A high level language of tactic composition, for building+   elaborators from a high level language into the core theory.++   This is our interface to proof construction, rather than+   ProofState, because this gives us a language to build derived+   tactics out of the primitives.+-}++module Core.Elaborate(module Core.Elaborate, +                      module Core.ProofState) where++import Core.ProofState+import Core.TT+import Core.Evaluate+import Core.Typecheck++import Control.Monad.State+import Data.Char+import Data.List+import Debug.Trace++-- I don't really want this here, but it's useful for the test shell+data Command = Theorem Name Raw+             | Eval Raw+             | Quit+             | Print Name+             | Tac (Elab ())++data ElabState aux = ES (ProofState, aux) String (Maybe (ElabState aux))+  deriving Show+type Elab' aux a = StateT (ElabState aux) TC a+type Elab a = Elab' () a++proof :: ElabState aux -> ProofState+proof (ES (p, _) _ _) = p++saveState :: Elab' aux ()+saveState = do e@(ES p s _) <- get+               put (ES p s (Just e))++loadState :: Elab' aux ()+loadState = do (ES p s e) <- get+               case e of+                  Just st -> put st+                  _ -> fail "Nothing to undo"++erun :: FC -> Elab' aux a -> Elab' aux a+erun f elab = do s <- get+                 case runStateT elab s of+                    OK (a, s')     -> do put s'+                                         return a+                    Error (At f e) -> lift $ Error (At f e)+                    Error e        -> lift $ Error (At f e)++runElab :: aux -> Elab' aux a -> ProofState -> TC (a, ElabState aux)+runElab a e ps = runStateT e (ES (ps, a) "" Nothing)++execElab :: aux -> Elab' aux a -> ProofState -> TC (ElabState aux)+execElab a e ps = execStateT e (ES (ps, a) "" Nothing)++initElaborator :: Name -> Context -> Type -> ProofState+initElaborator = newProof++elaborate :: Context -> Name -> Type -> aux -> Elab' aux a -> TC (a, String)+elaborate ctxt n ty d elab = do let ps = initElaborator n ctxt ty+                                (a, ES ps' str _) <- runElab d elab ps+                                return (a, str)++updateAux :: (aux -> aux) -> Elab' aux ()+updateAux f = do ES (ps, a) l p <- get+                 put (ES (ps, f a) l p)++getAux :: Elab' aux aux+getAux = do ES (ps, a) _ _ <- get+            return a++processTactic' t = do ES (p, a) logs prev <- get+                      (p', log) <- lift $ processTactic t p+                      put (ES (p', a) (logs ++ log) prev)+                      return ()++-- Some handy gadgets for pulling out bits of state++-- get the global context+get_context :: Elab' aux Context+get_context = do ES p _ _ <- get+                 return (context (fst p))++-- get the proof term+get_term :: Elab' aux Term+get_term = do ES p _ _ <- get+              return (pterm (fst p))++-- get the local context at the currently in focus hole+get_env :: Elab' aux Env+get_env = do ES p _ _ <- get+             lift $ envAtFocus (fst p)++get_holes :: Elab' aux [Name]+get_holes = do ES p _ _ <- get+               return (holes (fst p))++-- get the current goal type+goal :: Elab' aux Type+goal = do ES p _ _ <- get+          b <- lift $ goalAtFocus (fst p)+          return (binderTy b)++-- typecheck locally+get_type :: Raw -> Elab' aux Type+get_type tm = do ctxt <- get_context+                 env <- get_env+                 (val, ty) <- lift $ check ctxt env tm+                 return (finalise ty)++-- get holes we've deferred for later definition+get_deferred :: Elab' aux [Name]+get_deferred = do ES p _ _ <- get+                  return (deferred (fst p))++get_inj :: Elab' aux [(Term, Term, Term)]+get_inj = do ES p _ _ <- get+             return (injective (fst p))++checkInjective :: (Term, Term, Term) -> Elab' aux ()+checkInjective (tm, l, r) = if isInjective tm then return ()+                                else lift $ tfail (NotInjective tm l r) ++-- get instance argument names+get_instances :: Elab' aux [Name]+get_instances = do ES p _ _ <- get+                   return (instances (fst p))++-- given a desired hole name, return a unique hole name+unique_hole :: Name -> Elab' aux Name+unique_hole n = do ES p _ _ <- get+                   let bs = bound_in (pterm (fst p)) ++ bound_in (ptype (fst p))+                   n' <- uniqueNameCtxt (context (fst p)) n (holes (fst p) ++ bs)+                   return n'+  where+    bound_in (Bind n b sc) = n : bi b ++ bound_in sc+      where+        bi (Let t v) = bound_in t ++ bound_in v+        bi (Guess t v) = bound_in t ++ bound_in v+        bi b = bound_in (binderTy b)+    bound_in (App f a) = bound_in f ++ bound_in a+    bound_in _ = []++uniqueNameCtxt :: Context -> Name -> [Name] -> Elab' aux Name+uniqueNameCtxt ctxt n hs +    | n `elem` hs = uniqueNameCtxt ctxt (nextName n) hs+    | [_] <- lookupTy Nothing n ctxt = uniqueNameCtxt ctxt (nextName n) hs+    | otherwise = return n++elog :: String -> Elab' aux ()+elog str = do ES p logs prev <- get+              put (ES p (logs ++ str ++ "\n") prev)++-- The primitives, from ProofState++attack :: Elab' aux ()+attack = processTactic' Attack++claim :: Name -> Raw -> Elab' aux ()+claim n t = processTactic' (Claim n t)++exact :: Raw -> Elab' aux ()+exact t = processTactic' (Exact t)++fill :: Raw -> Elab' aux ()+fill t = processTactic' (Fill t)++prep_fill :: Name -> [Name] -> Elab' aux ()+prep_fill n ns = processTactic' (PrepFill n ns)++complete_fill :: Elab' aux ()+complete_fill = processTactic' CompleteFill++solve :: Elab' aux ()+solve = processTactic' Solve++start_unify :: Name -> Elab' aux ()+start_unify n = processTactic' (StartUnify n)++end_unify :: Elab' aux ()+end_unify = processTactic' EndUnify++regret :: Elab' aux ()+regret = processTactic' Regret++compute :: Elab' aux ()+compute = processTactic' Compute++eval_in :: Raw -> Elab' aux ()+eval_in t = processTactic' (EvalIn t)++check_in :: Raw -> Elab' aux ()+check_in t = processTactic' (CheckIn t)++intro :: Maybe Name -> Elab' aux ()+intro n = processTactic' (Intro n)++introTy :: Raw -> Maybe Name -> Elab' aux ()+introTy ty n = processTactic' (IntroTy ty n)++forall :: Name -> Raw -> Elab' aux ()+forall n t = processTactic' (Forall n t)++letbind :: Name -> Raw -> Raw -> Elab' aux ()+letbind n t v = processTactic' (LetBind n t v)++rewrite :: Raw -> Elab' aux ()+rewrite tm = processTactic' (Rewrite tm)++patvar :: Name -> Elab' aux ()+patvar n = do env <- get_env+              if (n `elem` map fst env) then do apply (Var n) []; solve+                else do n' <- case n of+                                    UN _ -> return n+                                    MN _ _ -> unique_hole n+                                    NS _ _ -> return n+                        processTactic' (PatVar n')++patbind :: Name -> Elab' aux ()+patbind n = processTactic' (PatBind n)++focus :: Name -> Elab' aux ()+focus n = processTactic' (Focus n)++movelast :: Name -> Elab' aux ()+movelast n = processTactic' (MoveLast n)++defer :: Name -> Elab' aux ()+defer n = do n' <- unique_hole n+             processTactic' (Defer n')++instanceArg :: Name -> Elab' aux ()+instanceArg n = processTactic' (Instance n)++proofstate :: Elab' aux ()+proofstate = processTactic' ProofState++reorder_claims :: Name -> Elab' aux ()+reorder_claims n = processTactic' (Reorder n)++qed :: Elab' aux Term+qed = do processTactic' QED+         ES p _ _ <- get+         return (pterm (fst p))++undo :: Elab' aux ()+undo = processTactic' Undo++prepare_apply :: Raw -> [Bool] -> Elab' aux [Name]+prepare_apply fn imps =+    do ty <- get_type fn+       ctxt <- get_context+       env <- get_env+       -- let claims = getArgs ty imps+       claims <- mkClaims (normalise ctxt env ty) imps []+       ES (p, a) s prev <- get+       -- reverse the claims we made so that args go left to right+       let n = length (filter not imps)+       let (h : hs) = holes p+       put (ES (p { holes = h : (reverse (take n hs) ++ drop n hs) }, a) s prev)+--        case claims of+--             [] -> return ()+--             (h : _) -> reorder_claims h+       return claims+  where+    mkClaims (Bind n' (Pi t) sc) (i : is) claims =+        do n <- unique_hole (mkMN n')+--            when (null claims) (start_unify n)+           let sc' = instantiate (P Bound n t) sc+           claim n (forget t)+           when i (movelast n)+           mkClaims sc' is (n : claims)+    mkClaims t [] claims = return (reverse claims)+    mkClaims _ _ _ = fail $ "Wrong number of arguments for " ++ show fn++    doClaim ((i, _), n, t) = do claim n t+                                when i (movelast n)++    mkMN n@(MN _ _) = n+    mkMN n@(UN x) = MN 0 x+    mkMN (NS n xs) = NS (mkMN n) xs++apply :: Raw -> [(Bool, Int)] -> Elab' aux [Name]+apply fn imps = +    do args <- prepare_apply fn (map fst imps)+       fill (raw_apply fn (map Var args))+       -- *Don't* solve the arguments we're specifying by hand.+       -- (remove from unified list before calling end_unify)+       -- HMMM: Actually, if we get it wrong, the typechecker will complain!+       -- so do nothing+       ptm <- get_term+       let dontunify = [] -- map fst (filter (not.snd) (zip args (map fst imps)))+       ES (p, a) s prev <- get+       let (n, hs) = unified p+       let unify = (n, filter (\ (n, t) -> not (n `elem` dontunify)) hs)+       put (ES (p { unified = unify }, a) s prev)+       end_unify+       return (map (updateUnify hs) args)+  where updateUnify hs n = case lookup n hs of+                                Just (P _ t _) -> t+                                _ -> n++apply2 :: Raw -> [Maybe (Elab' aux ())] -> Elab' aux () +apply2 fn elabs = +    do args <- prepare_apply fn (map isJust elabs)+       fill (raw_apply fn (map Var args))+       elabArgs args elabs+       ES (p, a) s prev <- get+       let (n, hs) = unified p+       end_unify+       solve+  where elabArgs [] [] = return ()+        elabArgs (n:ns) (Just e:es) = do focus n; e+                                         elabArgs ns es+        elabArgs (n:ns) (_:es) = elabArgs ns es++        isJust (Just _) = False +        isJust _        = True++apply_elab :: Name -> [Maybe (Int, Elab' aux ())] -> Elab' aux ()+apply_elab n args = +    do ty <- get_type (Var n)+       ctxt <- get_context+       env <- get_env+       claims <- doClaims (normalise ctxt env ty) args []+       prep_fill n (map fst claims)+       let eclaims = sortBy (\ (_, x) (_,y) -> priOrder x y) claims+       elabClaims [] False claims+       complete_fill+       end_unify+  where+    priOrder Nothing Nothing = EQ+    priOrder Nothing _ = LT+    priOrder _ Nothing = GT+    priOrder (Just (x, _)) (Just (y, _)) = compare x y++    doClaims (Bind n' (Pi t) sc) (i : is) claims =+        do n <- unique_hole (mkMN n')+           when (null claims) (start_unify n)+           let sc' = instantiate (P Bound n t) sc+           claim n (forget t)+           doClaims sc' is ((n, i) : claims)+    doClaims t [] claims = return (reverse claims)+    doClaims _ _ _ = fail $ "Wrong number of arguments for " ++ show n++    elabClaims failed r [] +        | null failed = return ()+        | otherwise = if r then elabClaims [] False failed+                           else return ()+    elabClaims failed r ((n, Nothing) : xs) = elabClaims failed r xs+    elabClaims failed r (e@(n, Just (_, elaboration)) : xs)+        | r = try (do ES p _ _ <- get+                      focus n; elaboration; elabClaims failed r xs)+                  (elabClaims (e : failed) r xs)+        | otherwise = do ES p _ _ <- get+                         focus n; elaboration; elabClaims failed r xs++    mkMN n@(MN _ _) = n+    mkMN n@(UN x) = MN 0 x+    mkMN (NS n ns) = NS (mkMN n) ns++simple_app :: Elab' aux () -> Elab' aux () -> Elab' aux ()+simple_app fun arg =+    do a <- unique_hole (MN 0 "a")+       b <- unique_hole (MN 0 "b")+       f <- unique_hole (MN 0 "f")+       s <- unique_hole (MN 0 "s")+       claim a RSet+       claim b RSet+       claim f (RBind (MN 0 "aX") (Pi (Var a)) (Var b))+       start_unify s+       claim s (Var a)+       prep_fill f [s]+       -- try elaborating in both orders, since we might learn something useful+       -- either way+       try (do focus s; arg+               focus f; fun)+           (do focus f; fun+               focus s; arg)+       complete_fill+       end_unify++-- Abstract over an argument of unknown type, giving a name for the hole+-- which we'll fill with the argument type too.+arg :: Name -> Name -> Elab' aux ()+arg n tyhole = do ty <- unique_hole tyhole+                  claim ty RSet+                  forall n (Var ty)++-- Try a tactic, if it fails, try another+try :: Elab' aux a -> Elab' aux a -> Elab' aux a+try t1 t2 = do s <- get+               case runStateT t1 s of+                    OK (v, s') -> do put s'+                                     return v+                    Error e1 -> do put s+                                   case runStateT t2 s of+                                     OK (v, s') -> do put s'; return v+                                     Error e2 -> if score e1 > score e2 +                                                    then lift (tfail e1) +                                                    else lift (tfail e2)+                        +-- Try a selection of tactics. Exactly one must work, all others must fail+tryAll :: [(Elab' aux a, String)] -> Elab' aux a+tryAll xs = tryAll' [] (cantResolve, 0) (map fst xs)+  where+    cantResolve :: Elab' aux a+    cantResolve = fail $ "Couldn't resolve alternative: " +                                  ++ showSep ", " (map snd xs)++    tryAll' :: [Elab' aux a] -> -- successes+               (Elab' aux a, Int) -> -- smallest failure+               [Elab' aux a] -> -- still to try+               Elab' aux a+    tryAll' [res] _   [] = res+    tryAll' (_:_) _   [] = cantResolve+    tryAll' [] (f, _) [] = f+    tryAll' cs f (x:xs) = do s <- get+                             case runStateT x s of+                                    OK (v, s') -> tryAll' ((do put s'+                                                               return v):cs)  f xs+                                    Error err -> do put s+                                                    tryAll' cs (better err f) xs++    better err (f, i) = let s = score err in+                            if (s >= i) then (lift (tfail err), s)+                                        else (f, i)+
+ src/Core/Evaluate.hs view
@@ -0,0 +1,596 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances,+             PatternGuards #-}++module Core.Evaluate(normalise, normaliseC, normaliseAll,+                simplify, specialise, hnf,+                Def(..), Accessibility(..), +                Context, initContext, ctxtAlist, uconstraints, next_tvar,+                addToCtxt, setAccess, addCtxtDef, addTyDecl, addDatatype, +                addCasedef, addOperator,+                lookupTy, lookupP, lookupDef, lookupVal, lookupTyEnv, isConName,+                Value(..)) where++import Debug.Trace+import Control.Monad.State+import qualified Data.Binary as B+import Data.Binary hiding (get, put)++import Core.TT+import Core.CaseTree++type EvalState = ()+type Eval a = State EvalState a++data EvalOpt = Spec | HNF | Simplify | AtREPL+  deriving (Show, Eq)++-- VALUES (as HOAS) ---------------------------------------------------------++data Value = VP NameType Name Value+           | VV Int+           | VBind Name (Binder Value) (Value -> Eval Value)+           | VApp Value Value+           | VSet UExp+           | VErased+           | VConstant Const+           | VTmp Int++data HNF = HP NameType Name (TT Name)+         | HV Int+         | HBind Name (Binder HNF) (HNF -> Eval HNF)+         | HApp HNF [HNF] [TT Name]+         | HSet UExp+         | HConstant Const+         | HTmp Int+    deriving Show++instance Show Value where+    show x = show $ evalState (quote 10 x) ()++instance Show (a -> b) where+    show x = "<<fn>>"++-- THE EVALUATOR ------------------------------------------------------------++-- The environment is assumed to be "locally named" - i.e., not de Bruijn +-- indexed.+-- i.e. it's an intermediate environment that we have while type checking or+-- while building a proof.++normaliseC :: Context -> Env -> TT Name -> TT Name+normaliseC ctxt env t +   = evalState (do val <- eval ctxt emptyContext env t []+                   quote 0 val) ()++normaliseAll :: Context -> Env -> TT Name -> TT Name+normaliseAll ctxt env t +   = evalState (do val <- eval ctxt emptyContext env t [AtREPL]+                   quote 0 val) ()++normalise :: Context -> Env -> TT Name -> TT Name+normalise ctxt env t +   = evalState (do val <- eval ctxt emptyContext (map finalEntry env) (finalise t) []+                   quote 0 val) ()++specialise :: Context -> Ctxt [Bool] -> TT Name -> TT Name+specialise ctxt statics t +   = evalState (do val <- eval ctxt statics [] (finalise t) [Spec]+                   quote 0 val) ()++-- Like normalise, but we only reduce functions that are marked as okay to +-- inline (and probably shouldn't reduce lets?)++simplify :: Context -> Env -> TT Name -> TT Name+simplify ctxt env t +   = evalState (do val <- eval ctxt emptyContext (map finalEntry env) (finalise t) [Simplify]+                   quote 0 val) ()++hnf :: Context -> Env -> TT Name -> TT Name+hnf ctxt env t +   = evalState (do val <- eval ctxt emptyContext (map finalEntry env) (finalise t) [HNF]+                   quote 0 val) ()+++-- unbindEnv env (quote 0 (eval ctxt (bindEnv env t)))++finalEntry :: (Name, Binder (TT Name)) -> (Name, Binder (TT Name))+finalEntry (n, b) = (n, fmap finalise b)++bindEnv :: EnvTT n -> TT n -> TT n+bindEnv [] tm = tm+bindEnv ((n, Let t v):bs) tm = Bind n (NLet t v) (bindEnv bs tm)+bindEnv ((n, b):bs)       tm = Bind n b (bindEnv bs tm)++unbindEnv :: EnvTT n -> TT n -> TT n+unbindEnv [] tm = tm+unbindEnv (_:bs) (Bind n b sc) = unbindEnv bs sc++-- Evaluate in a context of locally named things (i.e. not de Bruijn indexed,+-- such as we might have during construction of a proof)++eval :: Context -> Ctxt [Bool] -> Env -> TT Name -> [EvalOpt] -> Eval Value+eval ctxt statics genv tm opts = ev [] True [] tm where+    spec = Spec `elem` opts+    simpl = Simplify `elem` opts+    atRepl = AtREPL `elem` opts++    ev stk top env (P _ n ty)+        | Just (Let t v) <- lookup n genv = ev stk top env v +    ev stk top env (P Ref n ty) = case lookupDefAcc Nothing n atRepl ctxt of+        [(Function _ tm, Public)] -> +            ev (n:stk) True env tm+        [(TyDecl nt ty, _)]       -> do vty <- ev stk True env ty+                                        return $ VP nt n vty+        [(CaseOp inl _ _ [] tree _ _, Public)] -> -- unoptimised version+           if simpl && (not inl || elem n stk) +              then liftM (VP Ref n) (ev stk top env ty)+              else do c <- evCase (n:stk) top env [] [] tree +                      case c of+                        (Nothing, _) -> liftM (VP Ref n) (ev stk top env ty)+                        (Just v, _)  -> return v+        _ -> liftM (VP Ref n) (ev stk top env ty)+    ev stk top env (P nt n ty)   = liftM (VP nt n) (ev stk top env ty)+    ev stk top env (V i) | i < length env = return $ env !! i+                     | otherwise      = return $ VV i +    ev stk top env (Bind n (Let t v) sc)+           = do v' <- ev stk top env v --(finalise v)+                sc' <- ev stk top (v' : env) sc+                wknV (-1) sc'+    ev stk top env (Bind n (NLet t v) sc)+           = do t' <- ev stk top env (finalise t)+                v' <- ev stk top env (finalise v)+                sc' <- ev stk top (v' : env) sc+                return $ VBind n (Let t' v') (\x -> return sc')+    ev stk top env (Bind n b sc) +           = do b' <- vbind env b+                return $ VBind n b' (\x -> ev stk top (x:env) sc)+       where vbind env t = fmapMB (\tm -> ev stk top env (finalise tm)) t+    ev stk top env (App f a) = do f' <- ev stk top env f+                                  a' <- ev stk False env a+                                  evApply stk top env [a'] f'+    ev stk top env (Constant c) = return $ VConstant c+    ev stk top env Erased    = return VErased+    ev stk top env (Set i)   = return $ VSet i+    +    evApply stk top env args (VApp f a) = +            evApply stk top env (a:args) f+    evApply stk top env args f = apply stk top env f args++    apply stk top env (VBind n (Lam t) sc) (a:as) +        = do a' <- sc a+             app <- apply stk top env a' as +             wknV (-1) app+    apply stk False env f args+        | spec = return $ unload env f args+    apply stk top env (VP Ref n ty)        args+        | [(CaseOp inl _ _ ns tree _ _, Public)] <- lookupDefAcc Nothing n atRepl ctxt+            = -- traceWhen (n == UN ["interp"]) (show (n, args)) $+              if simpl && (not inl || elem n stk) +                 then return $ unload env (VP Ref n ty) args+                 else do c <- evCase (n:stk) top env ns args tree+                         case c of+                           (Nothing, _) -> return $ unload env (VP Ref n ty) args+                           (Just v, rest) -> evApply stk top env rest v+        | [Operator _ i op]  <- lookupDef Nothing n ctxt+            = if (i <= length args)+                 then case op (take i args) of+                    Nothing -> return $ unload env (VP Ref n ty) args+                    Just v  -> evApply stk top env (drop i args) v+                 else return $ unload env (VP Ref n ty) args+    apply stk top env f (a:as) = return $ unload env f (a:as)+    apply stk top env f []     = return f++    unload env f [] = f+    unload env f (a:as) = unload env (VApp f a) as++    evCase stk top env ns args tree+        | length ns <= length args +             = do let args' = take (length ns) args+                  let rest  = drop (length ns) args+                  t <- evTree stk top env (zipWith (\n t -> (n, t)) ns args') tree+                  return (t, rest)+        | otherwise = return (Nothing, args)++    evTree :: [Name] -> Bool -> [Value] -> [(Name, Value)] -> SC -> Eval (Maybe Value)+    evTree stk top env amap (UnmatchedCase str) = return Nothing+    evTree stk top env amap (STerm tm) +        = do let etm = pToVs (map fst amap) tm+             etm' <- ev stk top (map snd amap ++ env) etm+             return $ Just etm'+    evTree stk top env amap (Case n alts)+        = case lookup n amap of+            Just v -> do c <- chooseAlt env v (getValArgs v) alts amap+                         case c of+                            Just (altmap, sc) -> evTree stk top env altmap sc+                            _ -> do c' <- chooseAlt' stk env v (getValArgs v) alts amap+                                    case c' of+                                        Just (altmap, sc) -> evTree stk top env altmap sc+                                        _ -> return Nothing+            _ -> return Nothing++    chooseAlt' stk env _ (f, args) alts amap+        = do f' <- apply stk True env f args+             chooseAlt env f' (getValArgs f') alts amap++    chooseAlt :: [Value] -> Value -> (Value, [Value]) -> [CaseAlt] -> [(Name, Value)] ->+                 Eval (Maybe ([(Name, Value)], SC))+    chooseAlt env _ (VP (DCon i a) _ _, args) alts amap+        | Just (ns, sc) <- findTag i alts = return $ Just (updateAmap (zip ns args) amap, sc)+        | Just v <- findDefault alts      = return $ Just (amap, v)+    chooseAlt env _ (VP (TCon i a) _ _, args) alts amap+        | Just (ns, sc) <- findTag i alts = return $ Just (updateAmap (zip ns args) amap, sc)+        | Just v <- findDefault alts      = return $ Just (amap, v)+    chooseAlt env _ (VConstant c, []) alts amap+        | Just v <- findConst c alts      = return $ Just (amap, v)+        | Just v <- findDefault alts      = return $ Just (amap, v)+    chooseAlt _ _ _ _ _                     = return Nothing++    -- Replace old variable names in the map with new matches+    -- (This is possibly unnecessary since we make unique names and don't+    -- allow repeated variables...?)+    updateAmap newm amap +       = newm ++ filter (\ (x, _) -> not (elem x (map fst newm))) amap+    findTag i [] = Nothing+    findTag i (ConCase n j ns sc : xs) | i == j = Just (ns, sc)+    findTag i (_ : xs) = findTag i xs++    findDefault [] = Nothing+    findDefault (DefaultCase sc : xs) = Just sc+    findDefault (_ : xs) = findDefault xs ++    findConst c [] = Nothing+    findConst c (ConstCase c' v : xs) | c == c' = Just v+    findConst IType   (ConCase n 1 [] v : xs) = Just v +    findConst FlType  (ConCase n 2 [] v : xs) = Just v +    findConst ChType  (ConCase n 3 [] v : xs) = Just v +    findConst StrType (ConCase n 4 [] v : xs) = Just v +    findConst PtrType (ConCase n 5 [] v : xs) = Just v +    findConst c (_ : xs) = findConst c xs++    getValArgs tm = getValArgs' tm []+    getValArgs' (VApp f a) as = getValArgs' f (a:as)+    getValArgs' f as = (f, as)++class Quote a where+    quote :: Int -> a -> Eval (TT Name)++instance Quote Value where+    quote i (VP nt n v)    = liftM (P nt n) (quote i v)+    quote i (VV x)         = return $ V x+    quote i (VBind n b sc) = do sc' <- sc (VTmp i)+                                b' <- quoteB b+                                liftM (Bind n b') (quote (i+1) sc')+       where quoteB t = fmapMB (quote i) t+    quote i (VApp f a)     = liftM2 App (quote i f) (quote i a)+    quote i (VSet u)       = return $ Set u+    quote i VErased        = return $ Erased+    quote i (VConstant c)  = return $ Constant c+    quote i (VTmp x)       = return $ V (i - x - 1)++instance Quote HNF where+    quote i (HP nt n t)     = return (P nt n t)+    quote i (HV x)          = return $ V x+    quote i (HBind n b sc)  = do sc' <- sc (HTmp i)+                                 b' <- quoteB b+                                 liftM (Bind n b') (quote (i+1) sc')+        where quoteB t = fmapMB (quote i) t+    quote i (HApp f env as) = do f' <- quote i f+                                 as' <- mapM (iEnv env) as+                                 return $ mkApp f' as'+        where iEnv [] a = return a+              iEnv (x:xs) a = do x' <- quote i x+                                 iEnv xs (weakenTm (-1) (instantiate x' a))+    quote i (HSet u)        = return $ Set u+    quote i (HConstant c)   = return $ Constant c+    quote i (HTmp x)        = return $ V (i - x - 1)++wknV :: Int -> Value -> Eval Value+wknV i (VV x)         = return $ VV (x + i)+wknV i (VBind n b sc) = do b' <- fmapMB (wknV i) b+                           return $ VBind n b' (\x -> do x' <- sc x+                                                         wknV i x')+wknV i (VApp f a)     = liftM2 VApp (wknV i f) (wknV i a)+wknV i t              = return t++wknH :: Int -> HNF -> Eval HNF+wknH i (HV x)          = return $ HV (x + i)+wknH i (HBind n b sc)  = do b' <- fmapMB (wknH i) b+                            return $ HBind n b' (\x -> do x' <- sc x+                                                          wknH i x') +wknH i (HApp f env as) = liftM3 HApp (wknH i f) (return env) +                                                (return as)+wknH i t               = return t++-- HEAD NORMAL FORM ---------------------------------------------------------++eval_hnf :: Context -> Ctxt [Bool] -> Env -> TT Name -> Eval HNF+eval_hnf ctxt statics genv tm = ev [] tm where+    ev :: [HNF] -> TT Name -> Eval HNF+    ev env (P _ n ty) +        | Just (Let t v) <- lookup n genv = ev env v+    ev env (P Ref n ty) = case lookupDef Nothing n ctxt of+        [Function _ t]           -> ev env t+        [TyDecl nt ty]           -> return $ HP nt n ty+        [CaseOp inl _ _ [] tree _ _] ->+            do c <- evCase env [] [] tree+               case c of+                   (Nothing, _, _) -> return $ HP Ref n ty+                   (Just v, _, _)  -> return v+        _ -> return $ HP Ref n ty+    ev env (P nt n ty) = return $ HP nt n ty+    ev env (V i) | i < length env = return $ env !! i+                 | otherwise      = return $ HV i+    ev env (Bind n (Let t v) sc)+        = do v' <- ev env (finalise v)+             sc' <- ev (v' : env) sc+             wknH (-1) sc'+    ev env (Bind n b sc)+        = do b' <- hbind env b+             return $ HBind n b' (\x -> ev (x : env) sc)+      where hbind env t = fmapMB (\tm -> ev env (finalise tm)) t+    ev env (App f a) = evApply env [a] f+    ev env (Constant c) = return $ HConstant c+    ev env (Set i) = return $ HSet i++    evApply env args (App f a) = evApply env (a : args) f+    evApply env args f = do f' <- ev env f+                            apply env f' args++    apply env (HBind n (Lam t) sc) (a:as) = do a' <- ev env a+                                               sc' <- sc a'+                                               app <- apply env sc' as+                                               wknH (-1) app+    apply env (HP Ref n ty) args+        | [CaseOp _ _ _ ns tree _ _] <- lookupDef Nothing n ctxt+            = do c <- evCase env ns args tree+                 case c of+                    (Nothing, _, env') -> return $ unload env' (HP Ref n ty) args+                    (Just v, rest, env') -> do v' <- quote 0 v+                                               apply env' v rest+--         | Just (Operator _ i op) <- lookupDef n ctxt+--             = if (i <= length args)+--                  then case op (take i args) of+--                     Nothing -> return $ unload env (HP Ref n ty) args+--                     Just v -> evApply env (drop i args) v+--                  else return $ unload env (HP Ref n ty) args+    apply env f (a:as) = return $ unload env f (a:as)+    apply env f []     = return f+    +    unload env f [] = f+    unload env f as = HApp f env as++    evCase env ns args tree+        | length ns <= length args +             = do let args' = take (length ns) args+                  let rest  = drop (length ns) args+                  (t, env') <- evTree env (zipWith (\n t -> (n, t)) ns args') tree+                  return (t, rest, env')+        | otherwise = return (Nothing, args, env)++    evTree :: [HNF] -> [(Name, TT Name)] -> SC -> Eval (Maybe HNF, [HNF])+    evTree env amap (UnmatchedCase str) = return (Nothing, env)+    evTree env amap (STerm tm) +        = do let etm = pToVs (map fst amap) tm+             amap' <- mapM (ev env) (map snd amap)+             envw <- mapM (wknH (length amap)) env+             let env' = amap' ++ envw+             etm' <- trace (show etm) $ ev env' etm+             etmq <- quote 0 etm'+             trace ("Ev: " ++ show (etm, etmq)) $ return $ (Just etm', env')+    evTree env amap (Case n alts)+        = case lookup n amap of+             Just v -> do v' <- ev env v+                          case chooseAlt v' (getValArgs v') alts amap of+                            Just (altmap, sc) -> evTree env altmap sc+                            _ -> return (Nothing, env)++    chooseAlt :: HNF -> (HNF, [HNF], [TT Name]) -> +                 [CaseAlt] -> [(Name, TT Name)] ->+                 Maybe ([(Name, TT Name)], SC)+    chooseAlt _ (HP (DCon i a) _ _, env, args) alts amap+        | Just (ns, sc) <- findTag i alts = Just (updateAmap (zip ns args) amap, sc)+        | Just v <- findDefault alts      = Just (amap, v)+    chooseAlt _ (HP (TCon i a) _ _, env, args) alts amap+        | Just (ns, sc) <- findTag i alts = Just (updateAmap (zip ns args) amap, sc)+        | Just v <- findDefault alts      = Just (amap, v)+    chooseAlt _ (HConstant c, env, []) alts amap+        | Just v <- findConst c alts      = Just (amap, v)+        | Just v <- findDefault alts      = Just (amap, v)+    chooseAlt _ _ _ _                     = Nothing++    -- Replace old variable names in the map with new matches+    -- (This is possibly unnecessary since we make unique names and don't+    -- allow repeated variables...?)+    updateAmap newm amap +       = newm ++ filter (\ (x, _) -> not (elem x (map fst newm))) amap+    findTag i [] = Nothing+    findTag i (ConCase n j ns sc : xs) | i == j = Just (ns, sc)+    findTag i (_ : xs) = findTag i xs++    findDefault [] = Nothing+    findDefault (DefaultCase sc : xs) = Just sc+    findDefault (_ : xs) = findDefault xs ++    findConst c [] = Nothing+    findConst c (ConstCase c' v : xs) | c == c' = Just v+    findConst IType   (ConCase n 1 [] v : xs) = Just v +    findConst FlType  (ConCase n 2 [] v : xs) = Just v +    findConst ChType  (ConCase n 3 [] v : xs) = Just v +    findConst StrType (ConCase n 4 [] v : xs) = Just v +    findConst PtrType (ConCase n 5 [] v : xs) = Just v +    findConst c (_ : xs) = findConst c xs++    getValArgs (HApp t env args) = (t, env, args)+    getValArgs t = (t, [], [])++-- SPECIALISATION -----------------------------------------------------------+-- We need too much control to be able to do this by tweaking the main +-- evaluator++spec :: Context -> Ctxt [Bool] -> Env -> TT Name -> Eval (TT Name)+spec ctxt statics genv tm = error "spec undefined" ++-- CONTEXTS -----------------------------------------------------------------++{- A definition is either a simple function (just an expression with a type),+   a constant, which could be a data or type constructor, an axiom or as an+   yet undefined function, or an Operator.+   An Operator is a function which explains how to reduce. +   A CaseOp is a function defined by a simple case tree -}+   +data Def = Function Type Term+         | TyDecl NameType Type +         | Operator Type Int ([Value] -> Maybe Value)+         | CaseOp Bool Type [(Term, Term)] -- Bool for inlineable+                  [Name] SC -- Compile time case definition+                  [Name] SC -- Run time cae definitions+{-! +deriving instance Binary Def +!-}++instance Show Def where+    show (Function ty tm) = "Function: " ++ show (ty, tm)+    show (TyDecl nt ty) = "TyDecl: " ++ show nt ++ " " ++ show ty+    show (Operator ty _ _) = "Operator: " ++ show ty+    show (CaseOp _ ty ps ns sc ns' sc') +        = "Case: " ++ show ty ++ " " ++ show ps ++ "\n" ++ +                                        show ns ++ " " ++ show sc ++ "\n" +++                                        show ns' ++ " " ++ show sc'+-- We need this for serialising Def. Fortunately, it never gets used because+-- we'll never serialise a primitive operator++instance Binary (a -> b) where+    put x = return ()+    get = error "Getting a function"++------- ++-- Frozen => doesn't reduce+-- Hidden => doesn't reduce and invisible to type checker++data Accessibility = Public | Frozen | Hidden+    deriving (Show, Eq)+{-!+deriving instance Binary Accessibility+!-}++data Context = MkContext { uconstraints :: [UConstraint],+                           next_tvar    :: Int,+                           definitions  :: Ctxt (Def, Accessibility) }++initContext = MkContext [] 0 emptyContext++ctxtAlist :: Context -> [(Name, Def)]+ctxtAlist ctxt = map (\(n, (d, a)) -> (n, d)) $ toAlist (definitions ctxt)++veval ctxt env t = evalState (eval ctxt emptyContext env t []) ()++addToCtxt :: Name -> Term -> Type -> Context -> Context+addToCtxt n tm ty uctxt +    = let ctxt = definitions uctxt +          ctxt' = addDef n (Function ty tm, Public) ctxt in+          uctxt { definitions = ctxt' } ++setAccess :: Name -> Accessibility -> Context -> Context+setAccess n a uctxt+    = let ctxt = definitions uctxt+          ctxt' = updateDef n (\ (d, _) -> (d, a)) ctxt in+          uctxt { definitions = ctxt' }++addCtxtDef :: Name -> Def -> Context -> Context+addCtxtDef n d c = let ctxt = definitions c+                       ctxt' = addDef n (d, Public) ctxt in+                       c { definitions = ctxt' }++addTyDecl :: Name -> Type -> Context -> Context+addTyDecl n ty uctxt +    = let ctxt = definitions uctxt+          ctxt' = addDef n (TyDecl Ref ty, Public) ctxt in+          uctxt { definitions = ctxt' }++addDatatype :: Datatype Name -> Context -> Context+addDatatype (Data n tag ty cons) uctxt+    = let ctxt = definitions uctxt +          ty' = normalise uctxt [] ty+          ctxt' = addCons 0 cons (addDef n +                    (TyDecl (TCon tag (arity ty')) ty, Public) ctxt) in+          uctxt { definitions = ctxt' }+  where+    addCons tag [] ctxt = ctxt+    addCons tag ((n, ty) : cons) ctxt +        = let ty' = normalise uctxt [] ty in+              addCons (tag+1) cons (addDef n+                  (TyDecl (DCon tag (arity ty')) ty, Public) ctxt)++addCasedef :: Name -> Bool -> Bool -> Bool -> [(Term, Term)] -> [(Term, Term)] ->+              Type -> Context -> Context+addCasedef n alwaysInline tcase covering ps psrt ty uctxt +    = let ctxt = definitions uctxt+          ps' = ps -- simpl ps in+          ctxt' = case (simpleCase tcase covering ps', +                        simpleCase tcase covering psrt) of+                    (CaseDef args sc, CaseDef args' sc') -> +                                       let inl = alwaysInline in+                                           addDef n (CaseOp inl ty ps args sc args' sc',+                                                     Public) ctxt in+          uctxt { definitions = ctxt' }+  where simpl [] = []+        simpl ((l,r) : xs) = (l, simplify uctxt [] r) : simpl xs++addOperator :: Name -> Type -> Int -> ([Value] -> Maybe Value) -> Context -> Context+addOperator n ty a op uctxt+    = let ctxt = definitions uctxt +          ctxt' = addDef n (Operator ty a op, Public) ctxt in+          uctxt { definitions = ctxt' }++lookupTy :: Maybe [String] -> Name -> Context -> [Type]+lookupTy root n ctxt +                = do def <- lookupCtxt root n (definitions ctxt)+                     case fst def of+                       (Function ty _) -> return ty+                       (TyDecl _ ty) -> return ty+                       (Operator ty _ _) -> return ty+                       (CaseOp _ ty _ _ _ _ _) -> return ty++isConName :: Maybe [String] -> Name -> Context -> Bool+isConName root n ctxt +     = or $ do def <- lookupCtxt root n (definitions ctxt)+               case fst def of+                    (TyDecl (DCon _ _) _) -> return True+                    (TyDecl (TCon _ _) _) -> return True+                    _ -> return False++lookupP :: Maybe [String] -> Name -> Context -> [Term]+lookupP root n ctxt +   = do def <-  lookupCtxt root n (definitions ctxt)+        p <- case def of+          (Function ty tm, a) -> return (P Ref n ty, a)+          (TyDecl nt ty, a) -> return (P nt n ty, a)+          (CaseOp _ ty _ _ _ _ _, a) -> return (P Ref n ty, a)+          (Operator ty _ _, a) -> return (P Ref n ty, a)+        case snd p of+            Hidden -> []+            _ -> return (fst p)++lookupDef :: Maybe [String] -> Name -> Context -> [Def]+lookupDef root n ctxt = map fst $ lookupCtxt root n (definitions ctxt)++lookupDefAcc :: Maybe [String] -> Name -> Bool -> Context -> [(Def, Accessibility)]+lookupDefAcc root n mkpublic ctxt +    = map mkp $ lookupCtxt root n (definitions ctxt)+  where mkp (d, a) = if mkpublic then (d, Public) else (d, a)++lookupVal :: Maybe [String] -> Name -> Context -> [Value]+lookupVal root n ctxt +   = do def <- lookupCtxt root n (definitions ctxt)+        case fst def of+          (Function _ htm) -> return (veval ctxt [] htm)+          (TyDecl nt ty) -> return (VP nt n (veval ctxt [] ty))++lookupTyEnv :: Name -> Env -> Maybe (Int, Type)+lookupTyEnv n env = li n 0 env where+  li n i []           = Nothing+  li n i ((x, b): xs) +             | n == x = Just (i, binderTy b)+             | otherwise = li n (i+1) xs+
+ src/Core/ProofShell.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, PatternGuards #-}++module Core.ProofShell where++import Core.Typecheck+import Core.Evaluate+import Core.TT+import Core.ShellParser+import Core.Elaborate++import Control.Monad.State+import System.Console.Haskeline++data ShellState = ShellState +                        { ctxt     :: Context,+                          prf      :: Maybe ProofState,+                          deferred :: [(Name, ProofState)],+                          exitNow  :: Bool+                        }++initState c = ShellState c Nothing [] False++processCommand :: Command -> ShellState -> (ShellState, String)+processCommand (Theorem n ty) state +    = case check (ctxt state) [] ty of+              OK (gl, t) -> +                 case isSet (ctxt state) [] t of+                    OK _ -> (state { prf = Just (newProof n (ctxt state) gl) }, "")+                    _ ->    (state, "Goal is not a type")+              err ->            (state, show err)+processCommand Quit     state = (state { exitNow = True }, "Bye bye")+processCommand (Eval t) state = +    case check (ctxt state) [] t of+         OK (val, ty) ->+            let nf = normalise (ctxt state) [] val +                tnf = normalise (ctxt state) [] ty in+                (state, show nf ++ " : " ++ show ty)+         err -> (state, show err)+processCommand (Print n) state =+    case lookupDef Nothing n (ctxt state) of+         [tm] -> (state, show tm)+         _ -> (state, "No such name")+processCommand (Tac e)  state +    | Just ps <- prf state = case execElab () e ps of+                                OK (ES (ps', _) resp _) -> +                                   if (not (done ps')) +                                      then (state { prf = Just ps' }, resp)+                                      else (state { prf = Nothing,+                                                    ctxt = addToCtxt (thname ps')+                                                                     (pterm ps')+                                                                     (ptype ps')+                                                                     (context ps') }, resp)+                                err -> (state, show err)+    | otherwise = (state, "No proof in progress")++runShell :: ShellState -> InputT IO ShellState+runShell st = do (prompt, parser) <- +                           maybe (return ("TT# ", parseCommand)) +                                 (\st -> do outputStrLn (show st)+                                            return (show (thname st) ++ "# ", parseTactic)) +                                 (prf st)+                 x <- getInputLine prompt+                 cmd <- case x of+                    Nothing -> return $ Right Quit+                    Just input -> return (parser input)+                 case cmd of+                    Left err -> do outputStrLn (show err)+                                   runShell st+                    Right cmd -> do let (st', r) = processCommand cmd st+                                    outputStrLn r+                                    if (not (exitNow st')) then runShell st'+                                                           else return st'+
+ src/Core/ProofState.hs view
@@ -0,0 +1,520 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, PatternGuards #-}++{- Implements a proof state, some primitive tactics for manipulating+   proofs, and some high level commands for introducing new theorems,+   evaluation/checking inside the proof system, etc. --}++module Core.ProofState(ProofState(..), newProof, envAtFocus, goalAtFocus,+                  Tactic(..), Goal(..), processTactic) where++import Core.Typecheck+import Core.Evaluate+import Core.TT+import Core.Unify++import Control.Monad.State+import Control.Applicative+import Data.List+import Debug.Trace++data ProofState = PS { thname   :: Name,+                       holes    :: [Name], -- holes still to be solved+                       nextname :: Int,    -- name supply+                       pterm    :: Term,   -- current proof term+                       ptype    :: Type,   -- original goal+                       unified  :: (Name, [(Name, Term)]),+                       solved   :: Maybe (Name, Term),+                       problems :: Fails,+                       injective :: [(Term, Term, Term)],+                       deferred :: [Name], -- names we'll need to define+                       instances :: [Name], -- instance arguments (for type classes)+                       previous :: Maybe ProofState, -- for undo+                       context  :: Context,+                       plog     :: String,+                       done     :: Bool+                     }+                   +data Goal = GD { premises :: Env,+                 goalType :: Binder Term+               }++data Tactic = Attack+            | Claim Name Raw+            | Reorder Name+            | Exact Raw+            | Fill Raw+            | PrepFill Name [Name]+            | CompleteFill+            | Regret+            | Solve+            | StartUnify Name+            | EndUnify+            | Compute+            | EvalIn Raw+            | CheckIn Raw+            | Intro (Maybe Name)+            | IntroTy Raw (Maybe Name)+            | Forall Name Raw+            | LetBind Name Raw Raw+            | Rewrite Raw+            | PatVar Name+            | PatBind Name+            | Focus Name+            | Defer Name+            | Instance Name+            | MoveLast Name+            | ProofState+            | Undo+            | QED+    deriving Show++-- Some utilites on proof and tactic states++instance Show ProofState where+    show (PS nm [] _ tm _ _ _ _ _ _ _ _ _ _ _) = show nm ++ ": no more goals"+    show (PS nm (h:hs) _ tm _ _ _ _ _ i _ _ ctxt _ _) +          = let OK g = goal (Just h) tm+                wkenv = premises g in+                "Other goals: " ++ show hs ++ "\n" +++                showPs wkenv (reverse wkenv) ++ "\n" +++                "-------------------------------- (" ++ show nm ++ +                ") -------\n  " +++                show h ++ " : " ++ showG wkenv (goalType g) ++ "\n"+         where showPs env [] = ""+               showPs env ((n, Let t v):bs) +                   = "  " ++ show n ++ " : " ++ +                     showEnv env ({- normalise ctxt env -} t) ++ "   =   " +++                     showEnv env ({- normalise ctxt env -} v) +++                     "\n" ++ showPs env bs+               showPs env ((n, b):bs) +                   = "  " ++ show n ++ " : " ++ +                     showEnv env ({- normalise ctxt env -} (binderTy b)) ++ +                     "\n" ++ showPs env bs+               showG ps (Guess t v) = showEnv ps ({- normalise ctxt ps -} t) ++ +                                         " =?= " ++ showEnv ps v+               showG ps b = showEnv ps (binderTy b)++same Nothing n  = True+same (Just x) n = x == n++hole (Hole _)    = True+hole (Guess _ _) = True+hole _           = False++holeName i = MN i "hole" ++unify' :: Context -> Env -> TT Name -> TT Name -> StateT TState TC [(Name, TT Name)]+unify' ctxt env topx topy = do (u, inj, fails) <- lift $ unify ctxt env topx topy+                               addInj inj+                               case fails of+                                    [] -> return u+                                    err -> +                                        do ps <- get+                                           put (ps { problems = err ++ problems ps })+                                           return []++getName :: Monad m => String -> StateT TState m Name+getName tag = do ps <- get+                 let n = nextname ps+                 put (ps { nextname = n+1 })+                 return $ MN n tag++action :: Monad m => (ProofState -> ProofState) -> StateT TState m ()+action a = do ps <- get+              put (a ps)++addLog :: Monad m => String -> StateT TState m ()+addLog str = action (\ps -> ps { plog = plog ps ++ str ++ "\n" })++newProof :: Name -> Context -> Type -> ProofState+newProof n ctxt ty = let h = holeName 0 +                         ty' = vToP ty in+                         PS n [h] 1 (Bind h (Hole ty') (P Bound h ty')) ty (h, []) +                            Nothing [] []+                            [] []+                            Nothing ctxt "" False++type TState = ProofState -- [TacticAction])+type RunTactic = Context -> Env -> Term -> StateT TState TC Term+type Hole = Maybe Name -- Nothing = default hole, first in list in proof state++envAtFocus :: ProofState -> TC Env+envAtFocus ps +    | not $ null (holes ps) = do g <- goal (Just (head (holes ps))) (pterm ps)+                                 return (premises g)+    | otherwise = fail "No holes"++goalAtFocus :: ProofState -> TC (Binder Type)+goalAtFocus ps+    | not $ null (holes ps) = do g <- goal (Just (head (holes ps))) (pterm ps)+                                 return (goalType g)++goal :: Hole -> Term -> TC Goal+goal h tm = g [] tm where+    g env (Bind n b sc) | hole b && same h n = return $ GD env b +                        | otherwise          +                           = gb env b `mplus` g ((n, b):env) sc+    g env (App f a)   = g env f `mplus` g env a+    g env t           = fail "Can't find hole"++    gb env (Let t v) = g env t `mplus` g env v+    gb env (Guess t v) = g env t `mplus` g env v+    gb env t = g env (binderTy t)++tactic :: Hole -> RunTactic -> StateT TState TC ()+tactic h f = do ps <- get+                tm' <- atH (context ps) [] (pterm ps)+                ps <- get -- might have changed while processing+                put (ps { pterm = tm' })+  where+    atH c env binder@(Bind n b sc) +        | hole b && same h n = f c env binder+        | otherwise          +            = liftM2 (Bind n) (atHb c env b) (atH c ((n, b) : env) sc) +    atH c env (App f a)    = liftM2 App (atH c env f) (atH c env a)+    atH c env t            = return t+    +    atHb c env (Let t v)   = liftM2 Let (atH c env t) (atH c env v)    +    atHb c env (Guess t v) = liftM2 Guess (atH c env t) (atH c env v)+    atHb c env t           = do ty' <- atH c env (binderTy t)+                                return $ t { binderTy = ty' }++attack :: RunTactic+attack ctxt env (Bind x (Hole t) sc) +    = do h <- getName "hole"+         action (\ps -> ps { holes = h : holes ps })+         return $ Bind x (Guess t (newtm h)) sc+  where+    newtm h = Bind h (Hole t) (P Bound h t) +attack ctxt env _ = fail "Not an attackable hole"++claim :: Name -> Raw -> RunTactic+claim n ty ctxt env t =+    do (tyv, tyt) <- lift $ check ctxt env ty+       lift $ isSet ctxt env tyt+       action (\ps -> let (g:gs) = holes ps in+                          ps { holes = g : n : gs } )+       return $ Bind n (Hole tyv) t -- (weakenTm 1 t)++reorder_claims :: RunTactic+reorder_claims ctxt env t+    = -- trace (showSep "\n" (map show (scvs t))) $ +      let (bs, sc) = scvs t []+          newbs = reverse (sortB (reverse bs)) in+          traceWhen (bs /= newbs) (show bs ++ "\n ==> \n" ++ show newbs) $+            return (bindAll newbs sc)+  where scvs (Bind n b@(Hole _) sc) acc = scvs sc ((n, b):acc)+        scvs sc acc = (reverse acc, sc)++        sortB :: [(Name, Binder (TT Name))] -> [(Name, Binder (TT Name))]+        sortB [] = []+        sortB (x:xs) | all (noOcc x) xs = x : sortB xs+                     | otherwise = sortB (insertB x xs)++        insertB x [] = [x]+        insertB x (y:ys) | all (noOcc x) (y:ys) = x : y : ys+                         | otherwise = y : insertB x ys++        noOcc (n, _) (_, Let t v) = noOccurrence n t && noOccurrence n v+        noOcc (n, _) (_, Guess t v) = noOccurrence n t && noOccurrence n v+        noOcc (n, _) (_, b) = noOccurrence n (binderTy b)++focus :: Name -> RunTactic+focus n ctxt env t = do action (\ps -> let hs = holes ps in+                                            if n `elem` hs+                                               then ps { holes = n : (hs \\ [n]) }+                                               else ps)+                        return t ++movelast :: Name -> RunTactic+movelast n ctxt env t = do action (\ps -> let hs = holes ps in+                                              if n `elem` hs+                                                  then ps { holes = (hs \\ [n]) ++ [n] }+                                                  else ps)+                           return t ++instanceArg :: Name -> RunTactic+instanceArg n ctxt env (Bind x (Hole t) sc)+    = do action (\ps -> let hs = holes ps+                            is = instances ps in+                            ps { holes = (hs \\ [x]) ++ [x],+                                 instances = x:is })+         return (Bind x (Hole t) sc)++defer :: Name -> RunTactic+defer n ctxt env (Bind x (Hole t) (P nt x' ty)) | x == x' = +    do action (\ps -> let hs = holes ps in+                          ps { holes = hs \\ [x] })+       return (Bind n (GHole (mkTy (reverse env) t)) +                      (mkApp (P Ref n ty) (map getP (reverse env))))+  where+    mkTy []           t = t+    mkTy ((n,b) : bs) t = Bind n (Pi (binderTy b)) (mkTy bs t)++    getP (n, b) = P Bound n (binderTy b)++-- Hmmm. YAGNI?+regret :: RunTactic+regret = undefined++addInj :: [(Term, Term, Term)] -> StateT TState TC ()+addInj inj = do ps <- get+                put (ps { injective = inj ++ injective ps })++exact :: Raw -> RunTactic+exact guess ctxt env (Bind x (Hole ty) sc) = +    do (val, valty) <- lift $ check ctxt env guess +       lift $ converts ctxt env valty ty+       return $ Bind x (Guess ty val) sc+exact _ _ _ _ = fail "Can't fill here."++-- As exact, but attempts to solve other goals by unification++fill :: Raw -> RunTactic+fill guess ctxt env (Bind x (Hole ty) sc) =+    do (val, valty) <- lift $ check ctxt env guess+       s <- get+       ns <- unify' ctxt env valty ty+       ps <- get+       let (uh, uns) = unified ps+       put (ps { unified = (uh, uns ++ ns) })+--        addLog (show (uh, uns ++ ns))+       return $ Bind x (Guess ty val) sc+fill _ _ _ _ = fail "Can't fill here."++prep_fill :: Name -> [Name] -> RunTactic+prep_fill f as ctxt env (Bind x (Hole ty) sc) =+    do let val = mkApp (P Ref f undefined) (map (\n -> P Ref n undefined) as)+       return $ Bind x (Guess ty val) sc+prep_fill f as ctxt env t = fail $ "Can't prepare fill at " ++ show t++complete_fill :: RunTactic+complete_fill ctxt env (Bind x (Guess ty val) sc) =+    do let guess = forget val+       (val', valty) <- lift $ check ctxt env guess    +       ns <- unify' ctxt env valty ty+       ps <- get+       let (uh, uns) = unified ps+       put (ps { unified = (uh, uns ++ ns) })+       return $ Bind x (Guess ty val) sc+complete_fill ctxt env t = fail $ "Can't complete fill at " ++ show t++solve :: RunTactic+solve ctxt env (Bind x (Guess ty val) sc)+   | pureTerm val = do ps <- get+                       let (uh, uns) = unified ps+                       action (\ps -> ps { holes = holes ps \\ [x],+                                           solved = Just (x, val),+                                           -- unified = (uh, uns ++ [(x, val)]),+                                           instances = instances ps \\ [x] })+                       return $ {- Bind x (Let ty val) sc -} instantiate val (pToV x sc)+   | otherwise    = fail $ "I see a hole in your solution. " ++ showEnv env val+solve _ _ h = fail $ "Not a guess " ++ show h++introTy :: Raw -> Maybe Name -> RunTactic+introTy ty mn ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' =+    do let n = case mn of +                  Just name -> name+                  Nothing -> x+       let t' = normalise ctxt env t+       (tyv, tyt) <- lift $ check ctxt env ty+--        ns <- lift $ unify ctxt env tyv t'+       case t' of+           Bind y (Pi s) t -> let t' = instantiate (P Bound n s) (pToV y t) in+                                  do ns <- unify' ctxt env s tyv+                                     ps <- get+                                     let (uh, uns) = unified ps+                                     put (ps { unified = (uh, uns ++ ns) })+                                     return $ Bind n (Lam tyv) (Bind x (Hole t') (P Bound x t'))+           _ -> fail "Nothing to introduce"+introTy ty n ctxt env _ = fail "Can't introduce here."++intro :: Maybe Name -> RunTactic+intro mn ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' =+    do let n = case mn of +                  Just name -> name+                  Nothing -> x+       let t' = normalise ctxt env t+       case t' of+           Bind y (Pi s) t -> let t' = instantiate (P Bound n s) (pToV y t) in +                                  return $ Bind n (Lam s) (Bind x (Hole t') (P Bound x t'))+           _ -> fail "Nothing to introduce"+intro n ctxt env _ = fail "Can't introduce here."++forall :: Name -> Raw -> RunTactic+forall n ty ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' =+    do (tyv, tyt) <- lift $ check ctxt env ty+       lift $ isSet ctxt env tyt+       lift $ isSet ctxt env t+       return $ Bind n (Pi tyv) (Bind x (Hole t) (P Bound x t))+forall n ty ctxt env _ = fail "Can't pi bind here"++patvar :: Name -> RunTactic+patvar n ctxt env (Bind x (Hole t) sc) =+    do action (\ps -> ps { holes = holes ps \\ [x] })+       return $ Bind n (PVar t) (instantiate (P Bound n t) (pToV x sc))+patvar n ctxt env tm = fail $ "Can't add pattern var at " ++ show tm++letbind :: Name -> Raw -> Raw -> RunTactic+letbind n ty val ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' =+    do (tyv,  tyt)  <- lift $ check ctxt env ty+       (valv, valt) <- lift $ check ctxt env val+       lift $ isSet ctxt env tyt+       return $ Bind n (Let tyv valv) (Bind x (Hole t) (P Bound x t))+letbind n ty val ctxt env _ = fail "Can't let bind here"++rewrite :: Raw -> RunTactic+rewrite tm ctxt env (Bind x (Hole t) xp@(P _ x' _)) | x == x' =+    do (tmv, tmt) <- lift $ check ctxt env tm+       case unApply tmt of+         (P _ (UN "=") _, [lt,rt,l,r]) ->+            do let p = Bind rname (Lam lt) (mkP (P Bound rname lt) r l t)+               let newt = mkP l r l t +               let sc = forget $ (Bind x (Hole newt) +                                       (mkApp (P Ref (UN "replace") (Set (UVal 0)))+                                              [lt, l, r, p, tmv, xp]))+               (scv, sct) <- lift $ check ctxt env sc+               return scv+         _ -> fail "Not an equality type"+  where+    -- to make the P for rewrite, replace syntactic occurrences of l in ty with+    -- and x, and put \x : lt in front+    mkP lt l r ty | l == ty = lt+    mkP lt l r (App f a) = let f' = if (r /= f) then mkP lt l r f else f+                               a' = if (r /= a) then mkP lt l r a else a in+                               App f' a'+    mkP lt l r x = x++    rname = MN 0 "replaced"+rewrite _ _ _ _ = fail "Can't rewrite here"++patbind :: Name -> RunTactic+patbind n ctxt env (Bind x (Hole t) (P _ x' _)) | x == x' =+    do let t' = normalise ctxt env t+       case t' of+           Bind y (PVTy s) t -> let t' = instantiate (P Bound n s) (pToV y t) in+                                    return $ Bind n (PVar s) (Bind x (Hole t') (P Bound x t'))+           _ -> fail "Nothing to pattern bind"+patbind n ctxt env _ = fail "Can't pattern bind here"++compute :: RunTactic+compute ctxt env (Bind x (Hole ty) sc) =+    do return $ Bind x (Hole (normalise ctxt env ty)) sc+        +check_in :: Raw -> RunTactic+check_in t ctxt env tm = +    do (val, valty) <- lift $ check ctxt env t+       addLog (showEnv env val ++ " : " ++ showEnv env valty)+       return tm++eval_in :: Raw -> RunTactic+eval_in t ctxt env tm = +    do (val, valty) <- lift $ check ctxt env t+       let val' = normalise ctxt env val+       let valty' = normalise ctxt env valty+       addLog (showEnv env val ++ " : " ++ +               showEnv env valty ++ +--                     " in " ++ show env ++ +               " ==>\n " +++               showEnv env val' ++ " : " ++ +               showEnv env valty')+       return tm++start_unify :: Name -> RunTactic+start_unify n ctxt env tm = do action (\ps -> ps { unified = (n, []) })+                               return tm++tmap f (a, b, c) = (f a, b, c)++solve_unified :: RunTactic+solve_unified ctxt env tm = +    do ps <- get+       let (_, ns) = unified ps+       action (\ps -> ps { holes = holes ps \\ map fst ns })+       action (\ps -> ps { pterm = updateSolved ns (pterm ps) })+       action (\ps -> ps { injective = map (tmap (updateSolved ns)) (injective ps) })+       return (updateSolved ns tm)++updateSolved xs (Bind n (Hole ty) t)+    | Just v <- lookup n xs = instantiate v (pToV n (updateSolved xs t))+updateSolved xs (Bind n b t) +    | otherwise = Bind n (fmap (updateSolved xs) b) (updateSolved xs t)+updateSolved xs (App f a) = App (updateSolved xs f) (updateSolved xs a)+updateSolved xs (P _ n _)+    | Just v <- lookup n xs = v+updateSolved xs t = t++updateProblems ns [] = []+updateProblems ns ((x, y, env, err) : ps) =+    let x' = updateSolved ns x+        y' = updateSolved ns y in+        (x',y',env,err) : updateProblems ns ps++processTactic :: Tactic -> ProofState -> TC (ProofState, String)+processTactic QED ps = case holes ps of+                           [] -> do let tm = {- normalise (context ps) [] -} (pterm ps)+                                    (tm', ty', _) <- recheck (context ps) [] (forget tm) tm+                                    return (ps { done = True, pterm = tm' }, +                                            "Proof complete: " ++ showEnv [] tm')+                           _  -> fail "Still holes to fill."+processTactic ProofState ps = return (ps, showEnv [] (pterm ps))+processTactic Undo ps = case previous ps of+                            Nothing -> fail "Nothing to undo."+                            Just pold -> return (pold, "")+processTactic EndUnify ps +    = let (h, ns) = unified ps+          ns' = map (\ (n, t) -> (n, updateSolved ns t)) ns +          tm' = -- trace ("Updating " ++ show ns' ++ " in " ++ show (pterm ps)) $+                updateSolved ns' (pterm ps) +          probs' = updateProblems ns' (problems ps) in+          case probs' of+            [] -> return (ps { pterm = tm', +                               unified = (h, []),+                               injective = map (tmap (updateSolved ns')) +                                                (injective ps),+                               holes = holes ps \\ map fst ns' }, "")+            errs@((_,_,_,err):_) -> tfail err+processTactic (Reorder n) ps +    = do ps' <- execStateT (tactic (Just n) reorder_claims) ps+         return (ps' { previous = Just ps, plog = "" }, plog ps')+processTactic t ps   +    = case holes ps of+        [] -> fail "Nothing to fill in."+        (h:_)  -> do ps' <- execStateT (process t h) ps+                     let pterm' = case solved ps' of+                                    Just s -> updateSolved [s] (pterm ps')+                                    _ -> pterm ps'+                     return (ps' { pterm = pterm',+                                   solved = Nothing,+                                   previous = Just ps, plog = "" }, plog ps')++process :: Tactic -> Name -> StateT TState TC ()+process EndUnify _ +   = do ps <- get+        let (h, _) = unified ps+        tactic (Just h) solve_unified+process t h = tactic (Just h) (mktac t)+   where mktac Attack          = attack+         mktac (Claim n r)     = claim n r+         mktac (Exact r)       = exact r+         mktac (Fill r)        = fill r+         mktac (PrepFill n ns) = prep_fill n ns+         mktac CompleteFill    = complete_fill+         mktac Regret          = regret+         mktac Solve           = solve+         mktac (StartUnify n)  = start_unify n+         mktac Compute         = compute+         mktac (Intro n)       = intro n+         mktac (IntroTy ty n)  = introTy ty n+         mktac (Forall n t)    = forall n t+         mktac (LetBind n t v) = letbind n t v+         mktac (Rewrite t)     = rewrite t+         mktac (PatVar n)      = patvar n+         mktac (PatBind n)     = patbind n+         mktac (CheckIn r)     = check_in r+         mktac (EvalIn r)      = eval_in r+         mktac (Focus n)       = focus n+         mktac (Defer n)       = defer n+         mktac (Instance n)    = instanceArg n+         mktac (MoveLast n)    = movelast n+         
+ src/Core/ShellParser.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}++module Core.ShellParser(parseCommand, parseTactic) where++import Core.TT+import Core.Elaborate+import Core.CoreParser++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++parseCommand = parse pCommand "(input)"+parseTactic  = parse (pTactic >>= return . Tac) "(input)"++pCommand :: Parser Command+pCommand = do reserved "theorem"; n <- iName []; lchar ':'; ty <- pTerm+              return (Theorem n ty)+       <|> do reserved "eval"; tm <- pTerm+              return (Eval tm)+       <|> do reserved "print"; n <- iName []; return (Print n)+       <|> do reserved "quit";+              return Quit++pTactic :: Parser (Elab ())+pTactic = do reserved "attack";  return attack+      <|> do reserved "claim";   n <- iName []; lchar ':'; ty <- pTerm+             return (claim n ty)+      <|> do reserved "regret";  return regret+      <|> do reserved "exact";   tm <- pTerm; return (exact tm)+      <|> do reserved "fill";    tm <- pTerm; return (fill tm)+      <|> do reserved "apply";   tm <- pTerm; args <- many pArgType; +             return (discard (apply tm (map (\x -> (x,0)) args)))+      <|> do reserved "solve";   return solve+      <|> do reserved "compute"; return compute+      <|> do reserved "intro";   n <- iName []; return (intro (Just n))+      <|> do reserved "forall";  n <- iName []; lchar ':'; ty <- pTerm+             return (forall n ty)+      <|> do reserved "arg";     n <- iName []; t <- iName []; return (arg n t)+      <|> do reserved "patvar";  n <- iName []; return (patvar n)+--       <|> do reserved "patarg";  n <- iName []; t <- iName []; return (patarg n t)+      <|> do reserved "eval";    t <- pTerm; return (eval_in t)+      <|> do reserved "check";   t <- pTerm; return (check_in t)+      <|> do reserved "focus";   n <- iName []; return (focus n)+      <|> do reserved "state";   return proofstate+      <|> do reserved "undo";    return undo+      <|> do reserved "qed";     return (discard qed)++pArgType :: Parser Bool+pArgType = do lchar '_'; return True   -- implicit (machine fills in)+       <|> do lchar '?'; return False  -- user fills in+
+ src/Core/TT.hs view
@@ -0,0 +1,591 @@+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DeriveFunctor #-}++module Core.TT where++import Control.Monad.State+import Debug.Trace+import qualified Data.Map as Map+import Data.Char+import Data.List+import qualified Data.Binary as B+import Data.Binary hiding (get, put)++{- The language has:+   * Full dependent types+   * A hierarchy of universes, with cumulativity: Set : Set1, Set1 : Set2, ...+   * Pattern matching letrec binding+   * (primitive types defined externally)++   Some technical stuff:+   * Typechecker is kept as simple as possible +        - no unification, just a checker for incomplete terms.+   * We have a simple collection of tactics which we use to elaborate source+     programs with implicit syntax into fully explicit terms.+-}++data Option = SetInSet+            | CheckConv+  deriving Eq++data FC = FC { fc_fname :: String,+               fc_line :: Int }+    deriving Eq+{-! +deriving instance Binary FC +!-}++instance Show FC where+    show (FC f l) = f ++ ":" ++ show l++data Err = Msg String+         | CantUnify Term Term Err Int -- Int is 'score' - how much we did unify+         | NotInjective Term Term Term+         | IncompleteTerm Term+         | UniverseError+         | ProgramLineComment+         | At FC Err+  deriving Eq++score :: Err -> Int+score (CantUnify _ _ m s) = s + score m+score _ = 0++instance Show Err where+    show (Msg s) = s+    show (CantUnify l r e i) = "CantUnify " ++ show l ++ " " ++ show r ++ " "+                               ++ show e ++ " " ++ show i+    show _ = "Error"++data TC a = OK a+          | Error Err+  deriving (Eq, Functor)++instance Show a => Show (TC a) where+    show (OK x) = show x+    show (Error str) = "Error: " ++ show str++-- at some point, this instance should also carry type checking options+-- (e.g. Set:Set)++instance Monad TC where+    return = OK +    x >>= k = case x of +                OK v -> k v+                Error e -> Error e+    fail e = Error (Msg e)++tfail :: Err -> TC a+tfail e = Error e++trun :: FC -> TC a -> TC a+trun fc (OK a)    = OK a+trun fc (Error e) = Error (At fc e) ++instance MonadPlus TC where+    mzero = fail "Unknown error"+    (OK x) `mplus` _ = OK x+    _ `mplus` (OK y) = OK y+    err `mplus` _    = err++discard :: Monad m => m a -> m ()+discard f = f >> return ()++showSep :: String -> [String] -> String+showSep sep [] = ""+showSep sep [x] = x+showSep sep (x:xs) = x ++ sep ++ showSep sep xs++pmap f (x, y) = (f x, f y)++traceWhen True msg a = trace msg a+traceWhen False _  a = a++-- RAW TERMS ----------------------------------------------------------------++-- Names are hierarchies of strings, describing scope (so no danger of+-- duplicate names, but need to be careful on lookup).+-- Also MN for machine chosen names++data Name = UN String+          | NS Name [String] -- root, namespaces +          | MN Int String+  deriving (Eq, Ord)+{-! +deriving instance Binary Name +!-}++instance Show Name where+    show (UN n) = n+    show (NS n s) = showSep "." (reverse s) ++ "." ++ show n+    show (MN i s) = "{" ++ s ++ show i ++ "}"+++-- Contexts allow us to map names to things. A root name maps to a collection+-- of things in different namespaces with that name.++type Ctxt a = Map.Map Name (Map.Map Name a)+emptyContext = Map.empty++nsroot (NS n _) = n+nsroot n = n++addDef :: Name -> a -> Ctxt a -> Ctxt a+addDef n v ctxt = case Map.lookup (nsroot n) ctxt of+                        Nothing -> Map.insert (nsroot n) +                                        (Map.insert n v Map.empty) ctxt+                        Just xs -> Map.insert (nsroot n) +                                        (Map.insert n v xs) ctxt++{- lookup a name in the context, given an optional namespace.+   The name (n) may itself have a (partial) namespace given.++   Rules for resolution:+    - if an explicit namespace is given, return the names which match it. If none+      match, return all names.+    - if the name has has explicit namespace given, return the names which match it+      and ignore the given namespace.+    - otherwise, return all names.++-}++lookupCtxtName :: Maybe [String] -> Name -> Ctxt a -> [(Name, a)]+lookupCtxtName nspace n ctxt = case Map.lookup (nsroot n) ctxt of+                                  Just xs -> filterNS (Map.toList xs)+                                  Nothing -> []+  where+    filterNS [] = []+    filterNS ((found, v) : xs) +        | nsmatch n found = (found, v) : filterNS xs+        | otherwise       = filterNS xs++    nsmatch (NS n ns) (NS p ps) = ns `isPrefixOf` ps+    nsmatch (NS _ _)  _         = False+    nsmatch looking   found     = True++lookupCtxt :: Maybe [String] -> Name -> Ctxt a -> [a]+lookupCtxt ns n ctxt = map snd (lookupCtxtName ns n ctxt)++updateDef :: Name -> (a -> a) -> Ctxt a -> Ctxt a+updateDef n f ctxt +  = let ds = lookupCtxtName Nothing n ctxt in+        foldr (\ (n, t) c -> addDef n (f t) c) ctxt ds  ++toAlist :: Ctxt a -> [(Name, a)]+toAlist ctxt = let allns = map snd (Map.toList ctxt) in+                concat (map (Map.toList) allns)++addAlist :: Show a => [(Name, a)] -> Ctxt a -> Ctxt a+addAlist [] ctxt = ctxt+addAlist ((n, tm) : ds) ctxt = addDef n tm (addAlist ds ctxt)++data Const = I Int | BI Integer | Fl Double | Ch Char | Str String +           | IType | BIType     | FlType    | ChType  | StrType    +           | PtrType | Forgot+  deriving Eq+{-! +deriving instance Binary Const +!-}++data Raw = Var Name+         | RBind Name (Binder Raw) Raw+         | RApp Raw Raw+         | RSet+         | RForce Raw+         | RConstant Const+  deriving (Show, Eq)+{-! +deriving instance Binary Raw +!-}++data Binder b = Lam   { binderTy  :: b }+              | Pi    { binderTy  :: b }+              | Let   { binderTy  :: b,+                        binderVal :: b }+              | NLet  { binderTy  :: b,+                        binderVal :: b }+              | Hole  { binderTy  :: b}+              | GHole { binderTy  :: b}+              | Guess { binderTy  :: b,+                        binderVal :: b }+              | PVar  { binderTy  :: b }+              | PVTy  { binderTy  :: b }+  deriving (Show, Eq, Functor)+{-! +deriving instance Binary Binder +!-}++fmapMB :: Monad m => (a -> m b) -> Binder a -> m (Binder b)+fmapMB f (Let t v)   = liftM2 Let (f t) (f v)+fmapMB f (NLet t v)  = liftM2 NLet (f t) (f v)+fmapMB f (Guess t v) = liftM2 Guess (f t) (f v)+fmapMB f (Lam t)     = liftM Lam (f t)+fmapMB f (Pi t)      = liftM Pi (f t)+fmapMB f (Hole t)    = liftM Hole (f t)+fmapMB f (GHole t)   = liftM GHole (f t)+fmapMB f (PVar t)    = liftM PVar (f t)+fmapMB f (PVTy t)    = liftM PVTy (f t)++raw_apply :: Raw -> [Raw] -> Raw+raw_apply f [] = f+raw_apply f (a : as) = raw_apply (RApp f a) as++raw_unapply :: Raw -> (Raw, [Raw])+raw_unapply t = ua [] t where+    ua args (RApp f a) = ua (a:args) f+    ua args t          = (t, args)++data RawFun = RawFun { rtype :: Raw,+                       rval  :: Raw+                     }+  deriving Show++data RawDatatype = RDatatype Name Raw [(Name, Raw)]+  deriving Show++data RDef = RFunction RawFun+          | RConst Raw+          | RData RawDatatype+  deriving Show++type RProgram = [(Name, RDef)]++-- WELL TYPED TERMS ---------------------------------------------------------++data UExp = UVar Int -- universe variable+          | UVal Int -- explicit universe level+  deriving (Eq, Ord)++-- We assume that universe levels have been checked, so anything external+-- can just have the same universe variable and we won't get any new+-- cycles.++instance Binary UExp where+    put x = return ()+    get = return (UVar (-1))++instance Show UExp where+    show (UVar x) | x < 26 = [toEnum (x + fromEnum 'a')]+                  | otherwise = toEnum ((x `mod` 26) + fromEnum 'a') : show (x `div` 26)+    show (UVal x) = show x+--     show (UMax l r) = "max(" ++ show l ++ ", " ++ show r ++")"++data UConstraint = ULT UExp UExp+                 | ULE UExp UExp+  deriving Eq++instance Show UConstraint where+    show (ULT x y) = show x ++ " < " ++ show y+    show (ULE x y) = show x ++ " <= " ++ show y++type UCs = (Int, [UConstraint])++data NameType = Bound | Ref | DCon Int Int | TCon Int Int+  deriving (Show)+{-! +deriving instance Binary NameType +!-}++instance Eq NameType where+    Bound    == Bound    = True+    Ref      == Ref      = True+    DCon _ a == DCon _ b = (a == b) -- ignore tag+    TCon _ a == TCon _ b = (a == b) -- ignore tag+    _        == _        = False++data TT n = P NameType n (TT n) -- embed type+          | V Int +          | Bind n (Binder (TT n)) (TT n)+          | App (TT n) (TT n) -- function, function type, arg+          | Constant Const+          | Erased+          | Set UExp+  deriving Functor+{-! +deriving instance Binary TT +!-}++type EnvTT n = [(n, Binder (TT n))]++data Datatype n = Data { d_typename :: n,+                         d_typetag  :: Int,+                         d_type     :: (TT n),+                         d_cons     :: [(n, TT n)] }+  deriving (Show, Functor, Eq)++instance Eq n => Eq (TT n) where+    (==) (P xt x _)     (P yt y _)     = xt == yt && x == y+    (==) (V x)          (V y)          = x == y+    (==) (Bind _ xb xs) (Bind _ yb ys) = xb == yb && xs == ys+    (==) (App fx ax)    (App fy ay)    = fx == fy && ax == ay+    (==) (Set _)        (Set _)        = True -- deal with constraints later+    (==) (Constant x)   (Constant y)   = x == y+    (==) Erased         _              = True+    (==) _              Erased         = True+    (==) _              _              = False++convEq :: Eq n => TT n -> TT n -> StateT UCs TC Bool+convEq (P xt x _) (P yt y _) = return (xt == yt && x == y)+convEq (V x)      (V y)      = return (x == y)+convEq (Bind _ xb xs) (Bind _ yb ys) +                             = liftM2 (&&) (convEqB xb yb) (convEq xs ys)+  where convEqB (Let v t) (Let v' t') = liftM2 (&&) (convEq v v') (convEq t t')+        convEqB (Guess v t) (Guess v' t') = liftM2 (&&) (convEq v v') (convEq t t')+        convEqB b b' = convEq (binderTy b) (binderTy b')+convEq (App fx ax) (App fy ay)   = liftM2 (&&) (convEq fx fy) (convEq ax ay)+convEq (Constant x) (Constant y) = return (x == y)+convEq (Set x) (Set y)           = do (v, cs) <- get+                                      put (v, ULE x y : cs)+                                      return True+convEq Erased _ = return True+convEq _ Erased = return True+convEq _ _ = return False++-- A few handy operations on well typed terms:++isInjective :: TT n -> Bool+isInjective (P (DCon _ _) _ _) = True+isInjective (P (TCon _ _) _ _) = True+isInjective (Constant _)       = True+isInjective (Set x)            = True+isInjective (Bind _ (Pi _) sc) = True+isInjective (App f a)          = isInjective f+isInjective _                  = False++instantiate :: TT n -> TT n -> TT n+instantiate e = subst 0 where+    subst i (V x) | i == x = e+    subst i (Bind x b sc) = Bind x (fmap (subst i) b) (subst (i+1) sc)+    subst i (App f a) = App (subst i f) (subst i a)+    subst i t = t++pToV :: Eq n => n -> TT n -> TT n+pToV n = pToV' n 0+pToV' n i (P _ x _) | n == x = V i+pToV' n i (Bind x b sc)+                | n == x    = Bind x (fmap (pToV' n i) b) sc+                | otherwise = Bind x (fmap (pToV' n i) b) (pToV' n (i+1) sc)+pToV' n i (App f a) = App (pToV' n i f) (pToV' n i a)+pToV' n i t = t++-- Convert several names. First in the list comes out as V 0+pToVs :: Eq n => [n] -> TT n -> TT n+pToVs ns tm = pToVs' ns tm 0 where+    pToVs' []     tm i = tm+    pToVs' (n:ns) tm i = pToV' n i (pToVs' ns tm (i+1))++vToP :: TT n -> TT n+vToP = vToP' [] where+    vToP' env (V i) = let (n, b) = (env !! i) in+                          P Bound n (binderTy b)+    vToP' env (Bind n b sc) = let b' = fmap (vToP' env) b in+                                  Bind n b' (vToP' ((n, b'):env) sc)+    vToP' env (App f a) = App (vToP' env f) (vToP' env a)+    vToP' env t = t++finalise :: Eq n => TT n -> TT n+finalise (Bind x b sc) = Bind x (fmap finalise b) (pToV x (finalise sc))+finalise (App f a) = App (finalise f) (finalise a)+finalise t = t++subst :: Eq n => n -> TT n -> TT n -> TT n+subst n v tm = instantiate v (pToV n tm)++substNames :: Eq n => [(n, TT n)] -> TT n -> TT n+substNames []             t = t+substNames ((n, tm) : xs) t = subst n tm (substNames xs t)++-- Returns true if V 0 and bound name n do not occur in the term++noOccurrence :: Eq n => n -> TT n -> Bool+noOccurrence n t = no' 0 t+  where+    no' i (V x) = not (i == x)+    no' i (P Bound x _) = not (n == x)+    no' i (Bind n b sc) = noB' i b && no' (i+1) sc+       where noB' i (Let t v) = no' i t && no' i v+             noB' i (Guess t v) = no' i t && no' i v+             noB' i b = no' i (binderTy b)+    no' i (App f a) = no' i f && no' i a+    no' i _ = True++-- Return the arity of a (normalised) type++arity :: TT n -> Int+arity (Bind n (Pi t) sc) = 1 + arity sc+arity _ = 0++-- deconstruct an application; returns the function and a list of arguments++unApply :: TT n -> (TT n, [TT n])+unApply t = ua [] t where+    ua args (App f a) = ua (a:args) f+    ua args t         = (t, args)++mkApp :: TT n -> [TT n] -> TT n+mkApp f [] = f+mkApp f (a:as) = mkApp (App f a) as++forget :: TT Name -> Raw+forget tm = fe [] tm+  where+    fe env (P _ n _) = Var n+    fe env (V i)     = Var (env !! i)+    fe env (Bind n b sc) = RBind n (fmap (fe env) b) +                                   (fe (n:env) sc)+    fe env (App f a) = RApp (fe env f) (fe env a)+    fe env (Constant c) +                     = RConstant c+    fe env (Set i)   = RSet+    fe env Erased    = RConstant Forgot +    +bindAll :: [(n, Binder (TT n))] -> TT n -> TT n +bindAll [] t =t+bindAll ((n, b) : bs) t = Bind n b (bindAll bs t)++bindTyArgs :: (TT n -> Binder (TT n)) -> [(n, TT n)] -> TT n -> TT n+bindTyArgs b xs = bindAll (map (\ (n, ty) -> (n, b ty)) xs)++getArgTys :: TT n -> [(n, TT n)]+getArgTys (Bind n (Pi t) sc) = (n, t) : getArgTys sc+getArgTys _ = []++getRetTy :: TT n -> TT n+getRetTy (Bind n (PVar _) sc) = getRetTy sc+getRetTy (Bind n (PVTy _) sc) = getRetTy sc+getRetTy (Bind n (Pi _) sc)   = getRetTy sc+getRetTy sc = sc++uniqueName :: Name -> [Name] -> Name+uniqueName n hs | n `elem` hs = uniqueName (nextName n) hs+                | otherwise   = n++nextName (NS x s)    = NS (nextName x) s+nextName (MN i n)    = MN (i+1) n+nextName (UN x) = let (num', nm') = span isDigit (reverse x)+                      nm = reverse nm'+                      num = readN (reverse num') in+                          UN (nm ++ show (num+1))+  where+    readN "" = 0+    readN x  = read x++type Term = TT Name+type Type = Term++type Env  = EnvTT Name++-- an environment with de Bruijn indices 'normalised' so that they all refer to+-- this environment++newtype WkEnvTT n = Wk (EnvTT n)+type WkEnv = WkEnvTT Name++instance (Eq n, Show n) => Show (TT n) where+    show t = showEnv [] t++instance Show Const where+    show (I i) = show i+    show (BI i) = show i ++ "L"+    show (Fl f) = show f+    show (Ch c) = show c+    show (Str s) = show s+    show IType = "Int"+    show BIType = "Integer"+    show FlType = "Float"+    show ChType = "Char"+    show StrType = "String"+    show PtrType = "Ptr"++showEnv env t = showEnv' env t False+showEnvDbg env t = showEnv' env t True++showEnv' env t dbg = se 10 env t where+    se p env (P nt n t) = show n +                            ++ if dbg then "{" ++ show nt ++ " : " ++ se 10 env t ++ "}" else ""+    se p env (V i) | i < length env = (show $ fst $ env!!i) +++                                      if dbg then "{" ++ show i ++ "}" else ""+                   | otherwise = "!!V " ++ show i ++ "!!"+    se p env (Bind n b@(Pi t) sc)  +        | noOccurrence n sc && not dbg = bracket p 2 $ se 1 env t ++ " -> " ++ se 10 ((n,b):env) sc+    se p env (Bind n b sc) = bracket p 2 $ sb env n b ++ se 10 ((n,b):env) sc+    se p env (App f a) = bracket p 1 $ se 1 env f ++ " " ++ se 0 env a+    se p env (Constant c) = show c+    se p env Erased = "[__]"+    se p env (Set i) = "Set " ++ show i++    sb env n (Lam t)  = showb env "\\ " " => " n t+    sb env n (Hole t) = showb env "? " ". " n t+    sb env n (GHole t) = showb env "?defer " ". " n t+    sb env n (Pi t)   = showb env "(" ") -> " n t+    sb env n (PVar t) = showb env "pat " ". " n t+    sb env n (PVTy t) = showb env "pty " ". " n t+    sb env n (Let t v)   = showbv env "let " " in " n t v+    sb env n (Guess t v) = showbv env "?? " " in " n t v++    showb env op sc n t    = op ++ show n ++ " : " ++ se 10 env t ++ sc+    showbv env op sc n t v = op ++ show n ++ " : " ++ se 10 env t ++ " = " ++ +                             se 10 env v ++ sc ++    bracket outer inner str | inner > outer = "(" ++ str ++ ")"+                            | otherwise = str++-- Check whether a term has any holes in it - impure if so++pureTerm :: TT n -> Bool+pureTerm (App f a) = pureTerm f && pureTerm a+pureTerm (Bind n b sc) = pureBinder b && pureTerm sc where+    pureBinder (Hole _) = False+    pureBinder (Guess _ _) = False+    pureBinder (Let t v) = pureTerm t && pureTerm v+    pureBinder t = pureTerm (binderTy t)+pureTerm _ = True++-- weaken a term by adding i to each de Bruijn index (i.e. lift it over i bindings)++weakenTm :: Int -> TT n -> TT n+weakenTm i t = wk i 0 t+  where wk i min (V x) | x >= min = V (i + x)+        wk i m (App f a)     = App (wk i m f) (wk i m a)+        wk i m (Bind x b sc) = Bind x (wkb i m b) (wk i (m + 1) sc)+        wk i m t = t+        wkb i m t           = fmap (wk i m) t++-- weaken an environment so that all the de Bruijn indices are correct according+-- to the latest bound variable++weakenEnv :: EnvTT n -> EnvTT n+weakenEnv env = wk (length env - 1) env+  where wk i [] = []+        wk i ((n, b) : bs) = (n, weakenTmB i b) : wk (i - 1) bs+        weakenTmB i (Let   t v) = Let (weakenTm i t) (weakenTm i v)+        weakenTmB i (Guess t v) = Guess (weakenTm i t) (weakenTm i v)+        weakenTmB i t           = t { binderTy = weakenTm i (binderTy t) }++weakenTmEnv :: Int -> EnvTT n -> EnvTT n+weakenTmEnv i = map (\ (n, b) -> (n, fmap (weakenTm i) b))++orderPats :: Term -> Term+orderPats tm = op [] tm+  where+    op ps (Bind n (PVar t) sc) = op ((n, t) : ps) sc+    op ps sc = bindAll (map (\ (n, t) -> (n, PVar t)) (sortP ps)) sc ++    sortP ps = pick [] (reverse ps)++    namesIn (P _ n _) = [n]+    namesIn (Bind n b t) = nub $ nb b ++ (namesIn t \\ [n])+      where nb (Let   t v) = nub (namesIn t) ++ nub (namesIn v)+            nb (Guess t v) = nub (namesIn t) ++ nub (namesIn v)+            nb t = namesIn (binderTy t)+    namesIn (App f a) = nub (namesIn f ++ namesIn a)+    namesIn _ = []++    pick acc [] = reverse acc+    pick acc ((n, t) : ps) = pick (insert n t acc) ps++    insert n t [] = [(n, t)]+    insert n t ((n',t') : ps)+        | n `elem` (namesIn t' ++ concatMap namesIn (map snd ps))+            = (n', t') : insert n t ps+        | otherwise = (n,t):(n',t'):ps+
+ src/Core/Typecheck.hs view
@@ -0,0 +1,223 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor,+             PatternGuards #-}++module Core.Typecheck where++import Control.Monad.State+import Debug.Trace++import Core.TT+import Core.Evaluate++-- To check conversion, normalise each term wrt the current environment.+-- Since we haven't converted everything to de Bruijn indices yet, we'll have to+-- deal with alpha conversion - we do this by making each inner term de Bruijn+-- indexed with 'finalise'++convertsC :: Context -> Env -> Term -> Term -> StateT UCs TC ()+convertsC ctxt env x y +   = do c <- convEq (finalise (normalise ctxt env x))+                    (finalise (normalise ctxt env y))+        if c then return ()+             else fail ("Can't convert between " ++ +                        showEnv env (finalise (normalise ctxt env x)) ++ " and " ++ +                        showEnv env (finalise (normalise ctxt env y)))++converts :: Context -> Env -> Term -> Term -> TC ()+converts ctxt env x y = if (finalise (normalise ctxt env x) == +                            finalise (normalise ctxt env y))+                          then return ()+                          else fail ("Can't convert between " ++ +                                     showEnvDbg env (finalise (normalise ctxt env x)) ++ " and " ++ +                                     showEnvDbg env (finalise (normalise ctxt env y)))++isSet :: Context -> Env -> Term -> TC ()+isSet ctxt env tm = isSet' (normalise ctxt env tm)+    where isSet' (Set _) = return ()+          isSet' tm = fail (showEnv env tm ++ " is not a Set")++recheck :: Context -> Env -> Raw -> Term -> TC (Term, Type, UCs)+recheck ctxt env tm orig+   = let v = next_tvar ctxt in+       case runStateT (check' False ctxt env tm) (v, []) of -- holes banned+          Error (IncompleteTerm _) -> Error $ IncompleteTerm orig+          Error e -> Error e+          OK ((tm, ty), constraints) -> +              return (tm, ty, constraints)++check :: Context -> Env -> Raw -> TC (Term, Type)+check ctxt env tm = evalStateT (check' True ctxt env tm) (0, []) -- Holes allowed++check' :: Bool -> Context -> Env -> Raw -> StateT UCs TC (Term, Type)+check' holes ctxt env top = chk env top where+  chk env (Var n)+      | Just (i, ty) <- lookupTyEnv n env = return (P Bound n ty, ty)+      | (P nt n' ty : _) <- lookupP Nothing n ctxt = return (P nt n' ty, ty)+      | otherwise = do fail $ "No such variable " ++ show n ++ " in " ++ show (map fst env)+  chk env (RApp f a)+      = do (fv, fty) <- chk env f+           (av, aty) <- chk env a+           let fty' = renameBinders 0 $ normalise ctxt env fty+           case fty' of+             Bind x (Pi s) t ->+                 do convertsC ctxt env aty s+                    let apty = normalise initContext env (Bind x (Let aty av) t)+                    return (App fv av, apty)+             t -> fail "Can't apply a non-function type"+    -- This rather unpleasant hack is needed because during incomplete +    -- proofs, variables are locally bound with an explicit name. If we just +    -- make sure bound names in function types are locally unique, machine+    -- generated names, we'll be fine.+    where renameBinders i (Bind x (Pi s) t) = Bind (MN i "binder") (Pi s) +                                                   (renameBinders (i+1) t)+          renameBinders i sc = sc+  chk env RSet +    | holes = return (Set (UVal 0), Set (UVal 0))+    | otherwise = do (v, cs) <- get+                     let c = ULT (UVar v) (UVar (v+1))+                     put (v+2, (c:cs))+                     return (Set (UVar v), Set (UVar (v+1)))+  chk env (RConstant Forgot) = return (Erased, Erased)+  chk env (RConstant c) = return (Constant c, constType c)+    where constType (I _)   = Constant IType+          constType (BI _)  = Constant BIType+          constType (Fl _)  = Constant FlType+          constType (Ch _)  = Constant ChType+          constType (Str _) = Constant StrType+          constType Forgot  = Erased+          constType _       = Set (UVal 0)+  chk env (RForce t) = do (_, ty) <- chk env t+                          return (Erased, ty)+  chk env (RBind n (Pi s) t)+      = do (sv, st) <- chk env s+           (tv, tt) <- chk ((n, Pi sv) : env) t+           (v, cs) <- get+           let Set su = normalise ctxt env st+           let Set tu = normalise ctxt env tt+           when (not holes) $ put (v+1, ULE su (UVar v):ULE tu (UVar v):cs)+           return (Bind n (Pi sv) (pToV n tv), Set (UVar v))  +  chk env (RBind n b sc)+      = do b' <- checkBinder b+           (scv, sct) <- chk ((n, b'):env) sc+           discharge n b' (pToV n scv) (pToV n sct)+    where checkBinder (Lam t)+            = do (tv, tt) <- chk env t+                 let tv' = normalise ctxt env tv+                 let tt' = normalise ctxt env tt+                 lift $ isSet ctxt env tt'+                 return (Lam tv)+          checkBinder (Pi t)+            = do (tv, tt) <- chk env t+                 let tv' = normalise ctxt env tv+                 let tt' = normalise ctxt env tt+                 lift $ isSet ctxt env tt'+                 return (Pi tv)+          checkBinder (Let t v)+            = do (tv, tt) <- chk env t+                 (vv, vt) <- chk env v+                 let tv' = normalise ctxt env tv+                 let tt' = normalise ctxt env tt+                 convertsC ctxt env vt tv+                 lift $ isSet ctxt env tt'+                 return (Let tv vv)+          checkBinder (NLet t v)+            = do (tv, tt) <- chk env t+                 (vv, vt) <- chk env v+                 let tv' = normalise ctxt env tv+                 let tt' = normalise ctxt env tt+                 convertsC ctxt env vt tv+                 lift $ isSet ctxt env tt'+                 return (NLet tv vv)+          checkBinder (Hole t)+            | not holes = lift $ tfail (IncompleteTerm undefined)+            | otherwise+                   = do (tv, tt) <- chk env t+                        let tv' = normalise ctxt env tv+                        let tt' = normalise ctxt env tt+                        lift $ isSet ctxt env tt'+                        return (Hole tv)+          checkBinder (GHole t)+            = do (tv, tt) <- chk env t+                 let tv' = normalise ctxt env tv+                 let tt' = normalise ctxt env tt+                 lift $ isSet ctxt env tt'+                 return (GHole tv)+          checkBinder (Guess t v)+            | not holes = lift $ tfail (IncompleteTerm undefined)+            | otherwise+                   = do (tv, tt) <- chk env t+                        (vv, vt) <- chk env v+                        let tv' = normalise ctxt env tv+                        let tt' = normalise ctxt env tt+                        convertsC ctxt env vt tv+                        lift $ isSet ctxt env tt'+                        return (Guess tv vv)+          checkBinder (PVar t)+            = do (tv, tt) <- chk env t+                 let tv' = normalise ctxt env tv+                 let tt' = normalise ctxt env tt+                 lift $ isSet ctxt env tt'+                 return (PVar tv)+          checkBinder (PVTy t)+            = do (tv, tt) <- chk env t+                 let tv' = normalise ctxt env tv+                 let tt' = normalise ctxt env tt+                 lift $ isSet ctxt env tt'+                 return (PVTy tv)+  +          discharge n (Lam t) scv sct+            = return (Bind n (Lam t) scv, Bind n (Pi t) sct)+          discharge n (Pi t) scv sct+            = return (Bind n (Pi t) scv, sct)+          discharge n (Let t v) scv sct+            = return (Bind n (Let t v) scv, Bind n (Let t v) sct)+          discharge n (NLet t v) scv sct+            = return (Bind n (NLet t v) scv, Bind n (Let t v) sct)+          discharge n (Hole t) scv sct+            = do -- A hole can't appear in the type of its scope+                 checkNotHoley 0 sct+                 return (Bind n (Hole t) scv, sct)+          discharge n (GHole t) scv sct+            = do -- A hole can't appear in the type of its scope+                 checkNotHoley 0 sct+                 return (Bind n (GHole t) scv, sct)+          discharge n (Guess t v) scv sct+            = do -- A hole can't appear in the type of its scope+                 checkNotHoley 0 sct+                 return (Bind n (Guess t v) scv, sct)+          discharge n (PVar t) scv sct+            = return (Bind n (PVar t) scv, Bind n (PVTy t) sct)+          discharge n (PVTy t) scv sct+            = return (Bind n (PVTy t) scv, sct)+  +          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 n b sc) = checkNotHoley (i+1) sc+          checkNotHoley _ _ = return ()+++checkProgram :: Context -> RProgram -> TC Context+checkProgram ctxt [] = return ctxt+checkProgram ctxt ((n, RConst t) : xs) +   = do (t', tt') <- trace (show n) $ check ctxt [] t+        isSet ctxt [] tt'+        checkProgram (addTyDecl n t' ctxt) xs+checkProgram ctxt ((n, RFunction (RawFun ty val)) : xs)+   = do (ty', tyt') <- trace (show n) $ check ctxt [] ty+        (val', valt') <- check ctxt [] val+        isSet ctxt [] tyt'+        converts ctxt [] ty' valt'+        checkProgram (addToCtxt n val' ty' ctxt) xs+checkProgram ctxt ((n, RData (RDatatype _ ty cons)) : xs)+   = do (ty', tyt') <- trace (show n) $ check ctxt [] ty+        isSet ctxt [] tyt'+        -- add the tycon temporarily so we can check constructors+        let ctxt' = addDatatype (Data n 0 ty' []) ctxt+        cons' <- mapM (checkCon ctxt') cons+        checkProgram (addDatatype (Data n 0 ty' cons') ctxt) xs+  where checkCon ctxt (n, cty) = do (cty', ctyt') <- check ctxt [] cty+                                    return (n, cty')++
+ src/Core/Unify.hs view
@@ -0,0 +1,137 @@+module Core.Unify(unify, Fails) where++import Core.TT+import Core.Evaluate++import Control.Monad+import Control.Monad.State+import Debug.Trace++-- Unification is applied inside the theorem prover. We're looking for holes+-- which can be filled in, by matching one term's normal form against another.+-- Returns a list of hole names paired with the term which solves them, and+-- a list of things which need to be injective.++-- terms which need to be injective, with the things we're trying to unify+-- at the time++type Injs = [(TT Name, TT Name, TT Name)]+type Fails = [(TT Name, TT Name, Env, Err)]++data UInfo = UI Int Injs Fails++unify :: Context -> Env -> TT Name -> TT Name -> TC ([(Name, TT Name)], +                                                     Injs, Fails)+unify ctxt env topx topy +    = case runStateT +             (un' False [] (normalise ctxt env topx) (normalise ctxt env topy))+             (UI 0 [] []) of+              OK (v, UI _ inj fails) -> return (filter notTrivial v, inj, reverse fails)+--               OK (_, UI s _ ((_,_,f):fs)) -> tfail $ CantUnify topx topy f s+              Error e -> tfail e+  where+    notTrivial (x, P _ x' _) = x /= x'+    notTrivial _ = True++    injective (P (DCon _ _) _ _) = True+    injective (P (TCon _ _) _ _) = True+    injective (App f a)          = injective f+    injective _                  = False++    notP (P _ _ _) = False+    notP _ = True++    sc i = do UI s x f <- get+              put (UI (s+i) x f)++    uplus u1 u2 = do UI s i f <- get+                     r <- u1+                     UI s _ f' <- get+                     if (length f == length f') +                        then return r+                        else do put (UI s i f); u2++    un' :: Bool -> [(Name, Name)] -> TT Name -> TT Name ->+           StateT UInfo +           TC [(Name, TT Name)]+    un' fn bnames (P Bound x _)  (P Bound y _)  +        | (x,y) `elem` bnames = do sc 1; return []+    un' fn bnames (P Bound x _) tm+        | holeIn env x = do UI s i f <- get+                            when (notP tm && fn) $ put (UI s ((tm, topx, topy) : i) f)+                            sc 1+                            return [(x, tm)]+    un' fn bnames tm (P Bound y _)+        | holeIn env y = do UI s i f <- get+                            when (notP tm && fn) $ put (UI s ((tm, topx, topy) : i) f)+                            sc 1+                            return [(y, tm)]+    un' fn bnames (V i) (P Bound x _)+        | fst (bnames!!i) == x || snd (bnames!!i) == x = do sc 1; return []+    un' fn bnames (P Bound x _) (V i)+        | fst (bnames!!i) == x || snd (bnames!!i) == x = do sc 1; return []++    un' fn bnames (App fx ax) (App fy ay)    +        = do uplus -- do the second one if the first adds any errors +                (do hf <- un' True bnames fx fy +                    let ax' = normalise ctxt env (substNames hf ax)+                    let ay' = normalise ctxt env (substNames hf ay)+                    ha <- un' False bnames ax' ay'+                    sc 1+                    combine bnames hf ha)+                (do ha <- un' False bnames ax ay+                    let fx' = normalise ctxt env (substNames ha fx)+                    let fy' = normalise ctxt env (substNames ha fy)+                    hf <- un' False bnames fx' fy'+                    sc 1+                    combine bnames hf ha)++    un' fn bnames x (Bind n (Lam t) (App y (P Bound n' _)))+        | n == n' = un' False bnames x y+    un' fn bnames (Bind n (Lam t) (App x (P Bound n' _))) y+        | n == n' = un' False bnames x y+    un' fn bnames (Bind x bx sx) (Bind y by sy) +        = do h1 <- uB bnames bx by+             h2 <- un' False ((x,y):bnames) sx sy+             combine bnames h1 h2+    un' fn bnames x y +        | x == y = do sc 1; return []+        | otherwise = do UI s i f <- get+                         let err = CantUnify topx topy (CantUnify x y (Msg "") s) s+                         put (UI s i ((x, y, env, err) : f))+                         return [] -- lift $ tfail err++    uB bnames (Let tx vx) (Let ty vy)+        = do h1 <- un' False bnames tx ty+             h2 <- un' False bnames ty vy+             sc 1+             combine bnames h1 h2+    uB bnames (Guess tx vx) (Guess ty vy)+        = do h1 <- un' False bnames tx ty+             h2 <- un' False bnames ty vy+             sc 1+             combine bnames h1 h2+    uB bnames (Lam tx) (Lam ty) = do sc 1; un' False bnames tx ty+    uB bnames (Pi tx) (Pi ty) = do sc 1; un' False bnames tx ty+    uB bnames (Hole tx) (Hole ty) = un' False bnames tx ty+    uB bnames (PVar tx) (PVar ty) = un' False bnames tx ty+    uB bnames x y = do UI s i f <- get+                       let err = CantUnify topx topy+                                  (CantUnify (binderTy x) (binderTy y) (Msg "") s)+                                  s+                       put (UI s i ((binderTy x, binderTy y, env, err) : f))+                       return [] -- lift $ tfail err++    combine bnames as [] = return as+    combine bnames as ((n, t) : bs)+        = case lookup n as of +            Nothing -> combine bnames (as ++ [(n,t)]) bs+            Just t' -> do un' False bnames t t'+                          sc 1+                          combine bnames as bs++holeIn :: Env -> Name -> Bool+holeIn env n = case lookup n env of+                    Just (Hole _) -> True+                    _ -> False+
+ src/Idris/AbsSyntax.hs view
@@ -0,0 +1,1319 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor,+             TypeSynonymInstances, PatternGuards #-}++module Idris.AbsSyntax where++import Core.TT+import Core.Evaluate+import Core.Elaborate+import Core.Typecheck++import System.Console.Haskeline+import Control.Monad.State+import Data.List+import Data.Char+import Data.Either+import Debug.Trace++import qualified Epic.Epic as E++data IOption = IOption { opt_logLevel :: Int,+                         opt_typecase :: Bool,+                         opt_typeintype :: Bool,+                         opt_coverage :: Bool,+                         opt_showimp  :: Bool,+                         opt_repl     :: Bool,+                         opt_verbose  :: Bool+                       }+    deriving (Show, Eq)++defaultOpts = IOption 0 False False True False True True++-- TODO: Add 'module data' to IState, which can be saved out and reloaded quickly (i.e+-- without typechecking).+-- This will include all the functions and data declarations, plus fixity declarations+-- and syntax macros.++data IState = IState { tt_ctxt :: Context,+                       idris_constraints :: [(UConstraint, FC)],+                       idris_infixes :: [FixDecl],+                       idris_implicits :: Ctxt [PArg],+                       idris_statics :: Ctxt [Bool],+                       idris_classes :: Ctxt ClassInfo,+                       idris_optimisation :: Ctxt OptInfo, +                       idris_datatypes :: Ctxt TypeInfo,+                       idris_patdefs :: Ctxt [(Term, Term)], -- not exported+                       idris_log :: String,+                       idris_options :: IOption,+                       idris_name :: Int,+                       idris_metavars :: [Name],+                       syntax_rules :: [Syntax],+                       syntax_keywords :: [String],+                       imported :: [FilePath],+                       idris_prims :: [(Name, ([E.Name], E.Term))],+                       idris_objs :: [FilePath],+                       idris_libs :: [String],+                       idris_hdrs :: [String],+                       last_proof :: Maybe (Name, [String]),+                       errLine :: Maybe Int,+                       lastParse :: Maybe Name, +                       indent_stack :: [Int],+                       brace_stack :: [Maybe Int],+                       hide_list :: [(Name, Maybe Accessibility)],+                       default_access :: Accessibility,+                       ibc_write :: [IBCWrite],+                       compiled_so :: Maybe String+                     }+             +-- information that needs writing for the current module's .ibc file+data IBCWrite = IBCFix FixDecl+              | IBCImp Name+              | IBCStatic Name+              | IBCClass Name+              | IBCData Name+              | IBCOpt Name+              | IBCSyntax Syntax+              | IBCKeyword String+              | IBCImport FilePath+              | IBCObj FilePath+              | IBCLib String+              | IBCHeader String+              | IBCAccess Name Accessibility+              | IBCDef Name -- i.e. main context+  deriving Show++idrisInit = IState initContext [] [] emptyContext emptyContext emptyContext+                   emptyContext emptyContext emptyContext+                   "" defaultOpts 6 [] [] [] [] [] [] [] [] +                   Nothing Nothing Nothing [] [] [] Hidden [] Nothing++-- The monad for the main REPL - reading and processing files and updating +-- global state (hence the IO inner monad).+type Idris = StateT IState (InputT IO)++getContext :: Idris Context+getContext = do i <- get; return (tt_ctxt i)++getObjectFiles :: Idris [FilePath]+getObjectFiles = do i <- get; return (idris_objs i)++addObjectFile :: FilePath -> Idris ()+addObjectFile f = do i <- get; put (i { idris_objs = f : idris_objs i })++getLibs :: Idris [String]+getLibs = do i <- get; return (idris_libs i)++addLib :: String -> Idris ()+addLib f = do i <- get; put (i { idris_libs = f : idris_libs i })++addHdr :: String -> Idris ()+addHdr f = do i <- get; put (i { idris_hdrs = f : idris_hdrs i })++setAccessibility :: Name -> Accessibility -> Idris ()+setAccessibility n a +         = do i <- get+              let ctxt = setAccess n a (tt_ctxt i)+              put (i { tt_ctxt = ctxt })++addIBC :: IBCWrite -> Idris ()+addIBC ibc@(IBCDef n) +           = do i <- get+                when (notDef (ibc_write i)) $+                  put (i { ibc_write = ibc : ibc_write i })+   where notDef [] = True+         notDef (IBCDef n': is) | n == n' = False+         notDef (_ : is) = notDef is+addIBC ibc = do i <- get; put (i { ibc_write = ibc : ibc_write i }) ++clearIBC :: Idris ()+clearIBC = do i <- get; put (i { ibc_write = [] })++getHdrs :: Idris [String]+getHdrs = do i <- get; return (idris_hdrs i)++setErrLine :: Int -> Idris ()+setErrLine x = do i <- get;+                  case (errLine i) of+                      Nothing -> put (i { errLine = Just x })+                      Just _ -> return ()++clearErr :: Idris ()+clearErr = do i <- get+              put (i { errLine = Nothing })++getSO :: Idris (Maybe String)+getSO = do i <- get+           return (compiled_so i)++setSO :: Maybe String -> Idris ()+setSO s = do i <- get+             put (i { compiled_so = s })++getIState :: Idris IState+getIState = get++putIState :: IState -> Idris ()+putIState = put++getName :: Idris Int+getName = do i <- get;+             let idx = idris_name i;+             put (i { idris_name = idx + 1 })+             return idx++checkUndefined :: FC -> Name -> Idris ()+checkUndefined fc n +    = do i <- getContext+         case lookupTy Nothing n i of+             (_:_)  -> fail $ show fc ++ ":" ++ +                       show n ++ " already defined"+             _ -> return ()++setContext :: Context -> Idris ()+setContext ctxt = do i <- get; put (i { tt_ctxt = ctxt } )++updateContext :: (Context -> Context) -> Idris ()+updateContext f = do i <- get; put (i { tt_ctxt = f (tt_ctxt i) } )++addConstraints :: FC -> (Int, [UConstraint]) -> Idris ()+addConstraints fc (v, cs)+    = do i <- get+         let ctxt = tt_ctxt i+         let ctxt' = ctxt { uconstraints = cs ++ uconstraints ctxt,+                            next_tvar = v }+         let ics = zip cs (repeat fc) ++ idris_constraints i+         put (i { tt_ctxt = ctxt', idris_constraints = ics })++addDeferred :: [(Name, Type)] -> Idris ()+addDeferred ns = do mapM_ (\(n, t) -> updateContext (addTyDecl n (tidyNames [] t))) ns+                    i <- get+                    put (i { idris_metavars = map fst ns ++ idris_metavars i })+  where tidyNames used (Bind (MN i x) b sc)+            = let n' = uniqueName (UN x) used in+                  Bind n' b $ tidyNames (n':used) sc+        tidyNames used (Bind n b sc)+            = let n' = uniqueName n used in+                  Bind n' b $ tidyNames (n':used) sc+        tidyNames used b = b++solveDeferred :: Name -> Idris ()+solveDeferred n = do i <- get+                     put (i { idris_metavars = idris_metavars i \\ [n] })++iputStrLn :: String -> Idris ()+iputStrLn = liftIO . putStrLn++iWarn :: FC -> String -> Idris ()+iWarn fc err = liftIO $ putStrLn (show fc ++ ":" ++ err)++setLogLevel :: Int -> Idris ()+setLogLevel l = do i <- get+                   let opts = idris_options i+                   let opt' = opts { opt_logLevel = l }+                   put (i { idris_options = opt' } )++logLevel :: Idris Int+logLevel = do i <- get+              return (opt_logLevel (idris_options i))++useREPL :: Idris Bool+useREPL = do i <- get+             return (opt_repl (idris_options i))++setREPL :: Bool -> Idris ()+setREPL t = do i <- get+               let opts = idris_options i+               let opt' = opts { opt_repl = t }+               put (i { idris_options = opt' })++verbose :: Idris Bool+verbose = do i <- get+             return (opt_verbose (idris_options i))++setVerbose :: Bool -> Idris ()+setVerbose t = do i <- get+                  let opts = idris_options i+                  let opt' = opts { opt_verbose = t }+                  put (i { idris_options = opt' })++typeInType :: Idris Bool+typeInType = do i <- get+                return (opt_typeintype (idris_options i))++setTypeInType :: Bool -> Idris ()+setTypeInType t = do i <- get+                     let opts = idris_options i+                     let opt' = opts { opt_typeintype = t }+                     put (i { idris_options = opt' })++coverage :: Idris Bool+coverage = do i <- get+              return (opt_coverage (idris_options i))++setCoverage :: Bool -> Idris ()+setCoverage t = do i <- get+                   let opts = idris_options i+                   let opt' = opts { opt_coverage = t }+                   put (i { idris_options = opt' })++impShow :: Idris Bool+impShow = do i <- get+             return (opt_showimp (idris_options i))++setImpShow :: Bool -> Idris ()+setImpShow t = do i <- get+                  let opts = idris_options i+                  let opt' = opts { opt_showimp = t }+                  put (i { idris_options = opt' })++logLvl :: Int -> String -> Idris ()+logLvl l str = do i <- get+                  let lvl = opt_logLevel (idris_options i)+                  when (lvl >= l)+                      $ do liftIO (putStrLn str)+                           put (i { idris_log = idris_log i ++ str ++ "\n" } )++iLOG :: String -> Idris ()+iLOG = logLvl 1++noErrors :: Idris Bool+noErrors = do i <- get+              case errLine i of+                Nothing -> return True+                _       -> return False++setTypeCase :: Bool -> Idris ()+setTypeCase t = do i <- get+                   let opts = idris_options i+                   let opt' = opts { opt_typecase = t }+                   put (i { idris_options = opt' })++-- Commands in the REPL++data Command = Quit | Help | Eval PTerm | Check PTerm | Reload | Edit+             | Compile String | Execute | ExecVal PTerm+             | Metavars | Prove Name | AddProof | Universes+             | TTShell +             | LogLvl Int | Spec PTerm | HNF PTerm | Defn Name | Info Name+             | NOP++-- Parsed declarations++data Fixity = Infixl { prec :: Int } +            | Infixr { prec :: Int }+            | InfixN { prec :: Int } +            | PrefixN { prec :: Int }+    deriving Eq+{-! +deriving instance Binary Fixity +!-}++instance Show Fixity where+    show (Infixl i) = "infixl " ++ show i+    show (Infixr i) = "infixr " ++ show i+    show (InfixN i) = "infix " ++ show i+    show (PrefixN i) = "prefix " ++ show i++data FixDecl = Fix Fixity String +    deriving (Show, Eq)+{-! +deriving instance Binary FixDecl +!-}++instance Ord FixDecl where+    compare (Fix x _) (Fix y _) = compare (prec x) (prec y)+++data Static = Static | Dynamic+  deriving (Show, Eq)+{-! +deriving instance Binary Static +!-}++-- Mark bindings with their explicitness, and laziness+data Plicity = Imp { plazy :: Bool,+                     pstatic :: Static }+             | Exp { plazy :: Bool,+                     pstatic :: Static }+             | Constraint { plazy :: Bool,+                            pstatic :: Static }+  deriving (Show, Eq)++{-!+deriving instance Binary Plicity +!-}++impl = Imp False Dynamic+expl = Exp False Dynamic+constraint = Constraint False Static++data FnOpt = Inlinable | Partial | Abstract | Private | TCGen+    deriving (Show, Eq)++type FnOpts = [FnOpt]++inlinable :: FnOpts -> Bool+inlinable = elem Inlinable++data PDecl' t = PFix     FC Fixity [String] -- fixity declaration+              | PTy      SyntaxInfo FC Name t   -- type declaration+              | PClauses FC FnOpts Name [PClause' t]   -- pattern clause+              | PData    SyntaxInfo FC (PData' t)      -- data declaration+              | PParams  FC [(Name, t)] [PDecl' t] -- params block+              | PNamespace String [PDecl' t] -- new namespace+              | PClass   SyntaxInfo FC +                         [t] -- constraints+                         Name+                         [(Name, t)] -- parameters+                         [PDecl' t] -- declarations+              | PInstance SyntaxInfo FC [t] -- constraints+                                        Name -- class+                                        [t] -- parameters+                                        t -- full instance type+                                        [PDecl' t]+              | PSyntax  FC Syntax+              | PDirective (Idris ())+    deriving Functor++data PClause' t = PClause Name t [t] t [PDecl' t]+                | PWith   Name t [t] t [PDecl' t]+                | PClauseR       [t] t [PDecl' t]+                | PWithR         [t] t [PDecl' t]+    deriving Functor++data PData' t  = PDatadecl { d_name :: Name,+                             d_tcon :: t,+                             d_cons :: [(Name, t, FC)] }+    deriving Functor++-- Handy to get a free function for applying PTerm -> PTerm functions+-- across a program, by deriving Functor++type PDecl   = PDecl' PTerm+type PData   = PData' PTerm+type PClause = PClause' PTerm ++-- get all the names declared in a decl++declared :: PDecl -> [Name]+declared (PFix _ _ _) = []+declared (PTy _ _ n t) = [n]+declared (PClauses _ _ n _) = [] -- not a declaration+declared (PData _ _ (PDatadecl n _ ts)) = n : map fstt ts+   where fstt (a, _, _) = a+declared (PParams _ _ ds) = concatMap declared ds+declared (PNamespace _ ds) = concatMap declared ds+-- declared (PImport _) = []++updateN :: [(Name, Name)] -> Name -> Name+updateN ns n | Just n' <- lookup n ns = n'+updateN _  n = n++updateNs :: [(Name, Name)] -> PTerm -> PTerm+updateNs [] t = t+updateNs ns t = mapPT updateRef t+  where updateRef (PRef fc f) = PRef fc (updateN ns f) +        updateRef t = t++-- updateDNs :: [(Name, Name)] -> PDecl -> PDecl+-- updateDNs [] t = t+-- updateDNs ns (PTy s f n t)    | Just n' <- lookup n ns = PTy s f n' t+-- updateDNs ns (PClauses f n c) | Just n' <- lookup n ns = PClauses f n' (map updateCNs c)+--   where updateCNs ns (PClause n l ts r ds) +--             = PClause (updateN ns n) (fmap (updateNs ns) l)+--                                      (map (fmap (updateNs ns)) ts)+--                                      (fmap (updateNs ns) r)+--                                      (map (updateDNs ns) ds)+-- updateDNs ns c = c++-- High level language terms++data PTerm = PQuote Raw+           | PRef FC Name+           | PLam Name PTerm PTerm+           | PPi  Plicity Name PTerm PTerm+           | PLet Name PTerm PTerm PTerm +           | PApp FC PTerm [PArg]+           | PCase FC PTerm [(PTerm, PTerm)]+           | PTrue FC+           | PFalse FC+           | PRefl FC+           | PResolveTC FC+           | PEq FC PTerm PTerm+           | PPair FC PTerm PTerm+           | PDPair FC PTerm PTerm PTerm+           | PAlternative [PTerm]+           | PHidden PTerm -- irrelevant or hidden pattern+           | PSet+           | PConstant Const+           | Placeholder+           | PDoBlock [PDo]+           | PIdiom FC PTerm+           | PReturn FC+           | PMetavar Name+           | PProof [PTactic]+           | PTactics [PTactic] -- as PProof, but no auto solving+           | PElabError String -- error to report on elaboration+           | PImpossible -- special case for declaring when an LHS can't typecheck+    deriving Eq+{-! +deriving instance Binary PTerm +!-}++mapPT :: (PTerm -> PTerm) -> PTerm -> PTerm+mapPT f t = f (mpt t) where+  mpt (PLam n t s) = PLam n (mapPT f t) (mapPT f s)+  mpt (PPi p n t s) = PPi p n (mapPT f t) (mapPT f s)+  mpt (PLet n ty v s) = PLet n (mapPT f ty) (mapPT f v) (mapPT f s)+  mpt (PApp fc t as) = PApp fc (mapPT f t) (map (fmap (mapPT f)) as)+  mpt (PCase fc c os) = PCase fc (mapPT f c) (map (pmap (mapPT f)) os)+  mpt (PEq fc l r) = PEq fc (mapPT f l) (mapPT f r)+  mpt (PPair fc l r) = PPair fc (mapPT f l) (mapPT f r)+  mpt (PDPair fc l t r) = PDPair fc (mapPT f l) (mapPT f t) (mapPT f r)+  mpt (PAlternative as) = PAlternative (map (mapPT f) as)+  mpt (PHidden t) = PHidden (mapPT f t)+  mpt (PDoBlock ds) = PDoBlock (map (fmap (mapPT f)) ds)+  mpt (PProof ts) = PProof (map (fmap (mapPT f)) ts)+  mpt (PTactics ts) = PTactics (map (fmap (mapPT f)) ts)+  mpt x = x+++data PTactic' t = Intro [Name] | Intros | Focus Name+                | Refine Name [Bool] | Rewrite t | LetTac Name t+                | Exact t | Compute | Trivial+                | Solve+                | Attack+                | ProofState | ProofTerm | Undo+                | Try (PTactic' t) (PTactic' t)+                | TSeq (PTactic' t) (PTactic' t)+                | Qed+    deriving (Show, Eq, Functor)+{-! +deriving instance Binary PTactic' +!-}++type PTactic = PTactic' PTerm++data PDo' t = DoExp  FC t+            | DoBind FC Name t+            | DoBindP FC t t+            | DoLet  FC Name t t+            | DoLetP FC t t+    deriving (Eq, Functor)+{-! +deriving instance Binary PDo' +!-}++type PDo = PDo' PTerm++-- The priority gives a hint as to elaboration order. Best to elaborate+-- things early which will help give a more concrete type to other+-- variables, e.g. a before (interpTy a).++data PArg' t = PImp { priority :: Int, +                      lazyarg :: Bool, pname :: Name, getTm :: t }+             | PExp { priority :: Int,+                      lazyarg :: Bool, getTm :: t }+             | PConstraint { priority :: Int,+                             lazyarg :: Bool, getTm :: t }+    deriving (Show, Eq, Functor)+{-! +deriving instance Binary PArg' +!-}++pimp = PImp 0 True+pexp = PExp 0 False+pconst = PConstraint 0 False++type PArg = PArg' PTerm++-- Type class data++data ClassInfo = CI { instanceName :: Name,+                      class_methods :: [(Name, PTerm)],+                      class_defaults :: [(Name, Name)], -- method name -> default impl+                      class_params :: [Name] }+    deriving Show+{-! +deriving instance Binary ClassInfo +!-}++data OptInfo = Optimise { collapsible :: Bool,+                          forceable :: [Int], -- argument positions+                          recursive :: [Int] }+    deriving Show+{-! +deriving instance Binary OptInfo +!-}+++data TypeInfo = TI { con_names :: [Name] }+    deriving Show+{-!+deriving instance Binary TypeInfo+!-}++-- Syntactic sugar info ++data DSL = DSL { dsl_bind    :: PTerm,+                 dsl_return  :: PTerm,+                 dsl_apply   :: PTerm,+                 dsl_pure    :: PTerm,+                 index_first :: Maybe PTerm,+                 index_next  :: Maybe PTerm,+                 dsl_lambda  :: Maybe PTerm,+                 dsl_let     :: Maybe PTerm+               }+    deriving Show++data SynContext = PatternSyntax | TermSyntax | AnySyntax+    deriving Show+{-! +deriving instance Binary SynContext +!-}++data Syntax = Rule [SSymbol] PTerm SynContext+    deriving Show+{-! +deriving instance Binary Syntax +!-}++data SSymbol = Keyword Name+             | Symbol String+             | Expr Name+    deriving Show+{-! +deriving instance Binary SSymbol +!-}++initDSL = DSL (PRef f (UN ">>=")) +              (PRef f (UN "return"))+              (PRef f (UN "<$>"))+              (PRef f (UN "pure"))+              Nothing+              Nothing+              Nothing+              Nothing+  where f = FC "(builtin)" 0++data SyntaxInfo = Syn { using :: [(Name, PTerm)],+                        syn_params :: [(Name, PTerm)],+                        syn_namespace :: [String],+                        no_imp :: [Name],+                        decoration :: Name -> Name,+                        inPattern :: Bool,+                        dsl_info :: DSL }+    deriving Show++defaultSyntax = Syn [] [] [] [] id False initDSL++--- Pretty printing declarations and terms++instance Show PTerm where+    show tm = showImp False tm++instance Show PDecl where+    show (PFix _ f ops) = show f ++ " " ++ showSep ", " ops+    show (PTy _ _ n ty) = show n ++ " : " ++ show ty+    show (PClauses _ _ n c) = showSep "\n" (map show c)+    show (PData _ _ d) = show d++instance Show PClause where+    show c = showCImp True c++instance Show PData where+    show d = showDImp False d++showCImp :: Bool -> PClause -> String+showCImp impl (PClause n l ws r w) +   = showImp impl l ++ showWs ws ++ " = " ++ showImp impl r+             ++ " where " ++ show w +  where+    showWs [] = ""+    showWs (x : xs) = " | " ++ showImp impl x ++ showWs xs+showCImp impl (PWith n l ws r w) +   = showImp impl l ++ showWs ws ++ " with " ++ showImp impl r+             ++ " { " ++ show w ++ " } " +  where+    showWs [] = ""+    showWs (x : xs) = " | " ++ showImp impl x ++ showWs xs+++showDImp :: Bool -> PData -> String+showDImp impl (PDatadecl n ty cons) +   = "data " ++ show n ++ " : " ++ showImp impl ty ++ " where\n\t"+     ++ showSep "\n\t| " +            (map (\ (n, t, _) -> show n ++ " : " ++ showImp impl t) cons)++getImps :: [PArg] -> [(Name, PTerm)]+getImps [] = []+getImps (PImp _ _ n tm : xs) = (n, tm) : getImps xs+getImps (_ : xs) = getImps xs++getExps :: [PArg] -> [PTerm]+getExps [] = []+getExps (PExp _ _ tm : xs) = tm : getExps xs+getExps (_ : xs) = getExps xs++getConsts :: [PArg] -> [PTerm]+getConsts [] = []+getConsts (PConstraint _ _ tm : xs) = tm : getConsts xs+getConsts (_ : xs) = getConsts xs++getAll :: [PArg] -> [PTerm]+getAll = map getTm ++showImp :: Bool -> PTerm -> String+showImp impl tm = se 10 tm where+    se p (PQuote r) = "![" ++ show r ++ "]"+    se p (PRef _ n) = if impl then show n+                              else showbasic n+      where showbasic n@(UN _) = show n+            showbasic (MN _ s) = s+            showbasic (NS n s) = showSep "." (reverse s) ++ "." ++ showbasic n+    se p (PLam n ty sc) = bracket p 2 $ "\\ " ++ show n ++ " => " ++ show sc+    se p (PLet n ty v sc) = bracket p 2 $ "let " ++ show n ++ " = " ++ se 10 v +++                            " in " ++ se 10 sc +    se p (PPi (Exp l s) n ty sc)+        | n `elem` allNamesIn sc = bracket p 2 $+                                    if l then "|(" else "(" ++ +                                    show n ++ " : " ++ se 10 ty ++ +                                    ") " ++ st +++                                    "-> " ++ se 10 sc+        | otherwise = bracket p 2 $ se 0 ty ++ " " ++ st ++ "-> " ++ se 10 sc+      where st = case s of+                    Static -> "[static] "+                    _ -> ""+    se p (PPi (Imp l s) n ty sc)+        | impl = bracket p 2 $ if l then "|{" else "{" ++ +                               show n ++ " : " ++ se 10 ty ++ +                               "} " ++ st ++ "-> " ++ se 10 sc+        | otherwise = se 10 sc+      where st = case s of+                    Static -> "[static] "+                    _ -> ""+    se p (PPi (Constraint _ _) n ty sc)+        = bracket p 2 $ se 10 ty ++ " => " ++ se 10 sc+    se p (PApp _ (PRef _ f) [])+        | not impl = show f+    se p (PApp _ (PRef _ op@(UN (f:_))) args)+        | length (getExps args) == 2 && not impl && not (isAlpha f) +            = let [l, r] = getExps args in+              bracket p 1 $ se 1 l ++ " " ++ show op ++ " " ++ se 0 r+    se p (PApp _ f as) +        = let args = getExps as in+              bracket p 1 $ se 1 f ++ if impl then concatMap sArg as+                                              else concatMap seArg args+    se p (PCase _ scr opts) = "case " ++ se 10 scr ++ " of " ++ showSep " | " (map sc opts)+       where sc (l, r) = se 10 l ++ " => " ++ se 10 r+    se p (PHidden tm) = "." ++ se 0 tm+    se p (PRefl _) = "refl"+    se p (PResolveTC _) = "resolvetc"+    se p (PTrue _) = "()"+    se p (PFalse _) = "_|_"+    se p (PEq _ l r) = bracket p 2 $ se 10 l ++ " = " ++ se 10 r+    se p (PPair _ l r) = "(" ++ se 10 l ++ ", " ++ se 10 r ++ ")"+    se p (PDPair _ l t r) = "(" ++ se 10 l ++ " ** " ++ se 10 r ++ ")"+    se p (PAlternative as) = "(|" ++ showSep " , " (map (se 10) as) ++ "|)"+    se p PSet = "Set"+    se p (PConstant c) = show c+    se p (PProof ts) = "proof { " ++ show ts ++ "}"+    se p (PTactics ts) = "tactics { " ++ show ts ++ "}"+    se p (PMetavar n) = "?" ++ show n+    se p (PReturn f) = "return"+    se p PImpossible = "impossible"+    se p Placeholder = "_"+    se p (PDoBlock _) = "do block show not implemented"+    se p (PElabError s) = s+--     se p x = "Not implemented"++    sArg (PImp _ _ n tm) = siArg (n, tm)+    sArg (PExp _ _ tm) = seArg tm+    sArg (PConstraint _ _ tm) = scArg tm++    seArg arg      = " " ++ se 0 arg+    siArg (n, val) = " {" ++ show n ++ " = " ++ se 10 val ++ "}"+    scArg val = " {{" ++ se 10 val ++ "}}"++    bracket outer inner str | inner > outer = "(" ++ str ++ ")"+                            | otherwise = str++allNamesIn :: PTerm -> [Name]+allNamesIn tm = nub $ ni [] tm +  where+    ni env (PRef _ n)        +        | not (n `elem` env) = [n]+    ni env (PApp _ f as)   = ni env f ++ concatMap (ni env) (map getTm as)+    ni env (PCase _ c os)  = ni env c ++ concatMap (ni env) (map snd os)+    ni env (PLam n ty sc)  = ni env ty ++ ni (n:env) sc+    ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc+    ni env (PHidden tm)    = ni env tm+    ni env (PEq _ l r)     = ni env l ++ ni env r+    ni env (PPair _ l r)   = ni env l ++ ni env r+    ni env (PDPair _ (PRef _ n) t r)  = ni env t ++ ni (n:env) r+    ni env (PDPair _ l t r)  = ni env l ++ ni env t ++ ni env r+    ni env (PAlternative ls) = concatMap (ni env) ls+    ni env _               = []++namesIn :: [(Name, PTerm)] -> IState -> PTerm -> [Name]+namesIn uvars ist tm = nub $ ni [] tm +  where+    ni env (PRef _ n)        +        | not (n `elem` env) +            = case lookupTy Nothing n (tt_ctxt ist) of+                [] -> [n]+                _ -> if n `elem` (map fst uvars) then [n] else []+    ni env (PApp _ f as)   = ni env f ++ concatMap (ni env) (map getTm as)+    ni env (PCase _ c os)  = ni env c ++ concatMap (ni env) (map snd os)+    ni env (PLam n ty sc)  = ni env ty ++ ni (n:env) sc+    ni env (PPi _ n ty sc) = ni env ty ++ ni (n:env) sc+    ni env (PEq _ l r)     = ni env l ++ ni env r+    ni env (PPair _ l r)   = ni env l ++ ni env r+    ni env (PDPair _ (PRef _ n) t r) = ni env t ++ ni (n:env) r+    ni env (PDPair _ l t r) = ni env l ++ ni env t ++ ni env r+    ni env (PAlternative as) = concatMap (ni env) as+    ni env (PHidden tm)    = ni env tm+    ni env _               = []++-- For inferring types of things++bi = FC "builtin" 0++inferTy   = MN 0 "__Infer"+inferCon  = MN 0 "__infer"+inferDecl = PDatadecl inferTy +                      PSet+                      [(inferCon, PPi impl (MN 0 "A") PSet (+                                  PPi expl (MN 0 "a") (PRef bi (MN 0 "A"))+                                  (PRef bi inferTy)), bi)]++infTerm t = PApp bi (PRef bi inferCon) [pimp (MN 0 "A") Placeholder, pexp t]+infP = P (TCon 6 0) inferTy (Set (UVal 0))++getInferTerm, getInferType :: Term -> Term+getInferTerm (Bind n b sc) = Bind n b $ getInferTerm sc+getInferTerm (App (App _ _) tm) = tm+getInferTerm tm = error ("getInferTerm " ++ show tm)++getInferType (Bind n b sc) = Bind n b $ getInferType sc+getInferType (App (App _ ty) _) = ty++-- Handy primitives: Unit, False, Pair, MkPair, =, mkForeign++primNames = [unitTy, unitCon,+             falseTy, pairTy, pairCon,+             eqTy, eqCon, inferTy, inferCon]++unitTy   = MN 0 "__Unit"+unitCon  = MN 0 "__II"+unitDecl = PDatadecl unitTy PSet+                     [(unitCon, PRef bi unitTy, bi)]++falseTy   = MN 0 "__False"+falseDecl = PDatadecl falseTy PSet []++pairTy    = MN 0 "__Pair"+pairCon   = MN 0 "__MkPair"+pairDecl  = PDatadecl pairTy (piBind [(n "A", PSet), (n "B", PSet)] PSet)+            [(pairCon, PPi impl (n "A") PSet (+                       PPi impl (n "B") PSet (+                       PPi expl (n "a") (PRef bi (n "A")) (+                       PPi expl (n "b") (PRef bi (n "B"))  +                           (PApp bi (PRef bi pairTy) [pexp (PRef bi (n "A")),+                                                pexp (PRef bi (n "B"))])))), bi)]+    where n a = MN 0 a++eqTy = UN "="+eqCon = UN "refl"+eqDecl = PDatadecl eqTy (piBind [(n "a", PSet), (n "b", PSet),+                                 (n "x", PRef bi (n "a")), (n "y", PRef bi (n "b"))]+                                 PSet)+                [(eqCon, PPi impl (n "a") PSet (+                         PPi impl (n "x") (PRef bi (n "a"))+                           (PApp bi (PRef bi eqTy) [pimp (n "a") Placeholder,+                                                    pimp (n "b") Placeholder,+                                                    pexp (PRef bi (n "x")),+                                                    pexp (PRef bi (n "x"))])), bi)]+    where n a = MN 0 a++-- Defined in builtins.idr+sigmaTy   = UN "Exists"+existsCon = UN "Ex_intro"++piBind :: [(Name, PTerm)] -> PTerm -> PTerm+piBind [] t = t+piBind ((n, ty):ns) t = PPi expl n ty (piBind ns t)+    +tcname (UN ('@':_)) = True+tcname (NS n _) = tcname n+tcname _ = False++-- Dealing with parameters++expandParams :: (Name -> Name) -> [(Name, PTerm)] -> [Name] -> PTerm -> PTerm+expandParams dec ps ns tm = en tm+  where+    -- if we shadow a name (say in a lambda binding) that is used in a call to+    -- a lifted function, we need access to both names - once in the scope of the+    -- binding and once to call the lifted functions. So we'll explicitly shadow+    -- it. (Yes, it's a hack. The alternative would be to resolve names earlier+    -- but we didn't...)+    +    mkShadow (UN n) = MN 0 n+    mkShadow (MN i n) = MN (i+1) n+    mkShadow (NS x s) = NS (mkShadow x) s++    en (PLam n t s)+       | n `elem` map fst ps+               = let n' = mkShadow n in+                     PLam n' (en t) (en (shadow n n' s))+       | otherwise = PLam n (en t) (en s)+    en (PPi p n t s) +       | n `elem` map fst ps+               = let n' = mkShadow n in+                     PPi p n' (en t) (en (shadow n n' s))+       | otherwise = PPi p n (en t) (en s)+    en (PLet n ty v s) +       | n `elem` map fst ps+               = let n' = mkShadow n in+                     PLet n' (en ty) (en v) (en (shadow n n' s))+       | otherwise = PLet n (en ty) (en v) (en s)+    en (PEq f l r) = PEq f (en l) (en r)+    en (PPair f l r) = PPair f (en l) (en r)+    en (PDPair f l t r) = PDPair f (en l) (en t) (en r)+    en (PAlternative as) = PAlternative (map en as)+    en (PHidden t) = PHidden (en t)+    en (PDoBlock ds) = PDoBlock (map (fmap en) ds)+    en (PProof ts)   = PProof (map (fmap en) ts)+    en (PTactics ts) = PTactics (map (fmap en) ts)++    en (PQuote (Var n)) +        | n `elem` ns = PQuote (Var (dec n))+    en (PApp fc (PRef fc' n) as)+        | n `elem` ns = PApp fc (PRef fc' (dec n)) +                           (map (pexp . (PRef fc)) (map fst ps) ++ (map (fmap en) as))+    en (PRef fc n)+        | n `elem` ns = PApp fc (PRef fc (dec n)) +                           (map (pexp . (PRef fc)) (map fst ps))+    en (PApp fc f as) = PApp fc (en f) (map (fmap en) as)+    en (PCase fc c os) = PCase fc (en c) (map (pmap en) os)+    en t = t++expandParamsD :: IState -> +                 (Name -> Name) -> [(Name, PTerm)] -> [Name] -> PDecl -> PDecl+expandParamsD ist dec ps ns (PTy syn fc n ty) +    = if n `elem` ns+         then PTy syn fc (dec n) (piBind ps (expandParams dec ps ns ty))+         else PTy syn fc n (expandParams dec ps ns ty)+expandParamsD ist dec ps ns (PClauses fc opts n cs)+    = let n' = if n `elem` ns then dec n else n in+          PClauses fc opts n' (map expandParamsC cs)+  where+    expandParamsC (PClause n lhs ws rhs ds)+        = let -- ps' = updateps True (namesIn ist rhs) (zip ps [0..])+              ps'' = updateps False (namesIn [] ist lhs) (zip ps [0..])+              n' = if n `elem` ns then dec n else n in+              PClause n' (expandParams dec ps'' ns lhs)+                         (map (expandParams dec ps'' ns) ws)+                         (expandParams dec ps'' ns rhs)+                         (map (expandParamsD ist dec ps'' ns) ds)+    expandParamsC (PWith n lhs ws wval ds)+        = let -- ps' = updateps True (namesIn ist wval) (zip ps [0..])+              ps'' = updateps False (namesIn [] ist lhs) (zip ps [0..])+              n' = if n `elem` ns then dec n else n in+              PWith n' (expandParams dec ps'' ns lhs)+                       (map (expandParams dec ps'' ns) ws)+                       (expandParams dec ps'' ns wval)+                       (map (expandParamsD ist dec ps'' ns) ds)+    updateps yn nm [] = []+    updateps yn nm (((a, t), i):as)+        | (a `elem` nm) == yn = (a, t) : updateps yn nm as+        | otherwise = (MN i (show n ++ "_u"), t) : updateps yn nm as++expandParamsD ist dec ps ns d = d++-- Calculate a priority for a type, for deciding elaboration order+-- * if it's just a type variable or concrete type, do it early (0)+-- * if there's only type variables and injective constructors, do it next (1)+-- * if there's a function type, next (2)+-- * finally, everything else (3)++getPriority :: IState -> PTerm -> Int+getPriority i tm = pri tm +  where+    pri (PRef _ n) =+        case lookupP Nothing n (tt_ctxt i) of+            ((P (DCon _ _) _ _):_) -> 1+            ((P (TCon _ _) _ _):_) -> 1+            ((P Ref _ _):_) -> 4+            [] -> 0 -- must be locally bound, if it's not an error...+    pri (PPi _ _ x y) = max 5 (max (pri x) (pri y))+    pri (PTrue _) = 0+    pri (PFalse _) = 0+    pri (PRefl _) = 1+    pri (PEq _ l r) = max 1 (max (pri l) (pri r))+    pri (PApp _ f as) = max 1 (max (pri f) (foldr max 0 (map (pri.getTm) as))) +    pri (PCase _ f as) = max 1 (max (pri f) (foldr max 0 (map (pri.snd) as))) +    pri (PPair _ l r) = max 1 (max (pri l) (pri r))+    pri (PDPair _ l t r) = max 1 (max (pri l) (max (pri t) (pri r)))+    pri (PAlternative as) = maximum (map pri as)+    pri (PConstant _) = 0+    pri Placeholder = 1+    pri _ = 3++-- Dealing with implicit arguments++-- Add implicit Pi bindings for any names in the term which appear in an+-- argument position.++-- This has become a right mess already. Better redo it some time...++implicit :: SyntaxInfo -> Name -> PTerm -> Idris PTerm+implicit syn n ptm +    = do i <- get+         let (tm', impdata) = implicitise syn i ptm+         let (tm'', spos) = findStatics i tm'+         put (i { idris_implicits = addDef n impdata (idris_implicits i) })+         addIBC (IBCImp n)+         logLvl 5 ("Implicit " ++ show n ++ " " ++ show impdata)+         i <- get+         put (i { idris_statics = addDef n spos (idris_statics i) })+         addIBC (IBCStatic n)+         return tm''++implicitise :: SyntaxInfo -> IState -> PTerm -> (PTerm, [PArg])+implicitise syn ist tm+    = let (declimps, ns') = execState (imps True [] tm) ([], []) +          ns = ns' \\ (map fst pvars ++ no_imp syn) in+          if null ns +            then (tm, reverse declimps) +            else implicitise syn ist (pibind uvars ns tm)+  where+    uvars = using syn+    pvars = syn_params syn++    dropAll (x:xs) ys | x `elem` ys = dropAll xs ys+                      | otherwise   = x : dropAll xs ys+    dropAll [] ys = []++    imps top env (PApp _ f as)+       = do (decls, ns) <- get+            let isn = concatMap (namesIn uvars ist) (map getTm as)+            put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))+    imps top env (PPi (Imp l _) n ty sc) +        = do let isn = nub (namesIn uvars ist ty) `dropAll` [n]+             (decls , ns) <- get+             put (PImp (getPriority ist ty) l n ty : decls, +                  nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))+             imps True (n:env) sc+    imps top env (PPi (Exp l _) n ty sc) +        = do let isn = nub (namesIn uvars ist ty ++ case sc of+                            (PRef _ x) -> namesIn uvars ist sc `dropAll` [n]+                            _ -> [])+             (decls, ns) <- get -- ignore decls in HO types+             put (PExp (getPriority ist ty) l ty : decls, +                  nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))+             imps True (n:env) sc+    imps top env (PPi (Constraint l _) n ty sc)+        = do let isn = nub (namesIn uvars ist ty ++ case sc of+                            (PRef _ x) -> namesIn uvars ist sc `dropAll` [n]+                            _ -> [])+             (decls, ns) <- get -- ignore decls in HO types+             put (PConstraint 10 l ty : decls, +                  nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))+             imps True (n:env) sc+    imps top env (PEq _ l r)+        = do (decls, ns) <- get+             let isn = namesIn uvars ist l ++ namesIn uvars ist r+             put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))+    imps top env (PPair _ l r)+        = do (decls, ns) <- get+             let isn = namesIn uvars ist l ++ namesIn uvars ist r+             put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))+    imps top env (PDPair _ (PRef _ n) t r)+        = do (decls, ns) <- get+             let isn = nub (namesIn uvars ist t ++ namesIn uvars ist r) \\ [n]+             put (decls, nub (ns ++ (isn \\ (env ++ map fst (getImps decls)))))+    imps top env (PDPair _ l t r)+        = do (decls, ns) <- get+             let isn = namesIn uvars ist l ++ namesIn uvars ist t ++ +                       namesIn uvars ist r+             put (decls, nub (ns ++ (isn \\ (env ++ map fst (getImps decls)))))+    imps top env (PAlternative as)+        = do (decls, ns) <- get+             let isn = concatMap (namesIn uvars ist) as+             put (decls, nub (ns ++ (isn `dropAll` (env ++ map fst (getImps decls)))))+    imps top env (PLam n ty sc)  +        = do imps False env ty+             imps False (n:env) sc+    imps top env (PHidden tm)    = imps False env tm+    imps top env _               = return ()++    pibind using []     sc = sc+    pibind using (n:ns) sc +      = case lookup n using of+            Just ty -> PPi (Imp False Dynamic) n ty (pibind using ns sc)+            Nothing -> PPi (Imp False Dynamic) n Placeholder (pibind using ns sc)++-- Add implicit arguments in function calls++addImpl :: IState -> PTerm -> PTerm+addImpl ist ptm = ai [] ptm+  where+    ai env (PRef fc f)    +        | not (f `elem` env) = aiFn ist fc f []+    ai env (PEq fc l r)   = let l' = ai env l+                                r' = ai env r in+                                PEq fc l' r'+    ai env (PPair fc l r) = let l' = ai env l+                                r' = ai env r in+                                PPair fc l' r'+    ai env (PDPair fc l t r) = let l' = ai env l+                                   t' = ai env t+                                   r' = ai env r in+                                   PDPair fc l' t' r'+    ai env (PAlternative as) = let as' = map (ai env) as in+                                   PAlternative as'+    ai env (PApp fc (PRef _ f) as) +        | not (f `elem` env)+                          = let as' = map (fmap (ai env)) as in+                                aiFn ist fc f as'+    ai env (PApp fc f as) = let f' = ai env f+                                as' = map (fmap (ai env)) as in+                                mkPApp fc 1 f' as'+    ai env (PCase fc c os) = let c' = ai env c+                                 os' = map (pmap (ai env)) os in+                                 PCase fc c' os'+    ai env (PLam n ty sc) = let ty' = ai env ty+                                sc' = ai (n:env) sc in+                                PLam n ty' sc'+    ai env (PLet n ty val sc)+                          = let ty' = ai env ty+                                val' = ai env val+                                sc' = ai (n:env) sc in+                                PLet n ty' val' sc'+    ai env (PPi p n ty sc) = let ty' = ai env ty+                                 sc' = ai (n:env) sc in+                                 PPi p n ty' sc'+    ai env (PHidden tm) = PHidden (ai env tm)+    ai env (PProof ts) = PProof (map (fmap (ai env)) ts)+    ai env (PTactics ts) = PTactics (map (fmap (ai env)) ts)+    ai env tm = tm++aiFn :: IState -> FC -> Name -> [PArg] -> PTerm+aiFn ist fc f as+    | f `elem` primNames = PApp fc (PRef fc f) as+aiFn ist fc f as+          -- This is where namespaces get resolved by adding PAlternative+        = case lookupCtxtName Nothing f (idris_implicits ist) of+            [(f',ns)] -> mkPApp fc (length ns) (PRef fc f') (insertImpl ns as)+            [] -> if f `elem` idris_metavars ist+                    then PApp fc (PRef fc f) as+                    else mkPApp fc (length as) (PRef fc f) as+            alts -> PAlternative $+                     map (\(f', ns) -> mkPApp fc (length ns) (PRef fc f') +                                                 (insertImpl ns as)) alts+  where+    insertImpl :: [PArg] -> [PArg] -> [PArg]+    insertImpl (PExp p l ty : ps) (PExp _ _ tm : given) =+                                 PExp p l tm : insertImpl ps given+    insertImpl (PConstraint p l ty : ps) (PConstraint _ _ tm : given) =+                                 PConstraint p l tm : insertImpl ps given+    insertImpl (PConstraint p l ty : ps) given =+                                 PConstraint p l (PResolveTC fc) : insertImpl ps given+    insertImpl (PImp p l n ty : ps) given =+        case find n given [] of+            Just (tm, given') -> PImp p l n tm : insertImpl ps given'+            Nothing ->           PImp p l n Placeholder : insertImpl ps given+    insertImpl expected [] = []+    insertImpl _        given  = given++    find n []               acc = Nothing+    find n (PImp _ _ n' t : gs) acc +         | n == n' = Just (t, reverse acc ++ gs)+    find n (g : gs) acc = find n gs (g : acc)++mkPApp fc a f [] = f+mkPApp fc a f as = let rest = drop a as in+                       appRest fc (PApp fc f (take a as)) rest+  where+    appRest fc f [] = f+    appRest fc f (a : as) = appRest fc (PApp fc f [a]) as++-- Find 'static' argument positions+-- (the declared ones, plus any names in argument position in the declared +-- statics)+-- FIXME: It's possible that this really has to happen after elaboration++findStatics :: IState -> PTerm -> (PTerm, [Bool])+findStatics ist tm = let (ns, ss) = fs tm in+                         runState (pos ns ss tm) []+  where fs (PPi p n t sc)+            | Static <- pstatic p+                        = let (ns, ss) = fs sc in+                              (namesIn [] ist t : ns, namesIn [] ist t ++ n : ss)+            | otherwise = let (ns, ss) = fs sc in+                              (namesIn [] ist t : ns, ss)+        fs _ = ([], [])++        inOne n ns = length (filter id (map (elem n) ns)) == 1++        pos ns ss (PPi p n t sc) +            | n `inOne` ns && elem n ss+                        = do sc' <- pos ns ss sc+                             spos <- get+                             put (True : spos)+                             return (PPi (p { pstatic = Static }) n t sc')+            | otherwise = do sc' <- pos ns ss sc+                             spos <- get+                             put (False : spos)+                             return (PPi p n t sc')+        pos ns ss t = return t++-- Debugging/logging stuff++dumpDecls :: [PDecl] -> String+dumpDecls [] = ""+dumpDecls (d:ds) = dumpDecl d ++ "\n" ++ dumpDecls ds++dumpDecl (PFix _ f ops) = show f ++ " " ++ showSep ", " ops +dumpDecl (PTy _ _ n t) = "tydecl " ++ show n ++ " : " ++ showImp True t+dumpDecl (PClauses _ _ n cs) = "pat " ++ show n ++ "\t" ++ showSep "\n\t" (map (showCImp True) cs)+dumpDecl (PData _ _ d) = showDImp True d+dumpDecl (PParams _ ns ps) = "params {" ++ show ns ++ "\n" ++ dumpDecls ps ++ "}\n"+dumpDecl (PNamespace n ps) = "namespace {" ++ n ++ "\n" ++ dumpDecls ps ++ "}\n"+dumpDecl (PSyntax _ syn) = "syntax " ++ show syn+dumpDecl (PClass _ _ cs n ps ds) +    = "class " ++ show cs ++ " " ++ show n ++ " " ++ show ps ++ "\n" ++ dumpDecls ds+dumpDecl (PInstance _ _ cs n _ t ds) +    = "instance " ++ show cs ++ " " ++ show n ++ " " ++ show t ++ "\n" ++ dumpDecls ds+dumpDecl _ = "..."+-- dumpDecl (PImport i) = "import " ++ i++-- for 6.12/7 compatibility+data EitherErr a b = LeftErr a | RightOK b++instance Monad (EitherErr a) where+    return = RightOK++    (LeftErr e) >>= k = LeftErr e+    RightOK v   >>= k = k v++toEither (LeftErr e)  = Left e+toEither (RightOK ho) = Right ho++-- syntactic match of a against b, returning pair of variables in a +-- and what they match. Returns the pair that failed if not a match.++matchClause :: PTerm -> PTerm -> Either (PTerm, PTerm) [(Name, PTerm)]+matchClause = matchClause' False++matchClause' :: Bool -> PTerm -> PTerm -> Either (PTerm, PTerm) [(Name, PTerm)]+matchClause' names x y = checkRpts $ match (fullApp x) (fullApp y) where+    matchArg x y = match (fullApp (getTm x)) (fullApp (getTm y))++    fullApp (PApp _ (PApp fc f args) xs) = fullApp (PApp fc f (args ++ xs))+    fullApp x = x++    match' x y = match (fullApp x) (fullApp y)+    match (PApp _ (PRef _ (NS (UN "fromInteger") ["builtins"])) [_,_,x]) x' +        | PConstant (I _) <- getTm x = match (getTm x) x'+    match x' (PApp _ (PRef _ (NS (UN "fromInteger") ["builtins"])) [_,_,x])+        | PConstant (I _) <- getTm x = match (getTm x) x'+    match (PApp _ f args) (PApp _ f' args')+        | length args == length args'+            = do mf <- match' f f'+                 ms <- zipWithM matchArg args args'+                 return (mf ++ concat ms)+--     match (PRef _ n) (PRef _ n') | n == n' = return []+--                                  | otherwise = Nothing+    match (PRef f n) (PApp _ x []) = match (PRef f n) x+    match (PApp _ x []) (PRef f n) = match x (PRef f n)+    match (PRef _ n) (PRef _ n') | n == n' = return []+    match (PRef _ n) tm | not names = return [(n, tm)]+    match (PEq _ l r) (PEq _ l' r') = do ml <- match' l l'+                                         mr <- match' r r'+                                         return (ml ++ mr)+    match (PPair _ l r) (PPair _ l' r') = do ml <- match' l l'+                                             mr <- match' r r'+                                             return (ml ++ mr)+    match (PDPair _ l t r) (PDPair _ l' t' r') = do ml <- match' l l'+                                                    mt <- match' t t'+                                                    mr <- match' r r'+                                                    return (ml ++ mt ++ mr)+    match (PAlternative as) (PAlternative as') +        = do ms <- zipWithM match' as as' +             return (concat ms)+    match a@(PAlternative as) b+        = do let ms = zipWith match' as (repeat b)+             case (rights (map toEither ms)) of+                (x: _) -> return x+                _ -> LeftErr (a, b)+    match (PCase _ _ _) _ = return [] -- lifted out+    match (PMetavar _) _ = return [] -- modified+    match (PQuote _) _ = return []+    match (PProof _) _ = return []+    match (PTactics _) _ = return []+    match (PRefl _) (PRefl _) = return []+    match (PResolveTC _) (PResolveTC _) = return []+    match (PTrue _) (PTrue _) = return []+    match (PFalse _) (PFalse _) = return []+    match (PReturn _) (PReturn _) = return []+    match (PPi _ _ t s) (PPi _ _ t' s') = do mt <- match' t t'+                                             ms <- match' s s'+                                             return (mt ++ ms)+    match (PLam _ t s) (PLam _ t' s') = do mt <- match' t t'+                                           ms <- match' s s'+                                           return (mt ++ ms)+    match (PLet _ t ty s) (PLet _ t' ty' s') = do mt <- match' t t'+                                                  mty <- match' ty ty'+                                                  ms <- match' s s'+                                                  return (mt ++ mty ++ ms)+    match (PHidden x) (PHidden y) = match' x y+    match Placeholder _ = return []+    match _ Placeholder = return []+    match (PResolveTC _) _ = return []+    match a b | a == b = return []+              | otherwise = LeftErr (a, b)++    checkRpts (RightOK ms) = check ms where+        check ((n,t):xs) +            | Just t' <- lookup n xs = if t/=t' && t/=Placeholder && t'/=Placeholder+                                                then Left (t, t') +                                                else check xs+        check (_:xs) = check xs+        check [] = Right ms+    checkRpts (LeftErr x) = Left x++substMatches :: [(Name, PTerm)] -> PTerm -> PTerm+substMatches [] t = t+substMatches ((n,tm):ns) t = substMatch n tm (substMatches ns t)++substMatch :: Name -> PTerm -> PTerm -> PTerm+substMatch n tm t = sm t where+    sm (PRef _ n') | n == n' = tm+    sm (PLam x t sc) = PLam x (sm t) (sm sc)+    sm (PPi p x t sc) = PPi p x (sm t) (sm sc)+    sm (PApp f x as) = PApp f (sm x) (map (fmap sm) as)+    sm (PCase f x as) = PCase f (sm x) (map (pmap sm) as)+    sm (PEq f x y) = PEq f (sm x) (sm y)+    sm (PPair f x y) = PPair f (sm x) (sm y)+    sm (PDPair f x t y) = PDPair f (sm x) (sm t) (sm y)+    sm (PAlternative as) = PAlternative (map sm as)+    sm (PHidden x) = PHidden (sm x)+    sm x = x++shadow :: Name -> Name -> PTerm -> PTerm+shadow n n' t = sm t where+    sm (PRef fc x) | n == x = PRef fc n'+    sm (PLam x t sc) = PLam x (sm t) (sm sc)+    sm (PPi p x t sc) = PPi p x (sm t) (sm sc)+    sm (PApp f x as) = PApp f (sm x) (map (fmap sm) as)+    sm (PCase f x as) = PCase f (sm x) (map (pmap sm) as)+    sm (PEq f x y) = PEq f (sm x) (sm y)+    sm (PPair f x y) = PPair f (sm x) (sm y)+    sm (PDPair f x t y) = PDPair f (sm x) (sm t) (sm y)+    sm (PAlternative as) = PAlternative (map sm as)+    sm (PHidden x) = PHidden (sm x)+    sm x = x+
+ src/Idris/Compiler.hs view
@@ -0,0 +1,207 @@+{-# LANGUAGE PatternGuards #-}++module Idris.Compiler where++import Idris.AbsSyntax+import Idris.Transforms++import Core.TT+import Core.Evaluate+import Core.CaseTree++import Control.Monad.State+import Data.List+import System.Process+import System.IO+import System.Directory+import System.Environment++import Epic.Epic hiding (Term, Type, Name, fn, compile)+import qualified Epic.Epic as E++primDefs = [UN "mkForeign", UN "FalseElim"]++compile :: FilePath -> Term -> Idris ()+compile f tm+    = do checkMVs+         ds <- mkDecls tm+         objs <- getObjectFiles+         libs <- getLibs+         hdrs <- getHdrs+         let incs = map Include hdrs+         so <- getSO+         case so of+            Nothing ->+                do m <- epicMain tm+                   let mainval = EpicFn (name "main") m+                   liftIO $ compileObjWith [Debug] +                                (mkProgram (incs ++ mainval : ds)) (f ++ ".o")+                   liftIO $ link ((f ++ ".o") : objs ++ (map ("-l"++) libs)) f+  where checkMVs = do i <- get+                      case idris_metavars i \\ primDefs of+                            [] -> return ()+                            ms -> fail $ "There are undefined metavariables: " ++ show ms++mkDecls :: Term -> Idris [EpicDecl]+mkDecls t = do i <- getIState+               decls <- mapM build (ctxtAlist (tt_ctxt i))+               return $ basic_defs ++ decls+             +-- EpicFn (name "main") epicMain : decls++ename x = name ("idris_" ++ show x)+aname x = name ("a_" ++ show x)++epicMain tm = do e <- epic tm+                 return $ effect_ e++-- epicMain = effect_ $ -- ref (ename (UN "run__IO")) @@+--                      ref (ename (NS (UN "main") ["main"]))++class ToEpic a where+    epic :: a -> Idris E.Term++build :: (Name, Def) -> Idris EpicDecl+build (n, d) = do i <- getIState+                  case lookup n (idris_prims i) of+                    Just opDef -> return $ EpicFn (ename n) opDef+                    _ ->       do def <- epic d+                                  logLvl 3 $ "Compiled " ++ show n ++ " =\n\t" ++ show def+                                  return $ EpicFn (ename n) def++impossible = int 42424242++instance ToEpic Def where+    epic (Function tm _) = epic tm+    epic (CaseOp _ _ pats _ _ args sc) = epic (args, sc) -- optimised version+    epic _ = return impossible++instance ToEpic (TT Name) where+    epic tm = epic' [] tm where+      epic' env tm@(App f a)+          | (P _ (UN "mkForeign") _, args) <- unApply tm+              = doForeign args+          | (P _ (UN "lazy") _, [_,arg]) <- unApply tm+              = do arg' <- epic' env arg+                   return $ lazy_ arg'+          | (P _ (UN "prim__IO") _, [v]) <- unApply tm+              = epic' env v+          | (P _ (UN "io_bind") _, [_,_,v,k]) <- unApply tm+              = do v' <- epic' env v +                   k' <- epic' env k+                   return (k' @@ (effect_ v'))+          | (P (DCon t a) n _, args) <- unApply tm+              = epicCon env t a n args+      epic' env (P (DCon t a) n _) = return $ con_ t+      epic' env (P (TCon t a) n _) = return $ con_ t+      epic' env (P _ n _)          = return $ ref (ename n) +      epic' env (V i)              = return $ ref (env!!i)+      epic' env (Bind n (Lam _) sc)+            = do sc' <- epic' (aname n : env) sc+                 return $ term ([aname n], sc')+      epic' env (Bind n (Let _ v) sc)+            = do sc' <- epic' (aname n : env) sc+                 v' <- epic' env v+                 return $ let_ v' (aname n, sc') +      epic' env (Bind _ _ _) = return impossible+      epic' env (App f a) = do f' <- epic' env f+                               a' <- epic' env a+                               return (f' @@ a')+      epic' env (Constant c) = epic c+      epic' env Erased       = return impossible+      epic' env (Set _)      = return impossible++      epicCon env t arity n args+        | length args == arity = buildApp env (con_ t) args+        | otherwise = let extra = satArgs (arity - length args) in+                          do sc' <- epicCon env t arity n +                                        (args ++ map (\n -> P Bound n undefined) extra)+                             return $ term (map ename extra, sc')+        +      satArgs n = map (\i -> MN i "sat") [1..n]++      buildApp env e [] = return e+      buildApp env e (x:xs) = do x' <- epic' env x+                                 buildApp env (e @@ x') xs+                                    ++doForeign :: [TT Name] -> Idris E.Term+doForeign (_ : fgn : args)+   | (_, (Constant (Str fgnName) : fgnArgTys : P _ (UN ret) _ : [])) <- unApply fgn+        = let tys = getFTypes fgnArgTys+              rty = mkEty ret in+              do args' <- mapM epic args+                 -- wrap it in a prim__IO+                 -- return $ con_ 0 @@ impossible @@ +                 return $ lazy_ $ foreign_ rty fgnName (zip args' tys)+   | otherwise = fail "Badly formed foreign function call"++getFTypes :: TT Name -> [E.Type]+getFTypes tm = case unApply tm of+                 (nil, []) -> []+                 (cons, [(P _ (UN ty) _), xs]) -> +                    let rest = getFTypes xs in+                        mkEty ty : rest                        ++mkEty "FInt"    = tyInt+mkEty "FFloat"  = tyFloat+mkEty "FChar"   = tyChar+mkEty "FString" = tyString+mkEty "FPtr"    = tyPtr+mkEty "FUnit"   = tyUnit++instance ToEpic Const where+    epic (I i)   = return (int i)+    epic (BI i)  = return (bigint i)+    epic (Fl f)  = return (float f)+    epic (Str s) = return (str s)+    epic (Ch c)  = return (char c)+    epic IType   = return $ con_ 1+    epic FlType  = return $ con_ 2+    epic ChType  = return $ con_ 3+    epic StrType = return $ con_ 4+    epic PtrType = return $ con_ 5+    epic BIType  = return $ con_ 6++instance ToEpic ([Name], SC) where+    epic (args, tree) = do logLvl 3 $ "Compiling " ++ show args ++ "\n" ++ show tree+                           tree' <- epic tree+                           return $ term (map ename args, tree')++instance ToEpic SC where+    epic (Case n [ConCase _ i ns sc])+        = epicLet n ns 0 sc+      where+        epicLet x [] _ sc = epic sc+        epicLet x (n:ns) i sc +            = do sc' <- epicLet x ns (i+1) sc+                 return $ let_ (ref (ename x) !. i) (ename n, sc')++    epic (STerm t) = epic t+    epic (UnmatchedCase str) = return $ error_ str+    epic (Case n alts) = do alts' <- mapM mkEpicAlt alts+                            return $ case_ (ref (ename n)) alts'+      where+        mkEpicAlt (ConCase n t args rhs) = do rhs' <- epic rhs+                                              return $ con t (map ename args, rhs')+        mkEpicAlt (ConstCase (I i) rhs)  = do rhs' <- epic rhs+                                              return $ constcase i rhs'+        mkEpicAlt (ConstCase IType rhs) = do rhs' <- epic rhs +                                             return $ defaultcase rhs'+        mkEpicAlt (ConstCase c rhs)      +           = fail $ "Can only pattern match on integer constants (" ++ show c ++ ")"+        mkEpicAlt (DefaultCase rhs)      = do rhs' <- epic rhs+                                              return $ defaultcase rhs'++tempfile :: IO (FilePath, Handle)+tempfile = do env <- environment "TMPDIR"+              let dir = case env of+                              Nothing -> "/tmp"+                              (Just d) -> d+              openTempFile dir "esc"++environment :: String -> IO (Maybe String)+environment x = catch (do e <- getEnv x+                          return (Just e))+                      (\_ -> return Nothing)+
+ src/Idris/Coverage.hs view
@@ -0,0 +1,97 @@+{-# LANGUAGE PatternGuards #-}++module Idris.Coverage where++import Core.TT+import Core.Evaluate+import Idris.AbsSyntax+import Idris.Delaborate++import Data.List+import Debug.Trace++-- Given a list of LHSs, generate a extra clauses which cover the remaining+-- cases. The ones which haven't been provided are marked 'absurd' so that the+-- checker will make sure they can't happen.++-- This will only work after the given clauses have been typechecked and the+-- names are fully explicit!++genClauses :: FC -> Name -> [Term] -> [PClause] -> Idris [PClause]+genClauses fc n xs given+   = do i <- getIState+        let lhss = map (getLHS i) xs+        let argss = transpose lhss+        let all_args = map (genAll i) argss+        logLvl 7 $ "COVERAGE of " ++ show n+        logLvl 10 $ show argss ++ "\n" ++ show all_args+        logLvl 10 $ "Original: \n" ++ +                        showSep "\n" (map (\t -> showImp True (delab' i t True)) xs)+        let parg = case lookupCtxt Nothing n (idris_implicits i) of+                        (p : _) -> p+                        _ -> repeat (pexp Placeholder)+        let new = mnub i $ filter (noMatch i) $ mkClauses parg all_args+        logLvl 7 $ "New clauses: \n" ++ showSep "\n" (map (showImp True) new)+        return (map (\t -> PClause n t [] PImpossible []) new)+  where getLHS i term +            | (f, args) <- unApply term = map (\t -> delab' i t True) args+            | otherwise = []++        lhsApp (PClause _ l _ _ _) = l+        lhsApp (PWith _ l _ _ _) = l++        mnub i [] = []+        mnub i (x : xs) = +            if (any (\t -> case matchClause x t of+                                Right _ -> True+                                Left _ -> False) xs) then mnub i xs +                                                     else x : mnub i xs++        noMatch i tm = all (\x -> case matchClause (delab' i x True) tm of+                                          Right _ -> False+                                          Left miss -> True) xs +++        mkClauses :: [PArg] -> [[PTerm]] -> [PTerm]+        mkClauses parg args+            = do args' <- mkArg args+                 let tm = PApp fc (PRef fc n) (zipWith upd args' parg)+                 return tm+          where+            mkArg :: [[PTerm]] -> [[PTerm]]+            mkArg [] = return []+            mkArg (a : as) = do a' <- a+                                as' <- mkArg as+                                return (a':as')++genAll :: IState -> [PTerm] -> [PTerm]+genAll i args = concatMap otherPats (nub args)+  where +    otherPats :: PTerm -> [PTerm]+    otherPats o@(PRef fc n) = ops fc n [] o+    otherPats o@(PApp _ (PRef fc n) xs) = ops fc n xs o+    otherPats arg = return arg++    ops fc n xs o+        | (TyDecl c@(DCon _ arity) ty : _) <- lookupDef Nothing n (tt_ctxt i)+            = do xs' <- mapM otherPats (map getTm xs)+                 let p = PApp fc (PRef fc n) (zipWith upd xs' xs)+                 let tyn = getTy n (tt_ctxt i)+                 case lookupCtxt Nothing tyn (idris_datatypes i) of+                         (TI ns : _) -> p : map (mkPat fc) (ns \\ [n])+                         _ -> [p]+    ops fc n arg o = return o++    getTy n ctxt = case lookupTy Nothing n ctxt of+                          (t : _) -> case unApply (getRetTy t) of+                                        (P _ tyn _, _) -> tyn+                                        x -> error $ "Can't happen getTy 1 " ++ show (n, x)+                          _ -> error "Can't happen getTy 2"++    mkPat fc x = case lookupCtxt Nothing x (idris_implicits i) of+                      (pargs : _)+                         -> PApp fc (PRef fc x) (map (upd Placeholder) pargs)  +                      _ -> error "Can't happen - genAll"++upd p' p = p { getTm = p' }+
+ src/Idris/DataOpts.hs view
@@ -0,0 +1,145 @@+{-# LANGUAGE PatternGuards #-}++module Idris.DataOpts where++-- Forcing, detagging and collapsing++import Idris.AbsSyntax+import Core.TT++import Data.List+import Data.Maybe+import Debug.Trace++-- Calculate the forceable arguments to a constructor and update the set of+-- optimisations++forceArgs :: Name -> Type -> Idris ()+forceArgs n t = do let fargs = force 0 t+                   i <- getIState+                   copt <- case lookupCtxt Nothing n (idris_optimisation i) of+                                 []     -> return $ Optimise False [] []+                                 (op:_) -> return op+                   let opts = addDef n (copt { forceable = fargs }) (idris_optimisation i)+                   putIState (i { idris_optimisation = opts })+                   addIBC (IBCOpt n)+                   iLOG $ "Forced: " ++ show n ++ " " ++ show fargs ++ "\n   from " +++                          show t+  where+    force :: Int -> Term -> [Int]+    force i (Bind _ (Pi _) sc) +        = force (i + 1) $ instantiate (P Bound (MN i "?") Erased) sc+    force _ sc@(App f a) +        | (_, args) <- unApply sc +            = nub $ concatMap guarded args+    force _ _ = []++    isF (P _ (MN force "?") _) = Just force+    isF _ = Nothing++    guarded :: Term -> [Int]+    guarded t@(App f a)+        | (P (TCon _ _) _ _, args) <- unApply t+            = mapMaybe isF args ++ concatMap guarded args+        | (P (DCon _ _) _ _, args) <- unApply t+            = mapMaybe isF args ++ concatMap guarded args+    guarded t = mapMaybe isF [t]++-- Calculate whether a collection of constructors is collapsible++collapseCons :: Name -> [(Name, Type)] -> Idris ()+collapseCons ty cons = +                do i <- getIState+                   return ()++class Optimisable term where+    applyOpts :: term -> Idris term++instance (Optimisable a, Optimisable b) => Optimisable (a, b) where+    applyOpts (x, y) = do x' <- applyOpts x+                          y' <- applyOpts y+                          return (x', y')++instance Optimisable a => Optimisable [a] where+    applyOpts = mapM applyOpts++-- Raw is for compile time optimisation (before type checking)+-- Term is for run time optimisation (after type checking, collapsing allowed)++-- Compile time: no collapsing++instance Optimisable Raw where+    applyOpts t@(RApp f a)+        | (Var n, args) <- raw_unapply t -- MAGIC HERE+            = do args' <- mapM applyOpts args+                 i <- getIState+                 case lookupCtxt Nothing n (idris_optimisation i) of+                    (oi:_) -> return $ applyDataOpt oi n args'+                    _ -> return (raw_apply (Var n) args')+        | otherwise = do f' <- applyOpts f+                         a' <- applyOpts a+                         return (RApp f' a')+    applyOpts (RBind n b t) = do b' <- applyOpts b+                                 t' <- applyOpts t+                                 return (RBind n b' t')+    applyOpts (RForce t) = applyOpts t+    applyOpts t = return t++instance Optimisable t => Optimisable (Binder t) where+    applyOpts (Let t v) = do t' <- applyOpts t+                             v' <- applyOpts v+                             return (Let t' v')+    applyOpts b = do t' <- applyOpts (binderTy b)+                     return (b { binderTy = t' })+++applyDataOpt :: OptInfo -> Name -> [Raw] -> Raw+applyDataOpt oi n args+    = let args' = zipWith doForce (map (\x -> x `elem` (forceable oi)) [0..]) +                                  args in+          raw_apply (Var n) args'+  where+    doForce True  a = RForce a+    doForce False a = a++-- Run-time: do everything++instance Optimisable (TT Name) where+    applyOpts t@(App f a)+        | (c@(P (DCon t arity) n _), args) <- unApply t -- MAGIC HERE+            = do args' <- mapM applyOpts args+                 i <- getIState+                 case lookupCtxt Nothing n (idris_optimisation i) of+                      (oi:_) -> do return $ applyDataOptRT oi n t arity args'+                      _ -> return (mkApp c args')+        | otherwise = do f' <- applyOpts f+                         a' <- applyOpts a+                         return (App f' a')+    applyOpts (Bind n b t) = do b' <- applyOpts b+                                t' <- applyOpts t+                                return (Bind n b' t')+    applyOpts t = return t++-- Need to saturate arguments first to ensure that erasure happens uniformly++applyDataOptRT :: OptInfo -> Name -> Int -> Int -> [Term] -> Term+applyDataOptRT oi n tag arity args+    | length args == arity = doOpts n args (collapsible oi) (forceable oi)+    | otherwise = let extra = satArgs (arity - length args)+                      tm = doOpts n (args ++ map (\n -> P Bound n Erased) extra) +                                    (collapsible oi) (forceable oi) in+                      bind extra tm+  where+    satArgs n = map (\i -> MN i "sat") [1..n]++    bind [] tm = tm+    bind (n:ns) tm = Bind n (Lam Erased) (pToV n (bind ns tm))++    doOpts n args True f = Erased+    doOpts n args _ forced+        = let args' = filter keep (zip (map (\x -> x `elem` forced) [0..])+                                       args) in+              mkApp (P (DCon tag (arity - length forced)) n Erased) (map snd args')++    keep (forced, _) = not forced+
+ src/Idris/Delaborate.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE PatternGuards #-}++module Idris.Delaborate where++-- Convert core TT back into high level syntax, primarily for display+-- purposes.++import Idris.AbsSyntax+import Core.TT++import Debug.Trace++delab :: IState -> Term -> PTerm+delab i tm = delab' i tm False++delab' :: IState -> Term -> Bool -> PTerm+delab' ist tm fullname = de [] tm+  where+    un = FC "(val)" 0++    de env (App f a) = deFn env f [a]+    de env (V i)     | i < length env = PRef un (env!!i)+                     | otherwise = PRef un (UN ("v" ++ show i ++ ""))+    de env (P _ n _) | n == unitTy = PTrue un+                     | n == unitCon = PTrue un+                     | n == falseTy = PFalse un+                     | otherwise = PRef un (dens n)+    de env (Bind n (Lam ty) sc) = PLam n (de env ty) (de (n:env) sc)+    de env (Bind n (Pi ty) sc)  = PPi expl n (de env ty) (de (n:env) sc)+    de env (Bind n (Let ty val) sc) +        = PLet n (de env ty) (de env val) (de (n:env) sc)+    de env (Bind n _ sc) = de (n:env) sc+    de env (Constant i) = PConstant i+    de env Erased = Placeholder+    de env (Set i) = PSet ++    dens x | fullname = x+    dens ns@(NS n _) = case lookupCtxt Nothing n (idris_implicits ist) of+                              [_] -> n -- just one thing+                              _ -> ns+    dens n = n++    deFn env (App f a) args = deFn env f (a:args)+    deFn env (P _ n _) [l,r]     | n == pairTy  = PPair un (de env l) (de env r)+                                 | n == eqCon   = PRefl un+                                 | n == UN "lazy" = de env r+                                 | n == UN "Exists" = PDPair un (de env l) Placeholder+                                                                (de env r)+    deFn env (P _ n _) [_,_,l,r] | n == pairCon = PPair un (de env l) (de env r)+                                 | n == eqTy    = PEq un (de env l) (de env r)+                                 | n == UN "Ex_intro" = PDPair un (de env l) Placeholder+                                                                  (de env r)+    deFn env (P _ n _) args = mkPApp (dens n) (map (de env) args)+    deFn env f args = PApp un (de env f) (map pexp (map (de env) args))++    mkPApp n args +        | [imps] <- lookupCtxt Nothing n (idris_implicits ist)+            = PApp un (PRef un n) (zipWith imp (imps ++ repeat (pexp undefined)) args)+        | otherwise = PApp un (PRef un n) (map pexp args)++    imp (PImp p l n _) arg = PImp p l n arg+    imp (PExp p l _)   arg = PExp p l arg+    imp (PConstraint p l _) arg = PConstraint p l arg++pshow :: IState -> Err -> String+pshow i (Msg s) = s+pshow i (CantUnify x y e s) = "Can't unify " ++ show (delab i x)+                            ++ " with " ++ show (delab i y) +--                              ++ "\n\t(" ++ pshow i e ++ ")"+pshow i (NotInjective p x y) = "Can't verify injectivity of " ++ show (delab i p) +++                               " when unifying " ++ show (delab i x) ++ " and " ++ +                                                    show (delab i y)+pshow i (IncompleteTerm t) = "Incomplete term " ++ show t+pshow i UniverseError = "Universe inconsistency"+pshow i ProgramLineComment = "Program line next to comment"+pshow i (At f e) = show f ++ ":" ++ pshow i e+
+ src/Idris/ElabDecls.hs view
@@ -0,0 +1,634 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor #-}++module Idris.ElabDecls where++import Idris.AbsSyntax+import Idris.Error+import Idris.Delaborate+import Idris.Imports+import Idris.ElabTerm+import Idris.Coverage+import Idris.DataOpts+import Paths_idris++import Core.TT+import Core.Elaborate hiding (Tactic(..))+import Core.Evaluate+import Core.Typecheck+import Core.CaseTree++import Control.Monad+import Control.Monad.State+import Data.List+import Data.Maybe+import Debug.Trace+++recheckC ctxt fc env t +    = do -- t' <- applyOpts (forget t) (doesn't work, or speed things up...)+         (tm, ty, cs) <- tclift $ recheck ctxt env (forget t) t+         addConstraints fc cs+         return (tm, ty)++checkDef fc ns = do ctxt <- getContext+                    mapM (\(n, t) -> do (t', _) <- recheckC ctxt fc [] t+                                        return (n, t')) ns++elabType :: ElabInfo -> SyntaxInfo -> FC -> Name -> PTerm -> Idris ()+elabType info syn fc n ty' = {- let ty' = piBind (params info) ty_in +                                      n  = liftname info n_in in    -}+      do checkUndefined fc n+         ctxt <- getContext+         i <- get+         ty' <- implicit syn n ty'+         let ty = addImpl i ty'+         logLvl 2 $ show n ++ " type " ++ showImp True ty+         ((ty', defer, is), log) <- tclift $ elaborate ctxt n (Set (UVal 0)) []+                                             (erun fc (build i info False n ty))+         (cty, _)   <- recheckC ctxt fc [] ty'+         logLvl 2 $ "---> " ++ show cty+         let nty = normalise ctxt [] cty+         ds <- checkDef fc ((n, nty):defer)+         addIBC (IBCDef n)+         addDeferred ds+         mapM_ (elabCaseBlock info) is ++elabData :: ElabInfo -> SyntaxInfo -> FC -> PData -> Idris ()+elabData info syn fc (PDatadecl n t_in dcons)+    = do iLOG (show fc)+         checkUndefined fc n+         ctxt <- getContext+         i <- get+         t_in <- implicit syn n t_in+         let t = addImpl i t_in+         ((t', defer, is), log) <- tclift $ elaborate ctxt n (Set (UVal 0)) []+                                            (erun fc (build i info False n t))+         def' <- checkDef fc defer+         addDeferred def'+         mapM_ (elabCaseBlock info) is+         (cty, _)  <- recheckC ctxt fc [] t'+         logLvl 2 $ "---> " ++ show cty+         updateContext (addTyDecl n cty) -- temporary, to check cons+         cons <- mapM (elabCon info syn) dcons+         ttag <- getName+         i <- get+         put (i { idris_datatypes = addDef n (TI (map fst cons)) +                                            (idris_datatypes i) })+         addIBC (IBCDef n)+         addIBC (IBCData n)+         collapseCons n cons+         updateContext (addDatatype (Data n ttag cty cons))++elabCon :: ElabInfo -> SyntaxInfo -> (Name, PTerm, FC) -> Idris (Name, Type)+elabCon info syn (n, t_in, fc)+    = do checkUndefined fc n+         ctxt <- getContext+         i <- get+         t_in <- implicit syn n t_in+         let t = addImpl i t_in+         logLvl 2 $ show fc ++ ":Constructor " ++ show n ++ " : " ++ showImp True t+         ((t', defer, is), log) <- tclift $ elaborate ctxt n (Set (UVal 0)) []+                                            (erun fc (build i info False n t))+         logLvl 2 $ "Rechecking " ++ show t'+         def' <- checkDef fc defer+         addDeferred def'+         mapM_ (elabCaseBlock info) is+         ctxt <- getContext+         (cty, _)  <- recheckC ctxt fc [] t'+         logLvl 2 $ "---> " ++ show n ++ " : " ++ show cty+         addIBC (IBCDef n)+         forceArgs n cty+         return (n, cty)++elabClauses :: ElabInfo -> FC -> FnOpts -> Name -> [PClause] -> Idris ()+elabClauses info fc opts n_in cs = let n = liftname info n_in in  +      do pats_in <- mapM (elabClause info fc (TCGen `elem` opts)) cs+         solveDeferred n+         let pats = mapMaybe id pats_in+         logLvl 3 (showSep "\n" (map (\ (l,r) -> +                                        show l ++ " = " ++ +                                        show r) pats))+         ist <- get+         let tcase = opt_typecase (idris_options ist)+         let pdef = map debind (map (simpl (tt_ctxt ist)) pats)+         cov <- coverage+         pcover <-+                 if cov  +                    then idrisCatch +                            (do missing <- genClauses fc n (map fst pdef) cs+                                mapM_ (elabClause info fc True) missing+                                return True)+                            (\c -> do -- iputStrLn $ "Warning: " ++ show c+                                      return False)+                    else return False+         pdef' <- applyOpts pdef +         let tree = simpleCase tcase pcover pdef+         let tree' = simpleCase tcase pcover pdef'+         tclift $ sameLength pdef+         logLvl 3 (show tree)+         logLvl 3 $ "Optimised: " ++ show tree'+         ctxt <- getContext+         ist <- get+         put (ist { idris_patdefs = addDef n pdef' (idris_patdefs ist) })+         case lookupTy (namespace info) n ctxt of+             [ty] -> do updateContext (addCasedef n (inlinable opts)+                                                     tcase pcover pdef pdef' ty)+                        addIBC (IBCDef n)+             [] -> return ()+  where+    debind (x, y) = (depat x, depat y)+    depat (Bind n (PVar t) sc) = depat (instantiate (P Bound n t) sc)+    depat x = x++    simpl ctxt (x, y) = (x, simplify ctxt [] y)++    sameLength ((x, _) : xs) +        = do l <- sameLength xs+             let (f, as) = unApply x+             if (null xs || l == length as) then return (length as)+                else tfail (At fc (Msg "Clauses have differing numbers of arguments "))+    sameLength [] = return 0++elabVal :: ElabInfo -> Bool -> PTerm -> Idris (Term, Type)+elabVal info aspat tm_in+   = do ctxt <- getContext+        i <- get+        let tm = addImpl i tm_in+        logLvl 10 (showImp True tm)+        ((tm', defer, is), _) <- tclift $ elaborate ctxt (MN 0 "val") infP []+                                          (build i info aspat (MN 0 "val") (infTerm tm))+        logLvl 3 ("Value: " ++ show tm')+        let vtm = getInferTerm tm'+        logLvl 2 (show vtm)+        recheckC ctxt (FC "prompt" 0) [] vtm++elabClause :: ElabInfo -> FC -> Bool -> PClause -> Idris (Maybe (Term, Term))+elabClause info fc tcgen (PClause fname lhs_in [] PImpossible [])+   = do ctxt <- getContext+        i <- get+        let lhs = addImpl i lhs_in+        -- if the LHS type checks, it is possible, so report an error+        case elaborate ctxt (MN 0 "patLHS") infP []+                            (erun fc (buildTC i info True tcgen fname (infTerm lhs))) of+            OK ((lhs', _, _), _) ->+               do let lhs_tm = orderPats (getInferTerm lhs')+                  checkInferred fc (delab' i lhs_tm True) lhs+                  fail $ show fc ++ ":" ++ showImp True (delab' i lhs_tm True) ++ " is a possible case"+                                ++ "\n" ++ showImp True lhs+            Error _ -> return ()+        return Nothing+elabClause info fc tcgen (PClause fname lhs_in withs rhs_in whereblock) +   = do ctxt <- getContext+        -- Build the LHS as an "Infer", and pull out its type and+        -- pattern bindings+        i <- get+        let lhs = addImpl i lhs_in+        logLvl 5 ("LHS: " ++ showImp True lhs)+        ((lhs', dlhs, []), _) <- +            tclift $ elaborate ctxt (MN 0 "patLHS") infP []+                     (erun fc (buildTC i info True tcgen fname (infTerm lhs)))+        let lhs_tm = orderPats (getInferTerm lhs')+        let lhs_ty = getInferType lhs'+        logLvl 3 (show lhs_tm)+        (clhs, clhsty) <- recheckC ctxt fc [] lhs_tm+        logLvl 5 ("Checked " ++ show clhs)+        -- Elaborate where block+        ist <- getIState+        windex <- getName+        let winfo = pinfo (pvars ist lhs_tm) whereblock windex+        let decls = concatMap declared whereblock+        let newargs = pvars ist lhs_tm+        let wb = map (expandParamsD ist decorate newargs decls) whereblock+        logLvl 5 $ show wb+        mapM_ (elabDecl' info) wb+        -- Now build the RHS, using the type of the LHS as the goal.+        i <- get -- new implicits from where block+        logLvl 5 (showImp True (expandParams decorate newargs decls rhs_in))+        let rhs = addImpl i (expandParams decorate newargs decls rhs_in)+                        -- TODO: but don't do names in scope+        logLvl 2 (showImp True rhs)+        ctxt <- getContext -- new context with where block added+        ((rhs', defer, is), _) <- +           tclift $ elaborate ctxt (MN 0 "patRHS") clhsty []+                    (do pbinds lhs_tm+                        (_, _, is) <- erun fc (build i info False fname rhs)+                        psolve lhs_tm+                        tt <- get_term+                        let (tm, ds) = runState (collectDeferred tt) []+                        return (tm, ds, is))+        logLvl 2 $ "---> " ++ show rhs'+        when (not (null defer)) $ iLOG $ "DEFERRED " ++ show defer+        def' <- checkDef fc defer+        addDeferred def'+        mapM_ (elabCaseBlock info) is+        ctxt <- getContext+        logLvl 5 $ "Rechecking"+        (crhs, crhsty) <- recheckC ctxt fc [] rhs'+        i <- get+        checkInferred fc (delab' i crhs True) rhs+        return $ Just (clhs, crhs)+  where+    decorate x = UN (show fname ++ "#" ++ show x)+    pinfo ns ps i +          = let ds = concatMap declared ps+                newps = params info ++ ns+                dsParams = map (\n -> (n, map fst newps)) ds+                newb = addAlist dsParams (inblock info) +                l = liftname info in+                info { params = newps,+                       inblock = newb,+                       liftname = id -- (\n -> case lookupCtxt n newb of+                                     --      Nothing -> n+                                     --      _ -> MN i (show n)) . l+                    }++elabClause info fc tcgen (PWith fname lhs_in withs wval_in withblock) +   = do ctxt <- getContext+        -- Build the LHS as an "Infer", and pull out its type and+        -- pattern bindings+        i <- get+        let lhs = addImpl i lhs_in+        logLvl 5 ("LHS: " ++ showImp True lhs)+        ((lhs', dlhs, []), _) <- tclift $ elaborate ctxt (MN 0 "patLHS") infP []+                                      (erun fc (buildTC i info True tcgen fname (infTerm lhs)))+        let lhs_tm = orderPats (getInferTerm lhs')+        let lhs_ty = getInferType lhs'+        let ret_ty = getRetTy lhs_ty+        logLvl 3 (show lhs_tm)+        (clhs, clhsty) <- recheckC ctxt fc [] lhs_tm+        logLvl 5 ("Checked " ++ show clhs)+        let bargs = getPBtys lhs_tm+        let wval = addImpl i wval_in+        logLvl 5 ("Checking " ++ showImp True wval)+        -- Elaborate wval in this context+        ((wval', defer, is), _) <- +            tclift $ elaborate ctxt (MN 0 "withRHS") +                        (bindTyArgs PVTy bargs infP) []+                        (do pbinds lhs_tm+                            -- TODO: may want where here - see winfo abpve+                            (_', d, is) <- erun fc (build i info False fname (infTerm wval))+                            psolve lhs_tm+                            tt <- get_term+                            return (tt, d, is))+        def' <- checkDef fc defer+        addDeferred def'+        mapM_ (elabCaseBlock info) is+        (cwval, cwvalty) <- recheckC ctxt fc [] (getInferTerm wval')+        logLvl 3 ("With type " ++ show cwvalty ++ "\nRet type " ++ show ret_ty)+        windex <- getName+        -- build a type declaration for the new function:+        -- (ps : Xs) -> (withval : cwvalty) -> ret_ty +        let wtype = bindTyArgs Pi (bargs ++ [(MN 0 "warg", getRetTy cwvalty)]) ret_ty+        logLvl 3 ("New function type " ++ show wtype)+        let wname = MN windex (show fname)+        let imps = getImps wtype -- add to implicits context+        put (i { idris_implicits = addDef wname imps (idris_implicits i) })+        addIBC (IBCDef wname)+        def' <- checkDef fc [(wname, wtype)]+        addDeferred def'++        -- in the subdecls, lhs becomes:+        --         fname  pats | wpat [rest]+        --    ==>  fname' ps   wpat [rest], match pats against toplevel for ps+        wb <- mapM (mkAuxC wname lhs (map fst bargs)) withblock+        logLvl 5 ("with block " ++ show wb)+        mapM_ (elabDecl info) wb++        -- rhs becomes: fname' ps wval+        let rhs = PApp fc (PRef fc wname) (map (pexp . (PRef fc) . fst) bargs ++ +                                                [pexp wval])+        logLvl 3 ("New RHS " ++ show rhs)+        ctxt <- getContext -- New context with block added+        i <- get+        ((rhs', defer, is), _) <-+           tclift $ elaborate ctxt (MN 0 "wpatRHS") clhsty []+                    (do pbinds lhs_tm+                        (_, d, is) <- erun fc (build i info False fname rhs)+                        psolve lhs_tm+                        tt <- get_term+                        return (tt, d, is))+        def' <- checkDef fc defer+        addDeferred def'+        mapM_ (elabCaseBlock info) is+        (crhs, crhsty) <- recheckC ctxt fc [] rhs'+        return $ Just (clhs, crhs)+  where+    getImps (Bind n (Pi _) t) = pexp Placeholder : getImps t+    getImps _ = []++    mkAuxC wname lhs ns (PClauses fc o n cs)+        | True  = do cs' <- mapM (mkAux wname lhs ns) cs+                     return $ PClauses fc o wname cs'+        | otherwise = fail $ show fc ++ "with clause uses wrong function name " ++ show n+    mkAuxC wname lhs ns d = return $ d++    mkAux wname toplhs ns (PClause n tm_in (w:ws) rhs wheres)+        = do i <- get+             let tm = addImpl i tm_in+             logLvl 2 ("Matching " ++ showImp True tm ++ " against " ++ +                                      showImp True toplhs)+             case matchClause toplhs tm of+                Left _ -> fail $ show fc ++ "with clause does not match top level"+                Right mvars -> do logLvl 3 ("Match vars : " ++ show mvars)+                                  lhs <- updateLHS n wname mvars ns (fullApp tm) w+                                  return $ PClause wname lhs ws rhs wheres+    mkAux wname toplhs ns (PWith n tm_in (w:ws) wval withs)+        = do i <- get+             let tm = addImpl i tm_in+             logLvl 2 ("Matching " ++ showImp True tm ++ " against " ++ +                                      showImp True toplhs)+             withs' <- mapM (mkAuxC wname toplhs ns) withs+             case matchClause toplhs tm of+                Left _ -> fail $ show fc ++ "with clause does not match top level"+                Right mvars -> do lhs <- updateLHS n wname mvars ns (fullApp tm) w+                                  return $ PWith wname lhs ws wval withs'+        +    updateLHS n wname mvars ns (PApp fc (PRef fc' n') args) w+        = return $ substMatches mvars $ +                PApp fc (PRef fc' wname) (map (pexp . (PRef fc')) ns ++ [pexp w])+    updateLHS n wname mvars ns tm w = fail $ "Not implemented match " ++ show tm ++    fullApp (PApp _ (PApp fc f args) xs) = fullApp (PApp fc f (args ++ xs))+    fullApp x = x++data MArgTy = IA | EA | CA deriving Show++elabClass :: ElabInfo -> SyntaxInfo -> +             FC -> [PTerm] -> +             Name -> [(Name, PTerm)] -> [PDecl] -> Idris ()+elabClass info syn fc constraints tn ps ds +    = do let cn = UN ("instance" ++ show tn) -- MN 0 ("instance" ++ show tn)+         let tty = pibind ps PSet+         let constraint = PApp fc (PRef fc tn)+                                  (map (pexp . PRef fc) (map fst ps))+         -- build data declaration+         ims <- mapM tdecl (filter tydecl ds)+         defs <- mapM (defdecl (map (\ (x,y,z) -> z) ims) constraint) +                      (filter clause ds)+         let (methods, imethods) = unzip (map (\ (x,y,z) -> (x, y)) ims)+         let cty = impbind ps $ conbind constraints $ pibind methods constraint+         let cons = [(cn, cty, fc)]+         let ddecl = PData syn fc (PDatadecl tn tty cons)+         elabDecl info ddecl+         -- for each constraint, build a top level function to chase it+         let usyn = syn { using = ps ++ using syn }+         fns <- mapM (cfun cn constraint usyn (map fst imethods)) constraints+         mapM_ (elabDecl info) (concat fns)+         -- for each method, build a top level function+         fns <- mapM (tfun cn constraint usyn (map fst imethods)) imethods+         mapM_ (elabDecl info) (concat fns)+         -- add the default definitions+         mapM_ (elabDecl info) (concat (map (snd.snd) defs))+         i <- get+         let defaults = map (\ (x, (y, z)) -> (x,y)) defs+         put (i { idris_classes = addDef tn (CI cn imethods defaults (map fst ps)) +                                            (idris_classes i) })+         addIBC (IBCClass tn)+  where+    pibind [] x = x+    pibind ((n, ty): ns) x = PPi expl n ty (pibind ns x) +    impbind [] x = x+    impbind ((n, ty): ns) x = PPi impl n ty (impbind ns x) +    conbind (ty : ns) x = PPi constraint (MN 0 "c") ty (conbind ns x)+    conbind [] x = x++    tdecl (PTy syn _ n t) = do t' <- implicit syn n t+                               return ( (n, (toExp (map fst ps) Exp t')),+                                        (n, (toExp (map fst ps) Imp t')),+                                        (n, (syn, t) ) )+    tdecl _ = fail "Not allowed in a class declaration"++    -- Create default definitions +    defdecl mtys c d@(PClauses fc opts n cs) =+        case lookup n mtys of+            Just (syn, ty) -> do let ty' = insertConstraint c ty+                                 let ds = map (decorateid defaultdec)+                                              [PTy syn fc n ty', +                                               PClauses fc (TCGen:opts) n cs]+                                 iLOG (show ds)+                                 return (n, (defaultdec n, ds))+            _ -> fail $ show n ++ " is not a method"+    defdecl _ _ _ = fail "Can't happen (defdecl)"++    defaultdec (UN n) = UN ("default#" ++ n)+    defaultdec (NS n ns) = NS (defaultdec n) ns++    tydecl (PTy _ _ _ _) = True+    tydecl _ = False+    clause (PClauses _ _ _ _) = True+    clause _ = False++    cfun cn c syn all con+        = do let cfn = UN ('@':show cn ++ "#" ++ show con)+             let mnames = take (length all) $ map (\x -> MN x "meth") [0..]+             let capp = PApp fc (PRef fc cn) (map (pexp . PRef fc) mnames)+             let lhs = PApp fc (PRef fc cfn) [pconst capp]+             let rhs = PResolveTC (FC "HACK" 0)+             let ty = PPi constraint (MN 0 "pc") c con+             iLOG (showImp True ty)+             iLOG (showImp True lhs ++ " = " ++ showImp True rhs)+             return [PTy syn fc cfn ty,+                     PClauses fc [Inlinable,TCGen] cfn [PClause cfn lhs [] rhs []]]++    tfun cn c syn all (m, ty) +        = do let ty' = insertConstraint c ty+             let mnames = take (length all) $ map (\x -> MN x "meth") [0..]+             let capp = PApp fc (PRef fc cn) (map (pexp . PRef fc) mnames)+             let margs = getMArgs ty+             let anames = map (\x -> MN x "arg") [0..]+             let lhs = PApp fc (PRef fc m) (pconst capp : lhsArgs margs anames)+             let rhs = PApp fc (getMeth mnames all m) (rhsArgs margs anames)+             iLOG (showImp True ty)+             iLOG (show (m, ty', capp, margs))+             iLOG (showImp True lhs ++ " = " ++ showImp True rhs)+             return [PTy syn fc m ty',+                     PClauses fc [Inlinable,TCGen] m [PClause m lhs [] rhs []]]++    getMArgs (PPi (Imp _ _) n ty sc) = IA : getMArgs sc+    getMArgs (PPi (Exp _ _) n ty sc) = EA  : getMArgs sc+    getMArgs (PPi (Constraint _ _) n ty sc) = CA : getMArgs sc+    getMArgs _ = []++    getMeth (m:ms) (a:as) x | x == a = PRef fc m+                            | otherwise = getMeth ms as x++    lhsArgs (EA : xs) (n : ns) = pexp (PRef fc n) : lhsArgs xs ns +    lhsArgs (IA : xs) ns = lhsArgs xs ns +    lhsArgs (CA : xs) ns = lhsArgs xs ns+    lhsArgs [] _ = []++    rhsArgs (EA : xs) (n : ns) = pexp (PRef fc n) : rhsArgs xs ns +    rhsArgs (IA : xs) ns = pexp Placeholder : rhsArgs xs ns +    rhsArgs (CA : xs) ns = pconst (PResolveTC fc) : rhsArgs xs ns+    rhsArgs [] _ = []++    insertConstraint c (PPi p@(Imp _ _) n ty sc)+                          = PPi p n ty (insertConstraint c sc)+    insertConstraint c sc = PPi constraint (MN 0 "c") c sc++    -- make arguments explicit and don't bind class parameters+    toExp ns e (PPi (Imp l s) n ty sc)+        | n `elem` ns = toExp ns e sc+        | otherwise = PPi (e l s) n ty (toExp ns e sc)+    toExp ns e (PPi p n ty sc) = PPi p n ty (toExp ns e sc)+    toExp ns e sc = sc++elabInstance :: ElabInfo -> SyntaxInfo -> +                FC -> [PTerm] -> Name -> +                [PTerm] -> PTerm -> [PDecl] -> Idris ()+elabInstance info syn fc cs n ps t ds+    = do i <- get +         (n, ci) <- case lookupCtxtName (namespace info) n (idris_classes i) of+                       [c] -> return c+                       _ -> fail $ show n ++ " is not a type class"+         let iname = UN ('@':show n ++ "$" ++ show ps)+         elabType info syn fc iname t+         let ips = zip (class_params ci) ps+         let ns = case n of+                    NS n ns' -> ns'+                    _ -> []+         let mtys = map (\ (n, t) -> let t' = substMatches ips t in+                                         (decorate ns n, coninsert cs t', t'))+                        (class_methods ci)+         logLvl 3 (show (mtys, ips))+         let ds' = insertDefaults (class_defaults ci) ns ds+         iLOG ("Defaults inserted: " ++ show ds' ++ "\n" ++ show ci)+         mapM_ (warnMissing ds' ns) (map fst (class_methods ci))+         let wb = map mkTyDecl mtys ++ map (decorateid (decorate ns)) ds'+         let lhs = PRef fc iname+         let rhs = PApp fc (PRef fc (instanceName ci))+                           (map (pexp . mkMethApp) mtys)+         let idecl = PClauses fc [Inlinable, TCGen] iname +                                 [PClause iname lhs [] rhs wb]+         iLOG (show idecl)+         elabDecl info idecl+  where+    mkMethApp (n, _, ty) = lamBind 0 ty (papp fc (PRef fc n) (methArgs 0 ty))+    lamBind i (PPi (Constraint _ _) _ _ sc) sc' +                                  = PLam (MN i "meth") Placeholder (lamBind (i+1) sc sc')+    lamBind i (PPi _ n ty sc) sc' = PLam (MN i "meth") Placeholder (lamBind (i+1) sc sc')+    lamBind i _ sc = sc+    methArgs i (PPi (Imp _ _) n ty sc) +        = PImp 0 False n (PRef fc (MN i "meth")) : methArgs (i+1) sc+    methArgs i (PPi (Exp _ _) n ty sc) +        = PExp 0 False (PRef fc (MN i "meth")) : methArgs (i+1) sc+    methArgs i (PPi (Constraint _ _) n ty sc) +        = PConstraint 0 False (PResolveTC fc) : methArgs (i+1) sc+    methArgs i _ = []++    papp fc f [] = f+    papp fc f as = PApp fc f as++    decorate ns (UN n) = NS (UN ('!':n)) ns+    decorate ns (NS (UN n) s) = NS (UN ('!':n)) ns++    mkTyDecl (n, t, _) = PTy syn fc n t++    conbind (ty : ns) x = PPi constraint (MN 0 "c") ty (conbind ns x)+    conbind [] x = x++    coninsert cs (PPi p@(Imp _ _) n t sc) = PPi p n t (coninsert cs sc)+    coninsert cs sc = conbind cs sc++    insertDefaults :: [(Name, Name)] -> [String] -> [PDecl] -> [PDecl]+    insertDefaults [] ns ds = ds+    insertDefaults ((n,dn) : defs) ns ds +       = insertDefaults defs ns (insertDef n dn ns ds)++    insertDef meth def ns decls+        | null $ filter (clauseFor meth ns) decls+            = decls ++ [PClauses fc [Inlinable,TCGen] meth +                        [PClause meth (PApp fc (PRef fc meth) []) [] +                                      (PApp fc (PRef fc def) []) []]]+        | otherwise = decls++    warnMissing decls ns meth+        | null $ filter (clauseFor meth ns) decls+            = iWarn fc $ "method " ++ show meth ++ " not defined"+        | otherwise = return ()++    clauseFor m ns (PClauses _ _ m' _) = decorate ns m == decorate ns m'+    clauseFor m ns _ = False++decorateid decorate (PTy s f n t) = PTy s f (decorate n) t+decorateid decorate (PClauses f o n cs) +   = PClauses f o (decorate n) (map dc cs)+    where dc (PClause n t as w ds) = PClause (decorate n) (dappname t) as w ds+          dc (PWith   n t as w ds) = PWith   (decorate n) (dappname t) as w +                                              (map (decorateid decorate) ds)+          dappname (PApp fc (PRef fc' n) as) = PApp fc (PRef fc' (decorate n)) as+          dappname t = t++pbinds (Bind n (PVar t) sc) = do attack; patbind n +                                 pbinds sc+pbinds tm = return ()++pbty (Bind n (PVar t) sc) tm = Bind n (PVTy t) (pbty sc tm)+pbty _ tm = tm++getPBtys (Bind n (PVar t) sc) = (n, t) : getPBtys sc+getPBtys _ = []++psolve (Bind n (PVar t) sc) = do solve; psolve sc+psolve tm = return ()++pvars ist (Bind n (PVar t) sc) = (n, delab ist t) : pvars ist sc+pvars ist _ = []++-- TODO: Also build a 'binary' version of each declaration for fast reloading++elabDecl :: ElabInfo -> PDecl -> Idris ()+elabDecl info d = idrisCatch (elabDecl' info d) +                             (\e -> do let msg = show e+                                       setErrLine (getErrLine msg)+                                       iputStrLn msg)++elabDecl' info (PFix _ _ _)      = return () -- nothing to elaborate+elabDecl' info (PSyntax _ p) = return () -- nothing to elaborate+elabDecl' info (PTy s f n ty)    = do iLOG $ "Elaborating type decl " ++ show n+                                      elabType info s f n ty+elabDecl' info (PData s f d)     = do iLOG $ "Elaborating " ++ show (d_name d)+                                      elabData info s f d+elabDecl' info d@(PClauses f o n ps) = do iLOG $ "Elaborating clause " ++ show n+                                          elabClauses info f o n ps+elabDecl' info (PParams f ns ps) = mapM_ (elabDecl' pinfo) ps+  where+    pinfo = let ds = concatMap declared ps+                newps = params info ++ ns+                dsParams = map (\n -> (n, map fst newps)) ds+                newb = addAlist dsParams (inblock info) in +                info { params = newps,+                       inblock = newb }+elabDecl' info (PNamespace n ps) = mapM_ (elabDecl' ninfo) ps+  where+    ninfo = case namespace info of+                Nothing -> info { namespace = Just [n] }+                Just ns -> info { namespace = Just (n:ns) } +elabDecl' info (PClass s f cs n ps ds) = do iLOG $ "Elaborating class " ++ show n+                                            elabClass info s f cs n ps ds+elabDecl' info (PInstance s f cs n ps t ds) +    = do iLOG $ "Elaborating instance " ++ show n+         elabInstance info s f cs n ps t ds+elabDecl' info (PDirective i) = i++elabCaseBlock info d@(PClauses f o n ps) +        = do addIBC (IBCDef n)+             elabDecl' info d ++-- elabDecl' info (PImport i) = loadModule i++-- Check that the result of type checking matches what the programmer wrote+-- (i.e. - if we inferred any arguments that the user provided, make sure+-- they are the same!)++checkInferred :: FC -> PTerm -> PTerm -> Idris ()+checkInferred fc inf user =+     do logLvl 6 $ "Checked to\n" ++ showImp True inf ++ "\n" +++                                     showImp True user+        tclift $ case matchClause' True user inf of +            Right vs -> return ()+            Left (x, y) -> tfail $ At fc +                                    (Msg $ "The type-checked term and given term do not match: "+                                           ++ show x ++ " and " ++ show y)+--                           ++ "\n" ++ showImp True inf ++ "\n" ++ showImp True user)+
+ src/Idris/ElabTerm.hs view
@@ -0,0 +1,451 @@+module Idris.ElabTerm where++import Idris.AbsSyntax++import Core.Elaborate hiding (Tactic(..))+import Core.TT+import Core.Evaluate++import Control.Monad+import Control.Monad.State+import Data.List+import Debug.Trace++-- Data to pass to recursively called elaborators; e.g. for where blocks,+-- paramaterised declarations, etc.++data ElabInfo = EInfo { params :: [(Name, PTerm)],+                        inblock :: Ctxt [Name], -- names in the block, and their params+                        liftname :: Name -> Name,+                        namespace :: Maybe [String] }++toplevel = EInfo [] emptyContext id Nothing++type ElabD a = Elab' [PDecl] a++-- Using the elaborator, convert a term in raw syntax to a fully+-- elaborated, typechecked term.+--+-- If building a pattern match, we convert undeclared variables from+-- holes to pattern bindings.++-- Also find deferred names in the term and their types++build :: IState -> ElabInfo -> Bool -> Name -> PTerm -> +         ElabD (Term, [(Name, Type)], [PDecl])+build ist info pattern fn tm +    = do elab ist info pattern False fn tm+         is <- getAux+         tt <- get_term+         let (tm, ds) = runState (collectDeferred tt) []+         return (tm, ds, is)++-- Build a term autogenerated as a typeclass method definition+-- (Separate, so we don't go overboard resolving things that we don't+-- know about yet on the LHS of a pattern def)++buildTC :: IState -> ElabInfo -> Bool -> Bool -> Name -> PTerm -> +         ElabD (Term, [(Name, Type)], [PDecl])+buildTC ist info pattern tcgen fn tm +    = do elab ist info pattern tcgen fn tm+         is <- getAux+         tt <- get_term+         let (tm, ds) = runState (collectDeferred tt) []+         return (tm, ds, is)++-- Returns the set of declarations we need to add to complete the definition+-- (most likely case blocks to elaborate)++elab :: IState -> ElabInfo -> Bool -> Bool -> Name -> PTerm -> +        ElabD ()+elab ist info pattern tcgen fn tm +    = do elabE False tm+         when pattern -- convert remaining holes to pattern vars+              mkPat+         inj <- get_inj+         mapM_ checkInjective inj+  where+    isph arg = case getTm arg of+        Placeholder -> (True, priority arg)+        _ -> (False, priority arg)++    toElab ina arg = case getTm arg of+        Placeholder -> Nothing+        v -> Just (priority arg, elabE ina v)++    toElab' ina arg = case getTm arg of+        Placeholder -> Nothing+        v -> Just (elabE ina v)++    mkPat = do hs <- get_holes+               case hs of+                  (h: hs) -> do patvar h; mkPat+                  [] -> return ()++    elabE ina t = {- do g <- goal+                 tm <- get_term+                 trace ("Elaborating " ++ show t ++ " : " ++ show g ++ "\n\tin " ++ show tm) +                    $ -} elab' ina t++    local f = do e <- get_env+                 return (f `elem` map fst e)++    elab' ina PSet           = do apply RSet []; solve+    elab' ina (PConstant c)  = do apply (RConstant c) []; solve+    elab' ina (PQuote r)     = do fill r; solve+    elab' ina (PTrue fc)     = try (elab' ina (PRef fc unitCon))+                                   (elab' ina (PRef fc unitTy))+    elab' ina (PFalse fc)    = elab' ina (PRef fc falseTy)+    elab' ina (PResolveTC (FC "HACK" _)) -- for chasing parent classes+       = resolveTC 2 fn ist+    elab' ina (PResolveTC fc) = do c <- unique_hole (MN 0 "c")+                                   instanceArg c+    elab' ina (PRefl fc)     = elab' ina (PApp fc (PRef fc eqCon) [pimp (MN 0 "a") Placeholder,+                                                           pimp (MN 0 "x") Placeholder])+    elab' ina (PEq fc l r)   = elab' ina (PApp fc (PRef fc eqTy) [pimp (MN 0 "a") Placeholder,+                                                          pimp (MN 0 "b") Placeholder,+                                                          pexp l, pexp r])+    elab' ina (PPair fc l r) = try (elabE True (PApp fc (PRef fc pairTy)+                                            [pexp l,pexp r]))+                                   (elabE True (PApp fc (PRef fc pairCon)+                                            [pimp (MN 0 "A") Placeholder,+                                             pimp (MN 0 "B") Placeholder,+                                             pexp l, pexp r]))+    elab' ina (PDPair fc l@(PRef _ n) t r)+            = case t of +                Placeholder -> try asType asValue+                _ -> asType+         where asType = elab' ina (PApp fc (PRef fc sigmaTy)+                                        [pexp t,+                                         pexp (PLam n Placeholder r)])+               asValue = elab' ina (PApp fc (PRef fc existsCon)+                                         [pimp (MN 0 "a") t,+                                          pimp (MN 0 "P") Placeholder,+                                          pexp l, pexp r])+    elab' ina (PDPair fc l t r) = elab' ina (PApp fc (PRef fc existsCon)+                                            [pimp (MN 0 "a") t,+                                             pimp (MN 0 "P") Placeholder,+                                             pexp l, pexp r])+    elab' ina (PAlternative as) +        = let as' = pruneAlt as in+              try (tryAll (zip (map (elab' ina) as') (map showHd as')))+                  (tryAll (zip (map (elab' ina) as) (map showHd as)))+        where showHd (PApp _ h _) = show h+              showHd x = show x+    elab' ina (PRef fc n) | pattern && not (inparamBlock n)+                         = do ctxt <- get_context+                              let iscon = isConName Nothing n ctxt+                              if (not iscon && ina) then erun fc $ patvar n+                                else try (do apply (Var n) []; solve)+                                         (patvar n)+      where inparamBlock n = case lookupCtxtName Nothing n (inblock info) of+                                [] -> False+                                _ -> True+    elab' ina (PRef fc n) = erun fc $ do apply (Var n) []; solve+    elab' ina (PLam n Placeholder sc)+          = do attack; intro (Just n); elabE True sc; solve+    elab' ina (PLam n ty sc)+          = do tyn <- unique_hole (MN 0 "lamty")+               claim tyn RSet+               attack+               introTy (Var tyn) (Just n)+               -- end_unify+               focus tyn+               elabE True ty+               elabE True sc+               solve+    elab' ina (PPi _ n Placeholder sc)+          = do attack; arg n (MN 0 "ty"); elabE True sc; solve+    elab' ina (PPi _ n ty sc) +          = do attack; tyn <- unique_hole (MN 0 "ty")+               claim tyn RSet+               n' <- case n of +                        MN _ _ -> unique_hole n+                        _ -> return n+               forall n' (Var tyn)+               focus tyn+               elabE True ty+               elabE True sc+               solve+    elab' ina (PLet n ty val sc)+          = do attack;+               tyn <- unique_hole (MN 0 "letty")+               claim tyn RSet+               valn <- unique_hole (MN 0 "letval")+               claim valn (Var tyn)+               letbind n (Var tyn) (Var valn)+               case ty of+                   Placeholder -> return ()+                   _ -> do focus tyn+                           elabE True ty+               focus valn+               elabE True val+               elabE True sc+               solve+    elab' ina (PApp fc (PRef _ f) args')+       = do let args = {- case lookupCtxt f (inblock info) of+                          Just ps -> (map (pexp . (PRef fc)) ps ++ args')+                          _ ->-} args'+            ivs <- get_instances+            -- HACK: we shouldn't resolve type classes if we're defining an instance+            -- function or default defition.+            let isinf = f == inferCon || tcname f+            try (do ns <- apply (Var f) (map isph args)+                    solve+                    let (ns', eargs) +                         = unzip $+                             sortBy (\(_,x) (_,y) -> compare (priority x) (priority y))+                                    (zip ns args)+                    try (elabArgs (ina || not isinf)+                             [] False ns' (map (\x -> (lazyarg x, getTm x)) eargs))+                        (elabArgs (ina || not isinf)+                             [] False (reverse ns') +                                      (map (\x -> (lazyarg x, getTm x)) (reverse eargs))))+--                 (try (do apply2 (Var f) (map (toElab' (ina || not isinf)) args)) +                     (do apply_elab f (map (toElab (ina || not isinf)) args)+                         solve)+            ivs' <- get_instances+            when (not pattern || (ina && not tcgen)) $+                mapM_ (\n -> do focus n+                                resolveTC 7 fn ist) (ivs' \\ ivs) +--             ivs <- get_instances+--             when (not (null ivs)) $+--               do t <- get_term+--                  trace (show ivs ++ "\n" ++ show t) $ +--                    mapM_ (\n -> do focus n+--                                    resolveTC ist) ivs+      where tcArg (n, PConstraint _ _ Placeholder) = True+            tcArg _ = False++    elab' a (PApp fc f [arg])+          = erun fc $ +             do simple_app (elabE a f) (elabE True (getTm arg))+                solve+    elab' ina Placeholder = do (h : hs) <- get_holes+                               movelast h+    elab' ina (PMetavar n) = let n' = mkN n in+                                 do attack; defer n'; solve+        where mkN n@(NS _ _) = n+              mkN n = case namespace info of+                        Just xs@(_:_) -> NS n xs+                        _ -> n+    elab' ina (PProof ts) = do mapM_ (runTac True ist) ts+    elab' ina (PTactics ts) = do mapM_ (runTac False ist) ts+    elab' ina (PElabError e) = fail e+    elab' ina c@(PCase fc scr opts)+        = do attack+             tyn <- unique_hole (MN 0 "scty")+             claim tyn RSet+             valn <- unique_hole (MN 0 "scval")+             scvn <- unique_hole (MN 0 "scvar")+             claim valn (Var tyn)+             letbind scvn (Var tyn) (Var valn)+             focus valn+             elabE True scr+             args <- get_env+             cname <- unique_hole (mkCaseName fn)+             elab' ina (PMetavar cname)+             let newdef = PClauses fc [] cname (caseBlock fc cname (reverse args) opts)+             -- fail $ "Not implemented " ++ show c ++ "\n" ++ show args+             -- elaborate case+             updateAux (newdef : )+             solve+        where mkCaseName (NS n ns) = NS (mkCaseName n) ns+              mkCaseName (UN x) = UN (x ++ "_case")+              mkCaseName (MN i x) = MN i (x ++ "_case")+    elab' ina x = fail $ "Something's gone wrong. Did you miss a semi-colon somewhere?"++    caseBlock :: FC -> Name -> [(Name, Binder Term)] -> [(PTerm, PTerm)] -> [PClause]+    caseBlock fc n env opts +        = let args = map mkarg (map fst (init env)) in+              map (mkClause args) opts+       where -- mkarg (MN _ _) = Placeholder+             mkarg n = PRef fc n+             mkClause args (l, r) +                = PClause n (PApp fc (PRef fc n)+                                     (map pexp args ++ [pexp l])) [] r []++    elabArgs ina failed retry [] _+        | retry = let (ns, ts) = unzip (reverse failed) in+                      elabArgs ina [] False ns ts+        | otherwise = return ()+    elabArgs ina failed r (n:ns) ((_, Placeholder) : args) +        = elabArgs ina failed r ns args+    elabArgs ina failed r (n:ns) ((lazy, t) : args)+        | lazy && not pattern +          = do elabArg n (PApp bi (PRef bi (UN "lazy"))+                               [pimp (UN "a") Placeholder,+                                pexp t]); +        | otherwise = elabArg n t+      where elabArg n t +                = do hs <- get_holes+                     tm <- get_term+                     failed' <- -- trace (show (n, t, hs, tm)) $ +                                case n `elem` hs of+                                   True ->+                                      if r+                                         then try (do focus n; elabE ina t; return failed)+                                                  (return ((n,(lazy, t)):failed))+                                         else do focus n; elabE ina t; return failed+                                   False -> return failed+                     elabArgs ina failed r ns args++pruneAlt :: [PTerm] -> [PTerm]+pruneAlt xs = map prune xs+  where+    prune (PApp fc1 (PRef fc2 f) as) +        = PApp fc1 (PRef fc2 f) (fmap (fmap (choose f)) as)+    prune t = t++    choose f (PAlternative as) = PAlternative (filter (headIs f) as)+    choose f t = t++    headIs f (PApp _ (PRef _ f') _) = f == f'+    headIs f _ = True -- keep if it's not an application++trivial :: IState -> ElabD ()+trivial ist = try (do elab ist toplevel False False (MN 0 "tac") (PRefl (FC "prf" 0))+                      return ())+                  (do env <- get_env+                      tryAll (map fst env)+                      return ())+      where+        tryAll []     = fail "No trivial solution"+        tryAll (x:xs) = try (elab ist toplevel False False+                                    (MN 0 "tac") (PRef (FC "prf" 0) x))+                            (tryAll xs)++resolveTC :: Int -> Name -> IState -> ElabD ()+resolveTC 0 fn ist = fail $ "Can't resolve type class"+resolveTC depth fn ist +         = try (trivial ist)+               (do t <- goal+                   let (tc, ttypes) = unApply t+                   needsDefault t tc ttypes+                   tm <- get_term+--                    traceWhen (depth > 6) ("GOAL: " ++ show t ++ "\nTERM: " ++ show tm) $+--                        (tryAll (map elabTC (map fst (ctxtAlist (tt_ctxt ist)))))+                   blunderbuss t (map fst (ctxtAlist (tt_ctxt ist))))+  where+    elabTC n | n /= fn && tcname n = (resolve n depth, show n)+             | otherwise = (fail "Can't resolve", show n)++    needsDefault t num@(P _ (NS (UN "Num") ["builtins"]) _) [P Bound a _]+        = do focus a+             fill (RConstant IType) -- default Int+             solve+--     needsDefault t f as+--         | all boundVar as = fail $ "Can't resolve " ++ show t+    needsDefault t f a = return ()++    boundVar (P Bound _ _) = True+    boundVar _ = False++    blunderbuss t [] = fail $ "Can't resolve type class " ++ show t+    blunderbuss t (n:ns) | n /= fn && tcname n = try (resolve n depth)+                                                     (blunderbuss t ns)+                         | otherwise = blunderbuss t ns++    resolve n depth+       | depth == 0 = fail $ "Can't resolve type class"+       | otherwise +              = do t <- goal+                   -- if there's a hole in the goal, don't even try+                   let imps = case lookupCtxtName Nothing n (idris_implicits ist) of+                                [] -> []+                                [args] -> map isImp (snd args) -- won't be overloaded!+                   args <- apply (Var n) imps+                   tm <- get_term+                   mapM_ (\ (_,n) -> do focus n+                                        resolveTC (depth - 1) fn ist) +                         (filter (\ (x, y) -> not x) (zip (map fst imps) args))+                   -- if there's any arguments left, we've failed to resolve+                   solve+       where isImp (PImp p _ _ _) = (True, p)+             isImp arg = (False, priority arg)++collectDeferred :: Term -> State [(Name, Type)] Term+collectDeferred (Bind n (GHole t) app) =+    do ds <- get+       put ((n, t) : ds)+       return app+collectDeferred (Bind n b t) = do b' <- cdb b+                                  t' <- collectDeferred t+                                  return (Bind n b' t')+  where+    cdb (Let t v)   = liftM2 Let (collectDeferred t) (collectDeferred v)+    cdb (Guess t v) = liftM2 Guess (collectDeferred t) (collectDeferred v)+    cdb b           = do ty' <- collectDeferred (binderTy b)+                         return (b { binderTy = ty' })+collectDeferred (App f a) = liftM2 App (collectDeferred f) (collectDeferred a)+collectDeferred t = return t++-- Running tactics directly++runTac :: Bool -> IState -> PTactic -> ElabD ()+runTac autoSolve ist tac = runT (fmap (addImpl ist) tac) where+    runT (Intro []) = do g <- goal+                         attack; intro (bname g)+      where+        bname (Bind n _ _) = Just n+        bname _ = Nothing+    runT (Intro xs) = mapM_ (\x -> do attack; intro (Just x)) xs+    runT Intros = do g <- goal+                     attack; intro (bname g)+                     try (runT Intros)+                         (return ())+      where+        bname (Bind n _ _) = Just n+        bname _ = Nothing+    runT (Exact tm) = do elab ist toplevel False False (MN 0 "tac") tm+                         when autoSolve solveAll+    runT (Refine fn [])   +        = do (fn', imps) <- case lookupCtxtName Nothing fn (idris_implicits ist) of+                                    [] -> do a <- envArgs fn+                                             return (fn, a)+                                    -- FIXME: resolve ambiguities+                                    [(n, args)] -> return $ (n, map isImp args)+             ns <- apply (Var fn') (map (\x -> (x,0)) imps)+             when autoSolve solveAll+       where isImp (PImp _ _ _ _) = True+             isImp _ = False+             envArgs n = do e <- get_env+                            case lookup n e of+                               Just t -> return $ map (const False)+                                                      (getArgTys (binderTy t))+                               _ -> return []+    runT (Refine fn imps) = do ns <- apply (Var fn) (map (\x -> (x,0)) imps)+                               when autoSolve solveAll+    runT (Rewrite tm) -- to elaborate tm, let bind it, then rewrite by that+              = do attack; -- (h:_) <- get_holes+                   tyn <- unique_hole (MN 0 "rty")+                   -- start_unify h+                   claim tyn RSet+                   valn <- unique_hole (MN 0 "rval")+                   claim valn (Var tyn)+                   letn <- unique_hole (MN 0 "rewrite_rule")+                   letbind letn (Var tyn) (Var valn)  +                   focus valn+                   elab ist toplevel False False (MN 0 "tac") tm+                   rewrite (Var letn)+                   when autoSolve solveAll+    runT (LetTac n tm)+              = do attack+                   tyn <- unique_hole (MN 0 "letty")+                   claim tyn RSet+                   valn <- unique_hole (MN 0 "letval")+                   claim valn (Var tyn)+                   letn <- unique_hole n+                   letbind letn (Var tyn) (Var valn)+                   focus valn+                   elab ist toplevel False False (MN 0 "tac") tm+                   when autoSolve solveAll+    runT Compute = compute+    runT Trivial = do trivial ist; when autoSolve solveAll+    runT (Focus n) = focus n+    runT Solve = solve+    runT (Try l r) = do try (runT l) (runT r)+    runT (TSeq l r) = do runT l; runT r+    runT x = fail $ "Not implemented " ++ show x++solveAll = try (do solve; solveAll) (return ())
+ src/Idris/Error.hs view
@@ -0,0 +1,61 @@+{-# LANGUAGE DeriveDataTypeable #-}++module Idris.Error where++import Prelude hiding (catch)+import Idris.AbsSyntax+import Idris.Delaborate++import Core.TT+import Core.Typecheck+import Core.Constraints++import System.Console.Haskeline+import Control.Monad.State+import System.IO.Error(isUserError, ioeGetErrorString)+import Data.Char+import Data.Typeable++iucheck :: Idris ()+iucheck = do tit <- typeInType+             when (not tit) $+                do ist <- get+                   idrisCatch (tclift $ ucheck (idris_constraints ist))+                              (\e -> do let msg = show e+                                        setErrLine (getErrLine msg)+                                        iputStrLn msg)++report :: IOError -> String+report e+    | isUserError e = ioeGetErrorString e +    | otherwise     = show e++idrisCatch :: Idris a -> (SomeException -> Idris a) -> Idris a+idrisCatch = catch++data IdrisErr = IErr String+    deriving Typeable++instance Show IdrisErr where+    show (IErr s) = s++instance Exception IdrisErr++ifail :: String -> Idris ()+ifail str = throwIO (IErr str)++tclift :: TC a -> Idris a+tclift tc = case tc of+               OK v -> return v+               Error err -> do i <- get+                               case err of+                                  At (FC f l) e -> setErrLine l+                                  _ -> return ()+                               throwIO (IErr $ pshow i err)++getErrLine str +  = case span (/=':') str of+      (_, ':':rest) -> case span isDigit rest of+        (num, _) -> read num+      _ -> 0+
+ src/Idris/IBC.hs view
@@ -0,0 +1,1046 @@+{-# LANGUAGE TypeSynonymInstances #-}++module Idris.IBC where++import Core.Evaluate+import Core.TT+import Core.CaseTree+import Idris.Compiler+import Idris.AbsSyntax+import Idris.Imports+import Idris.Error++import Data.Binary+import Data.List+import Data.ByteString.Lazy as B hiding (length, elem)+-- import Data.DeriveTH+import Control.Monad+import Control.Monad.State hiding (get, put)+import System.FilePath+import System.Directory++import Paths_idris++ibcVersion :: Word8+ibcVersion = 8++data IBCFile = IBCFile { ver :: Word8,+                         sourcefile :: FilePath,+                         ibc_imports :: [FilePath],+                         ibc_implicits :: [(Name, [PArg])],+                         ibc_fixes :: [FixDecl],+                         ibc_statics :: [(Name, [Bool])],+                         ibc_classes :: [(Name, ClassInfo)],+                         ibc_datatypes :: [(Name, TypeInfo)],+                         ibc_optimise :: [(Name, OptInfo)],+                         ibc_syntax :: [Syntax],+                         ibc_keywords :: [String],+                         ibc_objs :: [FilePath],+                         ibc_libs :: [String],+                         ibc_hdrs :: [String],+                         ibc_access :: [(Name, Accessibility)],+                         ibc_defs :: [(Name, Def)] }+{-! +deriving instance Binary IBCFile +!-}++initIBC :: IBCFile+initIBC = IBCFile ibcVersion "" [] [] [] [] [] [] [] [] [] [] [] [] [] []++loadIBC :: FilePath -> Idris ()+loadIBC fp = do iLOG $ "Loading ibc " ++ fp+                ibcf <- liftIO $ (decodeFile fp :: IO IBCFile)+                process ibcf fp++writeIBC :: FilePath -> FilePath -> Idris ()+writeIBC src f +    = do iLOG $ "Writing ibc " ++ show f+         i <- getIState+         case idris_metavars i \\ primDefs of+                (_:_) -> fail "Can't write ibc when there are unsolved metavariables"+                [] -> return ()+         ibcf <- mkIBC (ibc_write i) (initIBC { sourcefile = src }) +         idrisCatch (do liftIO $ encodeFile f ibcf+                        iLOG "Written")+            (\c -> do iLOG $ "Failed " ++ show c)+         return ()++mkIBC :: [IBCWrite] -> IBCFile -> Idris IBCFile+mkIBC [] f = return f+mkIBC (i:is) f = do ist <- getIState+                    logLvl 5 $ show i ++ " " ++ show (Data.List.length is)+                    f' <- ibc ist i f+                    mkIBC is f'++ibc i (IBCFix d) f = return f { ibc_fixes = d : ibc_fixes f } +ibc i (IBCImp n) f = case lookupCtxt Nothing n (idris_implicits i) of+                        [v] -> return f { ibc_implicits = (n,v): ibc_implicits f     }+                        _ -> fail "IBC write failed"+ibc i (IBCStatic n) f +                   = case lookupCtxt Nothing n (idris_statics i) of+                        [v] -> return f { ibc_statics = (n,v): ibc_statics f     }+                        _ -> fail "IBC write failed"+ibc i (IBCClass n) f +                   = case lookupCtxt Nothing n (idris_classes i) of+                        [v] -> return f { ibc_classes = (n,v): ibc_classes f     }+                        _ -> fail "IBC write failed"+ibc i (IBCData n) f +                   = case lookupCtxt Nothing n (idris_datatypes i) of+                        [v] -> return f { ibc_datatypes = (n,v): ibc_datatypes f     }+                        _ -> fail "IBC write failed"+ibc i (IBCOpt n) f = case lookupCtxt Nothing n (idris_optimisation i) of+                        [v] -> return f { ibc_optimise = (n,v): ibc_optimise f     }+                        _ -> fail "IBC write failed"+ibc i (IBCSyntax n) f = return f { ibc_syntax = n : ibc_syntax f }+ibc i (IBCKeyword n) f = return f { ibc_keywords = n : ibc_keywords f }+ibc i (IBCImport n) f = return f { ibc_imports = n : ibc_imports f }+ibc i (IBCObj n) f = return f { ibc_objs = n : ibc_objs f }+ibc i (IBCLib n) f = return f { ibc_libs = n : ibc_libs f }+ibc i (IBCHeader n) f = return f { ibc_hdrs = n : ibc_hdrs f }+ibc i (IBCDef n) f = case lookupDef Nothing n (tt_ctxt i) of+                        [v] -> return f { ibc_defs = (n,v) : ibc_defs f     }+                        _ -> fail "IBC write failed"+ibc i (IBCAccess n a) f = return f { ibc_access = (n,a) : ibc_access f }++process :: IBCFile -> FilePath -> Idris ()+process i fn+   | ver i /= ibcVersion = do iLOG "ibc out of date"+                              fail "Incorrect ibc version"+   | otherwise =  +            do srcok <- liftIO $ doesFileExist (sourcefile i)+               when srcok $ liftIO $ timestampOlder (sourcefile i) fn+               v <- verbose+               when (v && srcok) $ iputStrLn $ "Skipping " ++ sourcefile i+               pImports (ibc_imports i)+               pImps (ibc_implicits i)+               pFixes (ibc_fixes i)+               pStatics (ibc_statics i)+               pClasses (ibc_classes i)+               pDatatypes (ibc_datatypes i)+               pOptimise (ibc_optimise i)+               pSyntax (ibc_syntax i)+               pKeywords (ibc_keywords i)+               pObjs (ibc_objs i)+               pLibs (ibc_libs i)+               pHdrs (ibc_hdrs i)+               pDefs (ibc_defs i)+               pAccess (ibc_access i)++timestampOlder :: FilePath -> FilePath -> IO ()+timestampOlder src ibc = do srct <- getModificationTime src+                            ibct <- getModificationTime ibc+                            if (srct > ibct)+                               then fail "Needs reloading"+                               else return ()++pImports :: [FilePath] -> Idris ()+pImports fs +  = do datadir <- liftIO $ getDataDir+       mapM_ (\f -> do fp <- liftIO $ findImport [".", datadir] f+                       i <- getIState+                       if (f `elem` imported i)+                        then iLOG $ "Already read " ++ f+                        else do putIState (i { imported = f : imported i })+                                case fp of +                                    LIDR fn -> do iLOG $ "Failed at " ++ fn+                                                  fail "Must be an ibc"+                                    IDR fn -> do iLOG $ "Failed at " ++ fn+                                                 fail "Must be an ibc"+                                    IBC fn src -> loadIBC fn) +             fs++pImps :: [(Name, [PArg])] -> Idris ()+pImps imps = mapM_ (\ (n, imp) -> +                        do i <- getIState+                           putIState (i { idris_implicits +                                            = addDef n imp (idris_implicits i) }))+                   imps++pFixes :: [FixDecl] -> Idris ()+pFixes f = do i <- getIState+              putIState (i { idris_infixes = f ++ idris_infixes i })++pStatics :: [(Name, [Bool])] -> Idris ()+pStatics ss = mapM_ (\ (n, s) ->+                        do i <- getIState+                           putIState (i { idris_statics+                                           = addDef n s (idris_statics i) }))+                    ss++pClasses :: [(Name, ClassInfo)] -> Idris ()+pClasses cs = mapM_ (\ (n, c) ->+                        do i <- getIState+                           putIState (i { idris_classes+                                           = addDef n c (idris_classes i) }))+                    cs++pDatatypes :: [(Name, TypeInfo)] -> Idris ()+pDatatypes cs = mapM_ (\ (n, c) ->+                        do i <- getIState+                           putIState (i { idris_datatypes+                                           = addDef n c (idris_datatypes i) }))+                    cs++pOptimise :: [(Name, OptInfo)] -> Idris ()+pOptimise cs = mapM_ (\ (n, c) ->+                        do i <- getIState+                           putIState (i { idris_optimisation+                                           = addDef n c (idris_optimisation i) }))+                    cs++pSyntax :: [Syntax] -> Idris ()+pSyntax s = do i <- getIState+               putIState (i { syntax_rules = s ++ syntax_rules i })++pKeywords :: [String] -> Idris ()+pKeywords k = do i <- getIState+                 putIState (i { syntax_keywords = k ++ syntax_keywords i })++pObjs :: [FilePath] -> Idris ()+pObjs os = mapM_ addObjectFile os++pLibs :: [String] -> Idris ()+pLibs ls = mapM_ addLib ls++pHdrs :: [String] -> Idris ()+pHdrs hs = mapM_ addHdr hs++pDefs :: [(Name, Def)] -> Idris ()+pDefs ds = mapM_ (\ (n, d) -> +                     do i <- getIState+                        logLvl 5 $ "Added " ++ show (n, d)+                        putIState (i { tt_ctxt = addCtxtDef n d (tt_ctxt i) }))+                 ds       ++pAccess :: [(Name, Accessibility)] -> Idris ()+pAccess ds = mapM_ (\ (n, a) ->+                      do i <- getIState+                         putIState (i { tt_ctxt = setAccess n a (tt_ctxt i) }))+                   ds++----- Generated by 'derive'++ +instance Binary FC where+        put (FC x1 x2)+          = do put x1+               put x2+        get+          = do x1 <- get+               x2 <- get+               return (FC x1 x2)++ +instance Binary Name where+        put x+          = case x of+                UN x1 -> do putWord8 0+                            put x1+                NS x1 x2 -> do putWord8 1+                               put x1+                               put x2+                MN x1 x2 -> do putWord8 2+                               put x1+                               put x2+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           return (UN x1)+                   1 -> do x1 <- get+                           x2 <- get+                           return (NS x1 x2)+                   2 -> do x1 <- get+                           x2 <- get+                           return (MN x1 x2)+                   _ -> error "Corrupted binary data for Name"++ +instance Binary Const where+        put x+          = case x of+                I x1 -> do putWord8 0+                           put x1+                BI x1 -> do putWord8 1+                            put x1+                Fl x1 -> do putWord8 2+                            put x1+                Ch x1 -> do putWord8 3+                            put x1+                Str x1 -> do putWord8 4+                             put x1+                IType -> putWord8 5+                BIType -> putWord8 6+                FlType -> putWord8 7+                ChType -> putWord8 8+                StrType -> putWord8 9+                PtrType -> putWord8 10+                Forgot -> putWord8 11+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           return (I x1)+                   1 -> do x1 <- get+                           return (BI x1)+                   2 -> do x1 <- get+                           return (Fl x1)+                   3 -> do x1 <- get+                           return (Ch x1)+                   4 -> do x1 <- get+                           return (Str x1)+                   5 -> return IType+                   6 -> return BIType+                   7 -> return FlType+                   8 -> return ChType+                   9 -> return StrType+                   10 -> return PtrType+                   11 -> return Forgot+                   _ -> error "Corrupted binary data for Const"++ +instance Binary Raw where+        put x+          = case x of+                Var x1 -> do putWord8 0+                             put x1+                RBind x1 x2 x3 -> do putWord8 1+                                     put x1+                                     put x2+                                     put x3+                RApp x1 x2 -> do putWord8 2+                                 put x1+                                 put x2+                RSet -> putWord8 3+                RConstant x1 -> do putWord8 4+                                   put x1+                RForce x1 -> do putWord8 5+                                put x1+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           return (Var x1)+                   1 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (RBind x1 x2 x3)+                   2 -> do x1 <- get+                           x2 <- get+                           return (RApp x1 x2)+                   3 -> return RSet+                   4 -> do x1 <- get+                           return (RConstant x1)+                   5 -> do x1 <- get+                           return (RForce x1)+                   _ -> error "Corrupted binary data for Raw"++ +instance (Binary b) => Binary (Binder b) where+        put x+          = case x of+                Lam x1 -> do putWord8 0+                             put x1+                Pi x1 -> do putWord8 1+                            put x1+                Let x1 x2 -> do putWord8 2+                                put x1+                                put x2+                NLet x1 x2 -> do putWord8 3+                                 put x1+                                 put x2+                Hole x1 -> do putWord8 4+                              put x1+                GHole x1 -> do putWord8 5+                               put x1+                Guess x1 x2 -> do putWord8 6+                                  put x1+                                  put x2+                PVar x1 -> do putWord8 7+                              put x1+                PVTy x1 -> do putWord8 8+                              put x1+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           return (Lam x1)+                   1 -> do x1 <- get+                           return (Pi x1)+                   2 -> do x1 <- get+                           x2 <- get+                           return (Let x1 x2)+                   3 -> do x1 <- get+                           x2 <- get+                           return (NLet x1 x2)+                   4 -> do x1 <- get+                           return (Hole x1)+                   5 -> do x1 <- get+                           return (GHole x1)+                   6 -> do x1 <- get+                           x2 <- get+                           return (Guess x1 x2)+                   7 -> do x1 <- get+                           return (PVar x1)+                   8 -> do x1 <- get+                           return (PVTy x1)+                   _ -> error "Corrupted binary data for Binder"++ +instance Binary NameType where+        put x+          = case x of+                Bound -> putWord8 0+                Ref -> putWord8 1+                DCon x1 x2 -> do putWord8 2+                                 put x1+                                 put x2+                TCon x1 x2 -> do putWord8 3+                                 put x1+                                 put x2+        get+          = do i <- getWord8+               case i of+                   0 -> return Bound+                   1 -> return Ref+                   2 -> do x1 <- get+                           x2 <- get+                           return (DCon x1 x2)+                   3 -> do x1 <- get+                           x2 <- get+                           return (TCon x1 x2)+                   _ -> error "Corrupted binary data for NameType"++ +instance (Binary n) => Binary (TT n) where+        put x+          = case x of+                P x1 x2 x3 -> do putWord8 0+                                 put x1+                                 put x2+                                 put x3+                V x1 -> do putWord8 1+                           put x1+                Bind x1 x2 x3 -> do putWord8 2+                                    put x1+                                    put x2+                                    put x3+                App x1 x2 -> do putWord8 3+                                put x1+                                put x2+                Constant x1 -> do putWord8 4+                                  put x1+                Set x1 -> do putWord8 5+                             put x1+                Erased -> do putWord8 6+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (P x1 x2 x3)+                   1 -> do x1 <- get+                           return (V x1)+                   2 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (Bind x1 x2 x3)+                   3 -> do x1 <- get+                           x2 <- get+                           return (App x1 x2)+                   4 -> do x1 <- get+                           return (Constant x1)+                   5 -> do x1 <- get+                           return (Set x1)+                   6 -> return Erased+                   _ -> error "Corrupted binary data for TT"++ +instance Binary SC where+        put x+          = case x of+                Case x1 x2 -> do putWord8 0+                                 put x1+                                 put x2+                STerm x1 -> do putWord8 1+                               put x1+                UnmatchedCase x1 -> do putWord8 2+                                       put x1+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           x2 <- get+                           return (Case x1 x2)+                   1 -> do x1 <- get+                           return (STerm x1)+                   2 -> do x1 <- get+                           return (UnmatchedCase x1)+                   _ -> error "Corrupted binary data for SC"++ +instance Binary CaseAlt where+        put x+          = case x of+                ConCase x1 x2 x3 x4 -> do putWord8 0+                                          put x1+                                          put x2+                                          put x3+                                          put x4+                ConstCase x1 x2 -> do putWord8 1+                                      put x1+                                      put x2+                DefaultCase x1 -> do putWord8 2+                                     put x1+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           x4 <- get+                           return (ConCase x1 x2 x3 x4)+                   1 -> do x1 <- get+                           x2 <- get+                           return (ConstCase x1 x2)+                   2 -> do x1 <- get+                           return (DefaultCase x1)+                   _ -> error "Corrupted binary data for CaseAlt"++ +instance Binary Def where+        put x+          = case x of+                Function x1 x2 -> do putWord8 0+                                     put x1+                                     put x2+                TyDecl x1 x2 -> do putWord8 1+                                   put x1+                                   put x2+                Operator x1 x2 x3 -> do putWord8 2+                                        put x1+                                        put x2+                                        put x3+                CaseOp x1 x2 x3 x4 x5 x6 x7 -> do putWord8 3+                                                  put x1+                                                  put x2+                                                  put x3+                                                  put x4+                                                  put x5+                                                  put x6+                                                  put x7+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           x2 <- get+                           return (Function x1 x2)+                   1 -> do x1 <- get+                           x2 <- get+                           return (TyDecl x1 x2)+                   2 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (Operator x1 x2 x3)+                   3 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           x4 <- get+                           x5 <- get+                           x6 <- get+                           x7 <- get+                           return (CaseOp x1 x2 x3 x4 x5 x6 x7)+                   _ -> error "Corrupted binary data for Def"++instance Binary Accessibility where+        put x+          = case x of+                Public -> putWord8 0+                Frozen -> putWord8 1+                Hidden -> putWord8 2+        get+          = do i <- getWord8+               case i of+                   0 -> return Public+                   1 -> return Frozen+                   2 -> return Hidden+                   _ -> error "Corrupted binary data for Accessibility"++instance Binary IBCFile where+        put (IBCFile x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16)+          = do put x1+               put x2+               put x3+               put x4+               put x5+               put x6+               put x7+               put x8+               put x9+               put x10+               put x11+               put x12+               put x13+               put x14+               put x15+               put x16+        get+          = do x1 <- get+               if x1 == ibcVersion then +                 do x2 <- get+                    x3 <- get+                    x4 <- get+                    x5 <- get+                    x6 <- get+                    x7 <- get+                    x8 <- get+                    x9 <- get+                    x10 <- get+                    x11 <- get+                    x12 <- get+                    x13 <- get+                    x14 <- get+                    x15 <- get+                    x16 <- get+                    return (IBCFile x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16)+                  else return (initIBC { ver = x1 })+ +instance Binary Fixity where+        put x+          = case x of+                Infixl x1 -> do putWord8 0+                                put x1+                Infixr x1 -> do putWord8 1+                                put x1+                InfixN x1 -> do putWord8 2+                                put x1+                PrefixN x1 -> do putWord8 3+                                 put x1+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           return (Infixl x1)+                   1 -> do x1 <- get+                           return (Infixr x1)+                   2 -> do x1 <- get+                           return (InfixN x1)+                   3 -> do x1 <- get+                           return (PrefixN x1)+                   _ -> error "Corrupted binary data for Fixity"++ +instance Binary FixDecl where+        put (Fix x1 x2)+          = do put x1+               put x2+        get+          = do x1 <- get+               x2 <- get+               return (Fix x1 x2)++ +instance Binary Static where+        put x+          = case x of+                Static -> putWord8 0+                Dynamic -> putWord8 1+        get+          = do i <- getWord8+               case i of+                   0 -> return Static+                   1 -> return Dynamic+                   _ -> error "Corrupted binary data for Static"++ +instance Binary Plicity where+        put x+          = case x of+                Imp x1 x2 -> do putWord8 0+                                put x1+                                put x2+                Exp x1 x2 -> do putWord8 1+                                put x1+                                put x2+                Constraint x1 x2 -> do putWord8 2+                                       put x1+                                       put x2+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           x2 <- get+                           return (Imp x1 x2)+                   1 -> do x1 <- get+                           x2 <- get+                           return (Exp x1 x2)+                   2 -> do x1 <- get+                           x2 <- get+                           return (Constraint x1 x2)+                   _ -> error "Corrupted binary data for Plicity"++ +instance Binary PTerm where+        put x+          = case x of+                PQuote x1 -> do putWord8 0+                                put x1+                PRef x1 x2 -> do putWord8 1+                                 put x1+                                 put x2+                PLam x1 x2 x3 -> do putWord8 2+                                    put x1+                                    put x2+                                    put x3+                PPi x1 x2 x3 x4 -> do putWord8 3+                                      put x1+                                      put x2+                                      put x3+                                      put x4+                PLet x1 x2 x3 x4 -> do putWord8 4+                                       put x1+                                       put x2+                                       put x3+                                       put x4+                PApp x1 x2 x3 -> do putWord8 5+                                    put x1+                                    put x2+                                    put x3+                PTrue x1 -> do putWord8 6+                               put x1+                PFalse x1 -> do putWord8 7+                                put x1+                PRefl x1 -> do putWord8 8+                               put x1+                PResolveTC x1 -> do putWord8 9+                                    put x1+                PEq x1 x2 x3 -> do putWord8 10+                                   put x1+                                   put x2+                                   put x3+                PPair x1 x2 x3 -> do putWord8 11+                                     put x1+                                     put x2+                                     put x3+                PDPair x1 x2 x3 x4 -> do putWord8 12+                                         put x1+                                         put x2+                                         put x3+                                         put x4+                PAlternative x1 -> do putWord8 13+                                      put x1+                PHidden x1 -> do putWord8 14+                                 put x1+                PSet -> putWord8 15+                PConstant x1 -> do putWord8 16+                                   put x1+                Placeholder -> putWord8 17+                PDoBlock x1 -> do putWord8 18+                                  put x1+                PReturn x1 -> do putWord8 19+                                 put x1+                PMetavar x1 -> do putWord8 20+                                  put x1+                PProof x1 -> do putWord8 21+                                put x1+                PTactics x1 -> do putWord8 22+                                  put x1+                PElabError x1 -> do putWord8 23+                                    put x1+                PImpossible -> putWord8 24+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           return (PQuote x1)+                   1 -> do x1 <- get+                           x2 <- get+                           return (PRef x1 x2)+                   2 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (PLam x1 x2 x3)+                   3 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           x4 <- get+                           return (PPi x1 x2 x3 x4)+                   4 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           x4 <- get+                           return (PLet x1 x2 x3 x4)+                   5 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (PApp x1 x2 x3)+                   6 -> do x1 <- get+                           return (PTrue x1)+                   7 -> do x1 <- get+                           return (PFalse x1)+                   8 -> do x1 <- get+                           return (PRefl x1)+                   9 -> do x1 <- get+                           return (PResolveTC x1)+                   10 -> do x1 <- get+                            x2 <- get+                            x3 <- get+                            return (PEq x1 x2 x3)+                   11 -> do x1 <- get+                            x2 <- get+                            x3 <- get+                            return (PPair x1 x2 x3)+                   12 -> do x1 <- get+                            x2 <- get+                            x3 <- get+                            x4 <- get+                            return (PDPair x1 x2 x3 x4)+                   13 -> do x1 <- get+                            return (PAlternative x1)+                   14 -> do x1 <- get+                            return (PHidden x1)+                   15 -> return PSet+                   16 -> do x1 <- get+                            return (PConstant x1)+                   17 -> return Placeholder+                   18 -> do x1 <- get+                            return (PDoBlock x1)+                   19 -> do x1 <- get+                            return (PReturn x1)+                   20 -> do x1 <- get+                            return (PMetavar x1)+                   21 -> do x1 <- get+                            return (PProof x1)+                   22 -> do x1 <- get+                            return (PTactics x1)+                   23 -> do x1 <- get+                            return (PElabError x1)+                   24 -> return PImpossible+                   _ -> error "Corrupted binary data for PTerm"++ +instance (Binary t) => Binary (PTactic' t) where+        put x+          = case x of+                Intro x1 -> do putWord8 0+                               put x1+                Focus x1 -> do putWord8 1+                               put x1+                Refine x1 x2 -> do putWord8 2+                                   put x1+                                   put x2+                Rewrite x1 -> do putWord8 3+                                 put x1+                LetTac x1 x2 -> do putWord8 4+                                   put x1+                                   put x2+                Exact x1 -> do putWord8 5+                               put x1+                Compute -> putWord8 6+                Trivial -> putWord8 7+                Solve -> putWord8 8+                Attack -> putWord8 9+                ProofState -> putWord8 10+                ProofTerm -> putWord8 11+                Undo -> putWord8 12+                Try x1 x2 -> do putWord8 13+                                put x1+                                put x2+                TSeq x1 x2 -> do putWord8 14+                                 put x1+                                 put x2+                Qed -> putWord8 15+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           return (Intro x1)+                   1 -> do x1 <- get+                           return (Focus x1)+                   2 -> do x1 <- get+                           x2 <- get+                           return (Refine x1 x2)+                   3 -> do x1 <- get+                           return (Rewrite x1)+                   4 -> do x1 <- get+                           x2 <- get+                           return (LetTac x1 x2)+                   5 -> do x1 <- get+                           return (Exact x1)+                   6 -> return Compute+                   7 -> return Trivial+                   8 -> return Solve+                   9 -> return Attack+                   10 -> return ProofState+                   11 -> return ProofTerm+                   12 -> return Undo+                   13 -> do x1 <- get+                            x2 <- get+                            return (Try x1 x2)+                   14 -> do x1 <- get+                            x2 <- get+                            return (TSeq x1 x2)+                   15 -> return Qed+                   _ -> error "Corrupted binary data for PTactic'"+++instance (Binary t) => Binary (PDo' t) where+        put x+          = case x of+                DoExp x1 x2 -> do putWord8 0+                                  put x1+                                  put x2+                DoBind x1 x2 x3 -> do putWord8 1+                                      put x1+                                      put x2+                                      put x3+                DoBindP x1 x2 x3 -> do putWord8 2+                                       put x1+                                       put x2+                                       put x3+                DoLet x1 x2 x3 x4 -> do putWord8 3+                                        put x1+                                        put x2+                                        put x3+                                        put x4+                DoLetP x1 x2 x3 -> do putWord8 4+                                      put x1+                                      put x2+                                      put x3+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           x2 <- get+                           return (DoExp x1 x2)+                   1 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (DoBind x1 x2 x3)+                   2 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (DoBindP x1 x2 x3)+                   3 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           x4 <- get+                           return (DoLet x1 x2 x3 x4)+                   4 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (DoLetP x1 x2 x3)+                   _ -> error "Corrupted binary data for PDo'"+++instance (Binary t) => Binary (PArg' t) where+        put x+          = case x of+                PImp x1 x2 x3 x4 -> do putWord8 0+                                       put x1+                                       put x2+                                       put x3+                                       put x4+                PExp x1 x2 x3 -> do putWord8 1+                                    put x1+                                    put x2+                                    put x3+                PConstraint x1 x2 x3 -> do putWord8 2+                                           put x1+                                           put x2+                                           put x3+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           x4 <- get+                           return (PImp x1 x2 x3 x4)+                   1 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (PExp x1 x2 x3)+                   2 -> do x1 <- get+                           x2 <- get+                           x3 <- get+                           return (PConstraint x1 x2 x3)+                   _ -> error "Corrupted binary data for PArg'"++ +instance Binary ClassInfo where+        put (CI x1 x2 x3 x4)+          = do put x1+               put x2+               put x3+               put x4+        get+          = do x1 <- get+               x2 <- get+               x3 <- get+               x4 <- get+               return (CI x1 x2 x3 x4)++instance Binary OptInfo where+        put (Optimise x1 x2 x3)+          = do put x1+               put x2+               put x3+        get+          = do x1 <- get+               x2 <- get+               x3 <- get+               return (Optimise x1 x2 x3)++instance Binary TypeInfo where+        put (TI x1) = put x1+        get = do x1 <- get+                 return (TI x1)++instance Binary SynContext where+        put x+          = case x of+                PatternSyntax -> putWord8 0+                TermSyntax -> putWord8 1+                AnySyntax -> putWord8 2+        get+          = do i <- getWord8+               case i of+                   0 -> return PatternSyntax+                   1 -> return TermSyntax+                   2 -> return AnySyntax+                   _ -> error "Corrupted binary data for SynContext"++ +instance Binary Syntax where+        put (Rule x1 x2 x3)+          = do put x1+               put x2+               put x3+        get+          = do x1 <- get+               x2 <- get+               x3 <- get+               return (Rule x1 x2 x3)++ +instance Binary SSymbol where+        put x+          = case x of+                Keyword x1 -> do putWord8 0+                                 put x1+                Symbol x1 -> do putWord8 1+                                put x1+                Expr x1 -> do putWord8 2+                              put x1+        get+          = do i <- getWord8+               case i of+                   0 -> do x1 <- get+                           return (Keyword x1)+                   1 -> do x1 <- get+                           return (Symbol x1)+                   2 -> do x1 <- get+                           return (Expr x1)+                   _ -> error "Corrupted binary data for SSymbol"
+ src/Idris/Imports.hs view
@@ -0,0 +1,59 @@+module Idris.Imports where++import Idris.AbsSyntax++import Core.TT+import Paths_idris++import System.FilePath+import System.Directory+import Control.Monad.State++data IFileType = IDR FilePath | LIDR FilePath | IBC FilePath IFileType +    deriving Eq++srcPath :: FilePath -> FilePath+srcPath fp = let (n, ext) = splitExtension fp in+                 case ext of+                    ".idr" -> fp+                    _ -> fp ++ ".idr"++lsrcPath :: FilePath -> FilePath+lsrcPath fp = let (n, ext) = splitExtension fp in+                  case ext of+                     ".lidr" -> fp+                     _ -> fp ++ ".lidr"++-- Get name of byte compiled version of an import+ibcPath :: FilePath -> FilePath+ibcPath fp = let (n, ext) = splitExtension fp in+                 n ++ ".ibc"++findImport :: [FilePath] -> FilePath -> IO IFileType+findImport []     fp = fail $ "Can't find import " ++ fp+findImport (d:ds) fp = do let ibcp = ibcPath (d ++ "/" ++ fp)+                          let idrp = srcPath (d ++ "/" ++ fp)+                          let lidrp = lsrcPath (d ++ "/" ++ fp)+                          ibc  <- doesFileExist ibcp+                          idr  <- doesFileExist idrp+                          lidr <- doesFileExist lidrp+--                           when idr $ putStrLn $ idrp ++ " ok"+--                           when lidr $ putStrLn $ lidrp ++ " ok"+--                           when ibc $ putStrLn $ ibcp ++ " ok"+                          let isrc = if lidr then LIDR lidrp+                                             else IDR idrp+                          if ibc +                             then return (IBC ibcp isrc)+                             else if (idr || lidr) +                                     then return isrc+                                     else findImport ds fp++-- find a specific filename somewhere in a path++findInPath :: [FilePath] -> FilePath -> IO FilePath+findInPath [] fp = fail $ "Can't find file " ++ fp+findInPath (d:ds) fp = do let p = d ++ "/" ++ fp+                          e <- doesFileExist p+                          if e then return p else findInPath ds p++
+ src/Idris/Parser.hs view
@@ -0,0 +1,1219 @@+module Idris.Parser where++import Idris.AbsSyntax+import Idris.Imports+import Idris.Error+import Idris.ElabDecls+import Idris.ElabTerm+import Idris.IBC+import Idris.Unlit+import Paths_idris++import Core.CoreParser+import Core.TT+import Core.Evaluate++import Text.ParserCombinators.Parsec+import Text.ParserCombinators.Parsec.Error+import Text.ParserCombinators.Parsec.Expr+import Text.ParserCombinators.Parsec.Language+import qualified Text.ParserCombinators.Parsec.Token as PTok++import Data.List+import Control.Monad.State+import Debug.Trace+import Data.Maybe+import System.FilePath++type TokenParser a = PTok.TokenParser a++type IParser = GenParser Char IState++lexer :: TokenParser IState+lexer  = PTok.makeTokenParser idrisDef++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+integer   = PTok.integer lexer+float     = PTok.float lexer+strlit    = PTok.stringLiteral lexer+chlit     = PTok.charLiteral lexer+lchar = lexeme.char++-- Loading modules++loadModule :: FilePath -> Idris String+loadModule f +   = idrisCatch (do datadir <- liftIO $ getDataDir+                    fp <- liftIO $ findImport [".", datadir] f+                    i <- getIState+                    if (f `elem` imported i)+                       then iLOG $ "Already read " ++ f+                       else do putIState (i { imported = f : imported i })+                               case fp of+                                   IDR fn  -> loadSource False fn+                                   LIDR fn -> loadSource True  fn+                                   IBC fn src -> +                                     idrisCatch (loadIBC fn)+                                                (\c -> do iLOG $ fn ++ " failed " ++ show c+                                                          case src of+                                                            IDR sfn -> loadSource False sfn+                                                            LIDR sfn -> loadSource True sfn)+                    let (dir, fh) = splitFileName f+                    return (dropExtension fh))+                (\e -> do let msg = show e+                          setErrLine (getErrLine msg)+                          iputStrLn msg+                          return "")++loadSource :: Bool -> FilePath -> Idris () +loadSource lidr f +             = do iLOG ("Reading " ++ f)+                  file_in <- liftIO $ readFile f+                  file <- if lidr then tclift $ unlit f file_in else return file_in+                  (mname, modules, rest, pos) <- parseImports f file+                  i <- getIState+                  putIState (i { default_access = Hidden })+                  mapM_ loadModule modules+                  clearIBC -- start a new .ibc file+                  mapM_ (\m -> addIBC (IBCImport m)) modules+                  ds' <- parseProg (defaultSyntax {syn_namespace = reverse mname }) +                                   f rest pos+                  let ds = namespaces mname ds'+                  logLvl 3 (dumpDecls ds)+                  i <- getIState+                  logLvl 10 (show (toAlist (idris_implicits i)))+                  logLvl 3 (show (idris_infixes i))+                  -- Now add all the declarations to the context+                  v <- verbose+                  when v $ iputStrLn $ "Type checking " ++ f+                  mapM_ (elabDecl toplevel) ds+                  iLOG ("Finished " ++ f)+                  let ibc = dropExtension f ++ ".ibc"+                  iucheck+                  i <- getIState+                  addHides (hide_list i)+                  ok <- noErrors+                  when ok $+                    idrisCatch (do writeIBC f ibc; clearIBC)+                               (\c -> return ()) -- failure is harmless+                  putIState (i { hide_list = [] })+                  return ()+  where+    namespaces []     ds = ds+    namespaces (x:xs) ds = [PNamespace x (namespaces xs ds)]++addHides :: [(Name, Maybe Accessibility)] -> Idris ()+addHides xs = do i <- getIState+                 let defh = default_access i+                 let (hs, as) = partition isNothing xs+                 if null as then return ()+                            else mapM_ doHide+                                    (map (\ (n, _) -> (n, defh)) hs +++                                     map (\ (n, Just a) -> (n, a)) as)+  where isNothing (_, Nothing) = True+        isNothing _            = False++        doHide (n, a) = do setAccessibility n a+                           addIBC (IBCAccess n a)++parseExpr i = runParser (pFullExpr defaultSyntax) i "(input)"+parseTac i = runParser (do t <- pTactic defaultSyntax+                           eof+                           return t) i "(proof)"++parseImports :: FilePath -> String -> Idris ([String], [String], String, SourcePos)+parseImports fname input +    = do i <- get+         case (runParser (do mname <- pHeader+                             ps <- many pImport+                             rest <- getInput+                             pos <- getPosition+                             return ((mname, ps, rest, pos), i)) i fname input) of+            Left err -> fail (ishow err)+            Right (x, i) -> do put i+                               return x+  where ishow err = let ln = sourceLine (errorPos err) in+                        fname ++ ":" ++ show ln ++ ":parse error"+--                           show (map messageString (errorMessages err))++pHeader :: IParser [String]+pHeader = try (do reserved "module"; i <- identifier; option ';' (lchar ';')+                  return (parseName i))+      <|> return []+  where parseName x = case span (/='.') x of+                            (x, "") -> [x]+                            (x, '.':y) -> x : parseName y++push_indent :: IParser ()+push_indent = do pos <- getPosition+                 ist <- getState+                 setState (ist { indent_stack = sourceColumn pos :+                                                indent_stack ist })++last_indent :: IParser Int+last_indent = do ist <- getState+                 case indent_stack ist of+                    (x : xs) -> return x+                    _ -> return 1++indent :: IParser Int+indent = do pos <- getPosition+            return (sourceColumn pos)++pop_indent :: IParser ()+pop_indent = do ist <- getState+                let (x : xs) = indent_stack ist+                setState (ist { indent_stack = xs })++open_block :: IParser ()+open_block = do lchar '{'+                ist <- getState+                setState (ist { brace_stack = Nothing : brace_stack ist })+         <|> do ist <- getState+                lvl <- indent+                setState (ist { brace_stack = Just lvl : brace_stack ist })++close_block :: IParser ()+close_block = do ist <- getState+                 bs <- case brace_stack ist of+                         Nothing : xs -> do lchar '}'+                                            return xs+                         Just lvl : xs -> do i <- indent+                                             inp <- getInput+--                                              trace (show (take 10 inp, i, lvl)) $+                                             if (i >= lvl && take 1 inp /= ")") +                                                then fail "Not end of block"+                                                else return xs+                 setState (ist { brace_stack = bs })++pTerminator = do lchar ';'; pop_indent+          <|> do c <- indent; l <- last_indent+                 if (c <= l) then pop_indent+                             else fail "Not a terminator"+          <|> do i <- getInput; if (take 1 i == "}" || take 1 i == ")") then pop_indent +                                                     else fail "Not a terminator"+          <|> lookAhead eof++pBarTerminator +            = do lchar '|'; return ()+          <|> do c <- indent; l <- last_indent+                 if (c <= l) then return ()+                             else fail "Not a terminator"+          <|> lookAhead eof++pKeepTerminator +            = do lchar ';'; return ()+          <|> do c <- indent; l <- last_indent+                 if (c <= l) then return ()+                             else fail "Not a terminator"+          <|> do i <- getInput; let h = take 1 i+                 if (h == "}" || h == ")" || h == "|") then return ()+                                           else fail "Not a terminator"+          <|> lookAhead eof++notEndApp = do c <- indent; l <- last_indent+               i <- getInput+               if (c <= l) then fail "Terminator"+                           else return ()++notEndBlock = do ist <- getState+                 case brace_stack ist of+                    Just lvl : xs -> do i <- indent+                                        inp <- getInput+                                        if (i < lvl || take 1 inp == ")")+                                                     then fail "End of block"+                                                     else return ()+                    _ -> return ()++pfc :: IParser FC+pfc = do s <- getPosition+         let (dir, file) = splitFileName (sourceName s)+         let f = case dir of+                    "./" -> file+                    _ -> sourceName s+         return $ FC f (sourceLine s)++pImport :: IParser String+pImport = do reserved "import"+             f <- identifier+             option ';' (lchar ';')+             return (map dot f)+  where dot '.' = '/'+        dot c = c++parseProg :: SyntaxInfo -> FilePath -> String -> SourcePos -> Idris [PDecl]+parseProg syn fname input pos+    = do i <- get+         case (runParser (do setPosition pos+                             whiteSpace+                             ps <- many (pDecl syn)+                             eof+                             i' <- getState+                             return (concat ps, i')) i fname input) of+            Left err -> fail (ishow err)+            Right (x, i) -> do put i+                               return (collect x)+  where ishow err = let ln = sourceLine (errorPos err) in+                        fname ++ ":" ++ show ln ++ ":parse error"+                              ++ " at column " ++ show (sourceColumn (errorPos err))+--                           show (map messageString (errorMessages err))++-- Collect PClauses with the same function name++collect :: [PDecl] -> [PDecl]+collect (c@(PClauses _ o _ _) : ds) +    = clauses (cname c) [] (c : ds)+  where clauses n acc (PClauses fc _ _ [PClause n' l ws r w] : ds)+           | n == n' = clauses n (PClause n' l ws r (collect w) : acc) ds+        clauses n acc (PClauses fc _ _ [PWith   n' l ws r w] : ds)+           | n == n' = clauses n (PWith n' l ws r (collect w) : acc) ds+        clauses n acc xs = PClauses (getfc c) o n (reverse acc) : collect xs++        cname (PClauses fc _ _ [PClause n _ _ _ _]) = n+        cname (PClauses fc _ _ [PWith   n _ _ _ _]) = n+        getfc (PClauses fc _ _ _) = fc++collect (PParams f ns ps : ds) = PParams f ns (collect ps) : collect ds+collect (PNamespace ns ps : ds) = PNamespace ns (collect ps) : collect ds+collect (PClass f s cs n ps ds : ds') = PClass f s cs n ps (collect ds) : collect ds'+collect (PInstance f s cs n ps t ds : ds') +    = PInstance f s cs n ps t (collect ds) : collect ds'+collect (d : ds) = d : collect ds+collect [] = []++pFullExpr :: SyntaxInfo -> IParser PTerm+pFullExpr syn +          = do x <- pExpr syn; eof;+               i <- getState+               return $ desugar syn i x++pDecl :: SyntaxInfo -> IParser [PDecl]+pDecl syn = do notEndBlock+               pDeclBody where+  pDeclBody+      = do d <- pDecl' syn+           i <- getState+           let d' = fmap (desugar syn i) d+           return [d']+    <|> pUsing syn+    <|> pParams syn+    <|> pNamespace syn+    <|> pClass syn+    <|> pInstance syn+    <|> pDirective+    <|> try (do reserved "import"+                fp <- identifier+                lchar ';'+                fail "imports must be at the top of file") ++pFunDecl :: SyntaxInfo -> IParser [PDecl]+pFunDecl syn+      = try (do notEndBlock+                d <- pFunDecl' syn+                i <- getState+                let d' = fmap (desugar syn i) d+                return [d'])++--------- Top Level Declarations ---------++pDecl' :: SyntaxInfo -> IParser PDecl+pDecl' syn+       = try pFixity+     <|> pFunDecl' syn+     <|> try (pData syn)+     <|> pSyntaxDecl syn++pSyntaxDecl :: SyntaxInfo -> IParser PDecl+pSyntaxDecl syn+    = do s <- pSyntaxRule syn+         i <- getState+         let rs = syntax_rules i+         let ns = syntax_keywords i+         let ibc = ibc_write i+         let ks = map show (names s)+         setState (i { syntax_rules = s : rs,+                       syntax_keywords = ks ++ ns,+                       ibc_write = IBCSyntax s : map IBCKeyword ks ++ ibc+                     })+         fc <- pfc+         return (PSyntax fc s)+  where+    names (Rule syms _ _) = mapMaybe ename syms+    ename (Keyword n) = Just n+    ename _ = Nothing++pSyntaxRule :: SyntaxInfo -> IParser Syntax+pSyntaxRule syn +    = do push_indent+         sty <- option AnySyntax (do reserved "term"; return TermSyntax+                                  <|> do reserved "pattern"; return PatternSyntax)+         reserved "syntax"+         syms <- many1 pSynSym+         when (all expr syms) $ fail "No keywords in syntax rule"+         let ns = mapMaybe name syms+         when (length ns /= length (nub ns)) +            $ fail "Repeated variable in syntax rule"+         lchar '='+         tm <- pExpr syn+         pTerminator+         return (Rule syms tm sty)+  where+    expr (Expr _) = True+    expr _ = False+    name (Expr n) = Just n+    name _ = Nothing++pSynSym :: IParser SSymbol+pSynSym = try (do lchar '['; n <- pName; lchar ']'+                  return (Expr n))+      <|> do n <- iName []+             return (Keyword n)+      <|> do sym <- strlit+             return (Symbol sym)++pFunDecl' :: SyntaxInfo -> IParser PDecl+pFunDecl' syn = try (do push_indent+                        acc <- pAccessibility+                        n_in <- pfName+                        let n = expandNS syn n_in+                        ty <- pTSig syn+                        fc <- pfc+                        pTerminator +--                         ty' <- implicit syn n ty+                        addAcc n acc+                        return (PTy syn fc n ty))+            <|> try (pPattern syn)++pUsing :: SyntaxInfo -> IParser [PDecl]+pUsing syn = +    do reserved "using"; +       lchar '('+       ns <- tyDeclList syn+       lchar ')'+       open_block+       let uvars = using syn+       ds <- many1 (pDecl (syn { using = uvars ++ ns }))+       close_block+       return (concat ds)++pParams :: SyntaxInfo -> IParser [PDecl]+pParams syn = +    do reserved "params"; +       lchar '('+       ns <- tyDeclList syn+       lchar ')'+       lchar '{'+       let pvars = syn_params syn+       ds <- many1 (pDecl syn { syn_params = pvars ++ ns })+       lchar '}'+       fc <- pfc+       return [PParams fc ns (concat ds)]++pNamespace :: SyntaxInfo -> IParser [PDecl]+pNamespace syn =+    do reserved "namespace";+       n <- identifier+       open_block +       ds <- many1 (pDecl syn { syn_namespace = n : syn_namespace syn })+       close_block+       return [PNamespace n (concat ds)] ++expandNS :: SyntaxInfo -> Name -> Name+expandNS syn n@(NS _ _) = n+expandNS syn n = case syn_namespace syn of+                        [] -> n+                        xs -> NS n xs++--------- Fixity ---------++pFixity :: IParser PDecl+pFixity = do push_indent+             f <- fixity; i <- natural; ops <- sepBy1 operator (lchar ',')+             pTerminator +             let prec = fromInteger i+             istate <- getState+             let fs = map (Fix (f prec)) ops+             setState (istate { +                idris_infixes = sort (fs ++ idris_infixes istate),+                ibc_write = map IBCFix fs ++ ibc_write istate })+             fc <- pfc+             return (PFix fc (f prec) ops)++fixity :: IParser (Int -> Fixity) +fixity = try (do reserved "infixl"; return Infixl)+     <|> try (do reserved "infixr"; return Infixr)+     <|> try (do reserved "infix";  return InfixN)+     <|> try (do reserved "prefix"; return PrefixN)++--------- Tyoe classes ---------++pClass :: SyntaxInfo -> IParser [PDecl]+pClass syn = do acc <- pAccessibility+                reserved "class"+                fc <- pfc+                cons <- pConstList syn+                n_in <- pName; let n = expandNS syn n_in+                cs <- many1 carg+                reserved "where"; open_block +                ds <- many1 $ pFunDecl syn+                close_block+                let allDs = concat ds+                accData acc n (concatMap declared allDs)+                return [PClass syn fc cons n cs allDs]+  where+    carg = do lchar '('; i <- pName; lchar ':'; ty <- pExpr syn; lchar ')'+              return (i, ty)+       <|> do i <- pName;+              return (i, PSet)++pInstance :: SyntaxInfo -> IParser [PDecl]+pInstance syn = do reserved "instance"+                   fc <- pfc+                   cs <- pConstList syn+                   cn <- pName+                   args <- many1 (pSimpleExpr syn)+                   let sc = PApp fc (PRef fc cn) (map pexp args)+                   let t = bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc+                   reserved "where"; open_block +                   ds <- many1 $ pFunDecl syn+                   close_block+                   return [PInstance syn fc cs cn args t (concat ds)]++--------- Expressions ---------++pExpr syn = do i <- getState+               buildExpressionParser (table (idris_infixes i)) (pExpr' syn)++pExpr' :: SyntaxInfo -> IParser PTerm+pExpr' syn +       = try (pExtExpr syn)+     <|> pNoExtExpr syn++pExtExpr :: SyntaxInfo -> IParser PTerm+pExtExpr syn = do i <- getState+                  pExtensions syn (syntax_rules i)++pSimpleExtExpr :: SyntaxInfo -> IParser PTerm+pSimpleExtExpr syn = do i <- getState+                        pExtensions syn (filter simple (syntax_rules i))+  where+    simple (Rule (Expr x:xs) _ _) = False+    simple (Rule [Keyword _] _ _) = True+    simple (Rule [Symbol _]  _ _) = True+    simple (Rule (_:xs) _ _) = case (last xs) of+        Keyword _ -> True+        Symbol _  -> True+        _ -> False+    simple _ = False++pNoExtExpr syn =+         try (pApp syn) +     <|> try (pSimpleExpr syn)+     <|> pLambda syn+     <|> pLet syn+     <|> pPi syn +     <|> pDoBlock syn+     <|> pComprehension syn+    +pExtensions :: SyntaxInfo -> [Syntax] -> IParser PTerm+pExtensions syn rules = choice (map (\x -> try (pExt syn x)) (filter valid rules))+  where+    valid (Rule _ _ AnySyntax) = True+    valid (Rule _ _ PatternSyntax) = inPattern syn+    valid (Rule _ _ TermSyntax) = not (inPattern syn)+++pExt :: SyntaxInfo -> Syntax -> IParser PTerm+pExt syn (Rule (s:ssym) ptm _)+    = do s1 <- pSymbol pSimpleExpr s +         smap <- mapM (pSymbol pExpr) ssym+         let ns = mapMaybe id (s1:smap)+         return (update ns ptm) -- updated with smap+  where+    pSymbol p (Keyword n) = do reserved (show n); return Nothing+    pSymbol p (Expr n)    = do tm <- p syn+                               return $ Just (n, tm)+    pSymbol p (Symbol s)  = do symbol s+                               return Nothing+    dropn n [] = []+    dropn n ((x,t) : xs) | n == x = xs+                         | otherwise = (x,t):dropn n xs++    update ns (PRef fc n) = case lookup n ns of+                              Just t -> t+                              _ -> PRef fc n+    update ns (PLam n ty sc) = PLam n (update ns ty) (update (dropn n ns) sc)+    update ns (PPi p n ty sc) = PPi p n (update ns ty) (update (dropn n ns) sc) +    update ns (PLet n ty val sc) = PLet n (update ns ty) (update ns val)+                                          (update (dropn n ns) sc)+    update ns (PApp fc t args) = PApp fc (update ns t) (map (fmap (update ns)) args)+    update ns (PCase fc c opts) = PCase fc (update ns c) (map (pmap (update ns)) opts) +    update ns (PPair fc l r) = PPair fc (update ns l) (update ns r)+    update ns (PDPair fc l t r) = PDPair fc (update ns l) (update ns t) (update ns r)+    update ns (PAlternative as) = PAlternative (map (update ns) as)+    update ns (PHidden t) = PHidden (update ns t)+    update ns (PDoBlock ds) = PDoBlock $ upd ns ds+      where upd ns (DoExp fc t : ds) = DoExp fc (update ns t) : upd ns ds+            upd ns (DoBind fc n t : ds) = DoBind fc n (update ns t) : upd (dropn n ns) ds+            upd ns (DoLet fc n ty t : ds) = DoLet fc n (update ns ty) (update ns t) +                                                : upd (dropn n ns) ds+            upd ns (DoBindP fc i t : ds) = DoBindP fc (update ns i) (update ns t) +                                                : upd ns ds+            upd ns (DoLetP fc i t : ds) = DoLetP fc (update ns i) (update ns t) +                                                : upd ns ds+    update ns t = t++pName = do i <- getState+           iName (syntax_keywords i)+    <|> do reserved "instance"+           i <- getState+           UN n <- iName (syntax_keywords i)+           return (UN ('@':n))+    ++pfName = try pName+     <|> do lchar '('; o <- operator; lchar ')'; return (UN o)++pAccessibility' :: IParser Accessibility+pAccessibility'+        = do reserved "public";   return Public+      <|> do reserved "abstract"; return Frozen+      <|> do reserved "private";  return Hidden++pAccessibility :: IParser (Maybe Accessibility)+pAccessibility+        = do acc <- pAccessibility'; return (Just acc)+      <|> return Nothing++addAcc :: Name -> Maybe Accessibility -> IParser ()+addAcc n a = do i <- getState+                setState (i { hide_list = (n, a) : hide_list i })++pSimpleExpr syn = +        try (do symbol "!["; t <- pTerm; lchar ']' +                return $ PQuote t)+        <|> do lchar '?'; x <- pName; return (PMetavar x)+        <|> do reserved "refl"; fc <- pfc; return (PRefl fc)+--         <|> do reserved "return"; fc <- pfc; return (PReturn fc)+        <|> do reserved "proof"; lchar '{';+               ts <- endBy (pTactic syn) (lchar ';')+               lchar '}'+               return (PProof ts)+        <|> do reserved "tactics"; lchar '{';+               ts <- endBy (pTactic syn) (lchar ';')+               lchar '}'+               return (PTactics ts)+        <|> do reserved "case"; fc <- pfc; scr <- pExpr syn; reserved "of";+               open_block +               push_indent+               opts <- many1 (do notEndBlock+                                 x <- pCaseOpt syn+                                 pKeepTerminator+                                 return x) -- sepBy1 (pCaseOpt syn) (lchar '|')+               pop_indent+               close_block+               return (PCase fc scr opts)+        <|> try (do x <- pfName; fc <- pfc; return (PRef fc x))+        <|> try (pList syn)+        <|> try (pAlt syn)+        <|> try (pIdiom syn)+        <|> try (do lchar '('; bracketed syn)+        <|> try (do c <- pConstant; fc <- pfc+                    return (modifyConst syn fc (PConstant c)))+        <|> do reserved "Set"; return PSet+        <|> try (do symbol "()"; fc <- pfc; return (PTrue fc))+        <|> try (do symbol "_|_"; fc <- pfc; return (PFalse fc))+        <|> do lchar '_'; return Placeholder+        <|> pSimpleExtExpr syn++bracketed syn =+            try (pPair syn)+        <|> try (do e <- pExpr syn; lchar ')'; return e)+        <|> try (do fc <- pfc; o <- operator; e <- pExpr syn; lchar ')'+                    return $ PLam (MN 0 "x") Placeholder+                                  (PApp fc (PRef fc (UN o)) [pexp (PRef fc (MN 0 "x")), +                                                             pexp e]))+        <|> try (do fc <- pfc; e <- pSimpleExpr syn; o <- operator; lchar ')'+                    return $ PLam (MN 0 "x") Placeholder+                                  (PApp fc (PRef fc (UN o)) [pexp e,+                                                             pexp (PRef fc (MN 0 "x"))]))++pCaseOpt :: SyntaxInfo -> IParser (PTerm, PTerm)+pCaseOpt syn = do lhs <- pExpr syn; symbol "=>";+                  rhs <- pExpr syn+                  return (lhs, rhs)++modifyConst :: SyntaxInfo -> FC -> PTerm -> PTerm+modifyConst syn fc (PConstant (I x)) +    | not (inPattern syn)+        = PApp fc (PRef fc (UN "fromInteger")) [pexp (PConstant (I x))]+modifyConst syn fc x = x++pList syn = do lchar '['; fc <- pfc+               xs <- sepBy (pExpr syn) (lchar ','); lchar ']'+               return (mkList fc xs)+  where+    mkList fc [] = PRef fc (UN "Nil")+    mkList fc (x : xs) = PApp fc (PRef fc (UN "::")) [pexp x, pexp (mkList fc xs)] ++pPair syn = try (do l <- pExpr syn +                    fc <- pfc+                    rest <- restTuple +                    case rest of+                        [] -> return l+                        [Left r] -> return (PPair fc l r)+                        [Right r] -> return (PDPair fc l Placeholder r))+        <|> try (do x <- ntuple+                    lchar ')'+                    return x) +        <|> do ln <- pName; lchar ':'; lty <- pExpr syn;+               reservedOp "**";+               fc <- pfc+               r <- pExpr syn; lchar ')';+               return (PDPair fc (PRef fc ln) lty r) +  where+    restTuple = do lchar ')'; return []+            <|> do lchar ','+                   r <- pExpr syn+                   lchar ')'+                   return [Left r]+            <|> do reservedOp "**"+                   r <- pExpr syn+                   lchar ')'+                   return [Right r]+    ntuple = try (do l <- pExpr syn; fc <- pfc; lchar ','+                     rest <- ntuple+                     return (PPair fc l rest))+             <|> (do l <- pExpr syn; fc <- pfc; lchar ','+                     r <- pExpr syn+                     return (PPair fc l r))+       +pAlt syn = do symbol "(|"; +              alts <- sepBy1 (pExpr' syn) (lchar ',')+              symbol "|)"+              return (PAlternative alts)++pHSimpleExpr syn+             = do lchar '.'+                  e <- pSimpleExpr syn+                  return $ PHidden e+           <|> pSimpleExpr syn++pApp syn = do f <- pSimpleExpr syn+              fc <- pfc+              args <- many1 (do notEndApp+                                pArg syn)+              return (PApp fc f args)++pArg :: SyntaxInfo -> IParser PArg+pArg syn = try (pImplicitArg syn)+       <|> try (pConstraintArg syn)+       <|> do e <- pSimpleExpr syn+              return (pexp e)++pImplicitArg syn = do lchar '{'; n <- pName+                      fc <- pfc+                      v <- option (PRef fc n) (do lchar '='; pExpr syn)+                      lchar '}'+                      return (pimp n v)++pConstraintArg syn = do symbol "@{"; e <- pExpr syn; symbol "}"+                        return (pconst e)++pTSig syn = do lchar ':'+               cs <- pConstList syn+               sc <- pExpr syn+               return (bindList (PPi constraint) (map (\x -> (MN 0 "c", x)) cs) sc)++pLambda syn = do lchar '\\'+                 (try (do xt <- tyOptDeclList syn+                          symbol "=>"+                          sc <- pExpr syn+                          return (bindList PLam xt sc))+                  <|> (do ps <- sepBy (do fc <- pfc+                                          e <- pSimpleExpr syn+                                          return (fc, e)) (lchar ',')+                          symbol "=>"+                          sc <- pExpr syn+                          return (pmList (zip [0..] ps) sc)))+    where pmList [] sc = sc+          pmList ((i, (fc, x)) : xs) sc +                = PLam (MN i "lamp") Placeholder+                        (PCase fc (PRef fc (MN i "lamp"))+                                [(x, (pmList xs sc))])++pLet syn = try (do reserved "let"; n <- pName; +                   ty <- option Placeholder (do lchar ':'; pExpr' syn)+                   lchar '='; v <- pExpr syn+                   reserved "in";  sc <- pExpr syn+                   return (PLet n ty v sc))+           <|> (do reserved "let"; fc <- pfc; pat <- pExpr' syn+                   symbol "="; v <- pExpr syn+                   reserved "in"; sc <- pExpr syn+                   return (PCase fc v [(pat, sc)]))++pPi syn = +     try (do lazy <- option False (do lchar '|'; return True)+             st <- pStatic+             lchar '('; xt <- tyDeclList syn; lchar ')'+             symbol "->"+             sc <- pExpr syn+             return (bindList (PPi (Exp lazy st)) xt sc))+ <|> try (do lazy <- option False (do lchar '|'; return True)+             st <- pStatic+             lchar '{'; xt <- tyDeclList syn; lchar '}'+             symbol "->"+             sc <- pExpr syn+             return (bindList (PPi (Imp lazy st)) xt sc))+      <|> do --lazy <- option False (do lchar '|'; return True)+             lchar '{'; reserved "static"; lchar '}'+             t <- pExpr' syn+             symbol "->"+             sc <- pExpr syn+             return (PPi (Exp False Static) (MN 42 "__pi_arg") t sc)++pConstList :: SyntaxInfo -> IParser [PTerm]+pConstList syn = try (do lchar '(' +                         tys <- sepBy1 (pExpr' syn) (lchar ',')+                         lchar ')'+                         reservedOp "=>"+                         return tys)+             <|> try (do t <- pExpr syn+                         reservedOp "=>"+                         return [t])+             <|> return []++tyDeclList syn = try (sepBy1 (do x <- pfName; t <- pTSig syn; return (x,t))+                         (lchar ','))+             <|> do ns <- sepBy1 pName (lchar ',')+                    t <- pTSig syn+                    return (map (\x -> (x, t)) ns)++tyOptDeclList syn = sepBy1 (do x <- pfName; +                               t <- option Placeholder (do lchar ':'+                                                           pExpr syn) +                               return (x,t))+                           (lchar ',')++bindList b []          sc = sc+bindList b ((n, t):bs) sc = b n t (bindList b bs sc)++pComprehension syn+    = do lchar '['; fc <- pfc; pat <- pExpr syn; lchar '|';+         qs <- sepBy1 (pDo syn) (lchar ','); lchar ']';+         return (PDoBlock (map addGuard qs ++ +                    [DoExp fc (PApp fc (PRef fc (UN "return"))+                                 [pexp pat])]))+    where addGuard (DoExp fc e) = DoExp fc (PApp fc (PRef fc (UN "guard"))+                                                    [pexp e])+          addGuard x = x++pDoBlock syn +    = do reserved "do"; open_block+         push_indent+         ds <- many1 (do notEndBlock+                         x <- pDo syn; pKeepTerminator; return x)+         pop_indent+         close_block+         return (PDoBlock ds)++pDo syn+     = try (do reserved "let"; i <- pName; +               ty <- option Placeholder (do lchar ':'; pExpr' syn)+               reservedOp "="; fc <- pfc+               e <- pExpr syn+               return (DoLet fc i ty e))+   <|> try (do reserved "let"; i <- pExpr' syn; reservedOp "="; fc <- pfc+               sc <- pExpr syn+               return (DoLetP fc i sc))+   <|> try (do i <- pName; symbol "<-"; fc <- pfc+               e <- pExpr syn;+               return (DoBind fc i e))+   <|> try (do i <- pExpr' syn; symbol "<-"; fc <- pfc+               e <- pExpr syn;+               return (DoBindP fc i e))+   <|> try (do e <- pExpr syn; fc <- pfc+               return (DoExp fc e))++pIdiom syn+    = do symbol "[|"; fc <- pfc; e <- pExpr syn; symbol "|]"+         return (PIdiom fc e)++pConstant :: IParser Const+pConstant = do reserved "Integer";return BIType+        <|> do reserved "Int";    return IType+        <|> do reserved "Char";   return ChType+        <|> do reserved "Float";  return FlType+        <|> do reserved "String"; return StrType+        <|> do reserved "Ptr";    return PtrType+        <|> try (do f <- float;   return $ Fl f)+        <|> try (do i <- natural; lchar 'L'; return $ BI i)+        <|> try (do i <- natural; return $ I (fromInteger i))+        <|> try (do s <- strlit;  return $ Str s)+        <|> try (do c <- chlit;   return $ Ch c)++pStatic :: IParser Static+pStatic = do lchar '['; reserved "static"; lchar ']';+             return Static+         <|> return Dynamic++table fixes +   = [[prefix "-" (\fc x -> PApp fc (PRef fc (UN "-")) +        [pexp (PApp fc (PRef fc (UN "fromInteger")) [pexp (PConstant (I 0))]), pexp x])]] +       ++ toTable (reverse fixes) +++      [[binary "="  (\fc x y -> PEq fc x y) AssocLeft],+       [binary "->" (\fc x y -> PPi expl (MN 42 "__pi_arg") x y) AssocRight]]++toTable fs = map (map toBin) +                 (groupBy (\ (Fix x _) (Fix y _) -> prec x == prec y) fs)+   where toBin (Fix (PrefixN _) op) = prefix op +                                       (\fc x -> PApp fc (PRef fc (UN op)) [pexp x])+         toBin (Fix f op) +            = binary op (\fc x y -> PApp fc (PRef fc (UN op)) [pexp x,pexp y]) (assoc f)+         assoc (Infixl _) = AssocLeft+         assoc (Infixr _) = AssocRight+         assoc (InfixN _) = AssocNone++binary name f assoc = Infix (do { reservedOp name; fc <- pfc; +                                  return (f fc) }) assoc+prefix name f = Prefix (do { reservedOp name; fc <- pfc;+                             return (f fc) })++--------- Data declarations ---------++-- (works for classes too - 'abstract' means the data/class is visible but members not)+accData :: Maybe Accessibility -> Name -> [Name] -> IParser ()+accData (Just Frozen) n ns = do addAcc n (Just Frozen)+                                mapM_ (\n -> addAcc n (Just Hidden)) ns+accData a n ns = do addAcc n a; mapM_ (\n -> addAcc n a) ns++pData :: SyntaxInfo -> IParser PDecl+pData syn = try (do acc <- pAccessibility+                    reserved "data"; fc <- pfc+                    tyn_in <- pfName; ty <- pTSig syn+                    let tyn = expandNS syn tyn_in+                    reserved "where"+                    open_block+                    push_indent+                    cons <- many (do notEndBlock+                                     c <- pConstructor syn+                                     pKeepTerminator+                                     return c) -- (lchar '|')+                    pop_indent+                    close_block +                    accData acc tyn (map (\ (n, _, _) -> n) cons)+                    return $ PData syn fc (PDatadecl tyn ty cons))+        <|> try (do push_indent+                    acc <- pAccessibility+                    reserved "data"; fc <- pfc+                    tyn_in <- pfName; args <- many pName+                    let tyn = expandNS syn tyn_in+                    lchar '='+                    cons <- sepBy1 (pSimpleCon syn) (lchar '|')+                    pTerminator+                    let conty = mkPApp fc (PRef fc tyn) (map (PRef fc) args)+                    let ty = bindArgs (map (\a -> PSet) args) PSet+                    cons' <- mapM (\ (x, cargs, cfc) -> +                                 do let cty = bindArgs cargs conty+                                    return (x, cty, cfc)) cons+                    accData acc tyn (map (\ (n, _, _) -> n) cons')+                    return $ PData syn fc (PDatadecl tyn ty cons'))+  where+    mkPApp fc t [] = t+    mkPApp fc t xs = PApp fc t (map pexp xs)++bindArgs :: [PTerm] -> PTerm -> PTerm+bindArgs [] t = t+bindArgs (x:xs) t = PPi expl (MN 0 "t") x (bindArgs xs t)++pConstructor :: SyntaxInfo -> IParser (Name, PTerm, FC)+pConstructor syn+    = do cn_in <- pfName; fc <- pfc+         let cn = expandNS syn cn_in+         ty <- pTSig syn+--          ty' <- implicit syn cn ty+         return (cn, ty, fc)++pSimpleCon :: SyntaxInfo -> IParser (Name, [PTerm], FC)+pSimpleCon syn +     = do cn_in <- pfName+          let cn = expandNS syn cn_in+          fc <- pfc+          args <- many (do notEndApp+                           pSimpleExpr syn)+          return (cn, args, fc)++--------- Pattern match clauses ---------++pPattern :: SyntaxInfo -> IParser PDecl+pPattern syn = do clause <- pClause syn+                  fc <- pfc+                  return (PClauses fc [] (MN 2 "_") [clause]) -- collect together later++pArgExpr syn = let syn' = syn { inPattern = True } in+                   try (pHSimpleExpr syn') <|> pSimpleExtExpr syn'++pRHS :: SyntaxInfo -> Name -> IParser PTerm+pRHS syn n = do lchar '='; pExpr syn+         <|> do symbol "?="; rhs <- pExpr syn;+                return (PLet (UN "value") Placeholder rhs (PMetavar n')) +         <|> do reserved "impossible"; return PImpossible+  where mkN (UN x)   = UN (x++"_lemma_1")+        mkN (NS x n) = NS (mkN x) n+        n' = mkN n++pClause :: SyntaxInfo -> IParser PClause+pClause syn+         = try (do push_indent+                   n_in <- pfName; let n = expandNS syn n_in+                   cargs <- many (pConstraintArg syn)+                   iargs <- many (pImplicitArg syn)+                   fc <- pfc+                   args <- many (pArgExpr syn)+                   wargs <- many (pWExpr syn)+                   rhs <- pRHS syn n+                   ist <- getState+                   let ctxt = tt_ctxt ist+                   let wsyn = syn { syn_namespace = [] }+                   (wheres, nmap) <- choice [do x <- pWhereblock n wsyn+                                                pop_indent+                                                return x, +                                             do pTerminator+                                                return ([], [])]+                   let capp = PApp fc (PRef fc n) +                                (iargs ++ cargs ++ map pexp args)+                   ist <- getState+                   setState (ist { lastParse = Just n })+                   return $ PClause n capp wargs rhs wheres)+       <|> try (do push_indent+                   wargs <- many1 (pWExpr syn)+                   ist <- getState+                   n <- case lastParse ist of+                             Just t -> return t+                             Nothing -> fail "Invalid clause"+                   rhs <- pRHS syn n+                   let ctxt = tt_ctxt ist+                   let wsyn = syn { syn_namespace = [] }+                   (wheres, nmap) <- choice [do x <- pWhereblock n wsyn+                                                pop_indent+                                                return x, +                                             do pTerminator+                                                return ([], [])]+                   return $ PClauseR wargs rhs wheres)++       <|> try (do push_indent+                   n_in <- pfName; let n = expandNS syn n_in+                   cargs <- many (pConstraintArg syn)+                   iargs <- many (pImplicitArg syn)+                   fc <- pfc+                   args <- many (pArgExpr syn)+                   wargs <- many (pWExpr syn)+                   let capp = PApp fc (PRef fc n) +                                (iargs ++ cargs ++ map pexp args)+                   reserved "with"+                   wval <- pSimpleExpr syn+                   open_block+                   ds <- many1 $ pFunDecl syn+                   let withs = map (fillLHSD n capp wargs) $ concat ds+                   close_block+                   ist <- getState+                   setState (ist { lastParse = Just n })+                   pop_indent+                   return $ PWith n capp wargs wval withs)++       <|> try (do wargs <- many1 (pWExpr syn)+                   reserved "with"+                   wval <- pSimpleExpr syn+                   open_block+                   ds <- many1 $ pFunDecl syn+                   let withs = concat ds+                   close_block+                   return $ PWithR wargs wval withs)++       <|> do push_indent+              l <- pArgExpr syn+              op <- operator+              let n = expandNS syn (UN op)+              r <- pArgExpr syn+              fc <- pfc+              wargs <- many (pWExpr syn)+              rhs <- pRHS syn n+              let wsyn = syn { syn_namespace = [] }+              (wheres, nmap) <- choice [do x <- pWhereblock n wsyn+                                           pop_indent+                                           return x, +                                        do pTerminator+                                           return ([], [])]+              ist <- getState+              let capp = PApp fc (PRef fc n) [pexp l, pexp r]+              setState (ist { lastParse = Just n })+              return $ PClause n capp wargs rhs wheres++       <|> do l <- pArgExpr syn+              op <- operator+              let n = expandNS syn (UN op)+              r <- pArgExpr syn+              fc <- pfc+              wargs <- many (pWExpr syn)+              reserved "with"+              wval <- pSimpleExpr syn+              open_block +              ds <- many1 $ pFunDecl syn+              close_block+              ist <- getState+              let capp = PApp fc (PRef fc n) [pexp l, pexp r]+              let withs = map (fillLHSD n capp wargs) $ concat ds+              setState (ist { lastParse = Just n })+              return $ PWith n capp wargs wval withs+  where+    fillLHS n capp owargs (PClauseR wargs v ws) +       = PClause n capp (owargs ++ wargs) v ws+    fillLHS n capp owargs (PWithR wargs v ws) +       = PWith n capp (owargs ++ wargs) v +            (map (fillLHSD n capp (owargs ++ wargs)) ws)+    fillLHS _ _ _ c = c++    fillLHSD n c a (PClauses fc o fn cs) = PClauses fc o fn (map (fillLHS n c a) cs)+    fillLHSD n c a x = x++pWExpr :: SyntaxInfo -> IParser PTerm+pWExpr syn = do lchar '|'; pExpr' syn++pWhereblock :: Name -> SyntaxInfo -> IParser ([PDecl], [(Name, Name)])+pWhereblock n syn +    = do reserved "where"; open_block+         ds <- many1 $ pFunDecl syn+         let dns = concatMap (concatMap declared) ds+         close_block+         return (concat ds, map (\x -> (x, decoration syn x)) dns)++pDirective :: IParser [PDecl]+pDirective = try (do lchar '%'; reserved "lib"; lib <- strlit;+                     return [PDirective (do addLib lib+                                            addIBC (IBCLib lib))])+         <|> try (do lchar '%'; reserved "link"; obj <- strlit;+                     return [PDirective (do datadir <- liftIO $ getDataDir+                                            o <- liftIO $ findInPath [".", datadir] obj+                                            addIBC (IBCObj o)+                                            addObjectFile o)])+         <|> try (do lchar '%'; reserved "include"; hdr <- strlit;+                     return [PDirective (do addHdr hdr+                                            addIBC (IBCHeader hdr))])+         <|> try (do lchar '%'; reserved "hide"; n <- iName []+                     return [PDirective (do setAccessibility n Hidden+                                            addIBC (IBCAccess n Hidden))])+         <|> try (do lchar '%'; reserved "freeze"; n <- iName []+                     return [PDirective (do setAccessibility n Frozen+                                            addIBC (IBCAccess n Frozen))])+         <|> try (do lchar '%'; reserved "access"; acc <- pAccessibility'+                     return [PDirective (do i <- getIState+                                            putIState (i { default_access = acc }))])+         <|> do lchar '%'; reserved "logging"; i <- natural;+                return [PDirective (setLogLevel (fromInteger i))] ++pTactic :: SyntaxInfo -> IParser PTactic+pTactic syn = do reserved "intro"; ns <- sepBy pName (lchar ',')+                 return $ Intro ns+          <|> do reserved "intros"; return Intros+          <|> try (do reserved "refine"; n <- pName+                      imps <- many1 imp+                      return $ Refine n imps)+          <|> do reserved "refine"; n <- pName+                 i <- getState+                 return $ Refine n []+          <|> do reserved "rewrite"; t <- pExpr syn;+                 i <- getState+                 return $ Rewrite (desugar syn i t)+          <|> do reserved "let"; n <- pName; lchar '=';+                 t <- pExpr syn;+                 i <- getState+                 return $ LetTac n (desugar syn i t)+          <|> do reserved "focus"; n <- pName+                 return $ Focus n+          <|> do reserved "exact"; t <- pExpr syn;+                 i <- getState+                 return $ Exact (desugar syn i t)+          <|> do reserved "try"; t <- pTactic syn;+                 lchar '|';+                 t1 <- pTactic syn+                 return $ Try t t1+          <|> do lchar '{'+                 t <- pTactic syn;+                 lchar ';';+                 t1 <- pTactic syn;+                 lchar '}'+                 return $ TSeq t t1+          <|> do reserved "compute"; return Compute+          <|> do reserved "trivial"; return Trivial+          <|> do reserved "solve"; return Solve+          <|> do reserved "attack"; return Attack+          <|> do reserved "state"; return ProofState+          <|> do reserved "term"; return ProofTerm+          <|> do reserved "undo"; return Undo+          <|> do reserved "qed"; return Qed+  where+    imp = do lchar '?'; return False+      <|> do lchar '_'; return True++desugar :: SyntaxInfo -> IState -> PTerm -> PTerm+desugar syn i t = let t' = expandDo (dsl_info syn) t in+                      t' -- addImpl i t'++expandDo :: DSL -> PTerm -> PTerm+expandDo dsl (PLam n ty tm) = PLam n (expandDo dsl ty) (expandDo dsl tm)+expandDo dsl (PLet n ty v tm) = PLet n (expandDo dsl ty) (expandDo dsl v) (expandDo dsl tm)+expandDo dsl (PPi p n ty tm) = PPi p n (expandDo dsl ty) (expandDo dsl tm)+expandDo dsl (PApp fc t args) = PApp fc (expandDo dsl t)+                                        (map (fmap (expandDo dsl)) args)+expandDo dsl (PCase fc s opts) = PCase fc (expandDo dsl s)+                                        (map (pmap (expandDo dsl)) opts)+expandDo dsl (PPair fc l r) = PPair fc (expandDo dsl l) (expandDo dsl r)+expandDo dsl (PDPair fc l t r) = PDPair fc (expandDo dsl l) (expandDo dsl t) +                                           (expandDo dsl r)+expandDo dsl (PAlternative as) = PAlternative (map (expandDo dsl) as)+expandDo dsl (PHidden t) = PHidden (expandDo dsl t)+expandDo dsl (PReturn fc) = dsl_return dsl+expandDo dsl (PDoBlock ds) = expandDo dsl $ block (dsl_bind dsl) ds +  where+    block b [DoExp fc tm] = tm +    block b [a] = PElabError "Last statement in do block must be an expression"+    block b (DoBind fc n tm : rest)+        = PApp fc b [pexp tm, pexp (PLam n Placeholder (block b rest))]+    block b (DoBindP fc p tm : rest)+        = PApp fc b [pexp tm, pexp (PLam (MN 0 "bpat") Placeholder +                                   (PCase fc (PRef fc (MN 0 "bpat"))+                                             [(p, block b rest)]))]+    block b (DoLet fc n ty tm : rest)+        = PLet n ty tm (block b rest)+    block b (DoLetP fc p tm : rest)+        = PCase fc tm [(p, block b rest)]+    block b (DoExp fc tm : rest)+        = PApp fc b +            [pexp tm, +             pexp (PLam (MN 0 "bindx") Placeholder (block b rest))]+    block b _ = PElabError "Invalid statement in do block"+expandDo dsl (PIdiom fc e) = expandDo dsl $ unIdiom (dsl_apply dsl) (dsl_pure dsl) fc e+expandDo dsl t = t++unIdiom :: PTerm -> PTerm -> FC -> PTerm -> PTerm+unIdiom ap pure fc e@(PApp _ _ _) = let f = getFn e in+                                        mkap (getFn e)+  where+    getFn (PApp fc f args) = (PApp fc pure [pexp f], args)+    getFn f = (f, [])++    mkap (f, [])   = f+    mkap (f, a:as) = mkap (PApp fc ap [pexp f, a], as)++unIdiom ap pure fc e = PApp fc pure [pexp e]+
+ src/Idris/Primitives.hs view
@@ -0,0 +1,309 @@+{-# LANGUAGE RankNTypes, ScopedTypeVariables #-}++module Idris.Primitives(elabPrims) where++import Idris.ElabDecls+import Idris.ElabTerm+import Idris.AbsSyntax++import Core.TT+import Core.Evaluate++import Epic.Epic hiding (Term, Type, Name, fn)+import qualified Epic.Epic as E++data Prim = Prim { p_name  :: Name,+                   p_type  :: Type,+                   p_arity :: Int,+                   p_def   :: [Value] -> Maybe Value,+                   p_epic  :: ([E.Name], E.Term)+                 }++ty []     x = Constant x+ty (t:ts) x = Bind (MN 0 "T") (Pi (Constant t)) (ty ts x)++believeTy = Bind (UN "a") (Pi (Set (UVar (-2))))+            (Bind (UN "b") (Pi (Set (UVar (-2))))+            (Bind (UN "x") (Pi (V 1)) (V 1)))++type ETm = E.Term+type EOp = E.Op++fun = E.fn+ref = E.ref++eOp :: EOp -> ([E.Name], ETm)+eOp op = ([E.name "x", E.name "y"], E.op_ op (E.fn "x") (E.fn "y")) ++eOpFn :: E.Type -> E.Type -> String -> ([E.Name], ETm)+eOpFn ty rty op = ([E.name "x", E.name "y"], +                    foreign_ rty op [(E.fn "x", ty), (E.fn "y", ty)])++strToInt x = foreign_ tyInt "strToInt" [(x, tyString)]+intToStr x = foreign_ tyString "intToStr" [(x, tyInt)]+charToInt x = x+intToChar x = x+intToBigInt x = foreign_ tyBigInt "intToBigInt" [(x, tyInt)]+strToBigInt x = foreign_ tyBigInt "strToBig" [(x, tyString)]+bigIntToStr x = foreign_ tyString "bigToStr" [(x, tyBigInt)]+strToFloat x = foreign_ tyFloat "strToFloat" [(x, tyString)]+floatToStr x = foreign_ tyString "floatToStr" [(x, tyFloat)]+intToFloat x = foreign_ tyFloat "intToFloat" [(x, tyInt)]+floatToInt x = foreign_ tyInt "floatToInt" [(x, tyFloat)]++floatExp x = foreign_ tyFloat "exp" [(x, tyFloat)]+floatLog x = foreign_ tyFloat "log" [(x, tyFloat)]+floatSin x = foreign_ tyFloat "sin" [(x, tyFloat)]+floatCos x = foreign_ tyFloat "cos" [(x, tyFloat)]+floatTan x = foreign_ tyFloat "tan" [(x, tyFloat)]+floatASin x = foreign_ tyFloat "asin" [(x, tyFloat)]+floatACos x = foreign_ tyFloat "acos" [(x, tyFloat)]+floatATan x = foreign_ tyFloat "atan" [(x, tyFloat)]+floatFloor x = foreign_ tyFloat "floor" [(x, tyFloat)]+floatCeil x = foreign_ tyFloat "ceil" [(x, tyFloat)]+floatSqrt x = foreign_ tyFloat "sqrt" [(x, tyFloat)]++strIndex x i = foreign_ tyChar "strIndex" [(x, tyString), (i, tyInt)]+strHead x = foreign_ tyChar "strHead" [(x, tyString)]+strTail x = foreign_ tyString "strTail" [(x, tyString)]+strCons x xs = foreign_ tyString "strCons" [(x, tyChar), (xs, tyString)]+strRev x = foreign_ tyString "strrev" [(x, tyString)]+strEq x y = foreign_ tyInt "streq" [(x, tyString), (y, tyString)]+strLt x y = foreign_ tyInt "strlt" [(x, tyString), (y, tyString)]++primitives =+   -- operators+  [Prim (UN "prim__addInt") (ty [IType, IType] IType) 2 (iBin (+))+    (eOp E.plus_),+   Prim (UN "prim__subInt") (ty [IType, IType] IType) 2 (iBin (-))+    (eOp E.minus_),+   Prim (UN "prim__mulInt") (ty [IType, IType] IType) 2 (iBin (*))+    (eOp E.times_),+   Prim (UN "prim__divInt") (ty [IType, IType] IType) 2 (iBin (div))+    (eOp E.divide_),+   Prim (UN "prim__eqInt")  (ty [IType, IType] IType) 2 (biBin (==))+    (eOp E.eq_),+   Prim (UN "prim__ltInt")  (ty [IType, IType] IType) 2 (biBin (<))+    (eOp E.lt_),+   Prim (UN "prim__lteInt") (ty [IType, IType] IType) 2 (biBin (<=))+    (eOp E.lte_),+   Prim (UN "prim__gtInt")  (ty [IType, IType] IType) 2 (biBin (>))+    (eOp E.gt_),+   Prim (UN "prim__gteInt") (ty [IType, IType] IType) 2 (biBin (>=))+    (eOp E.gte_),+   Prim (UN "prim__eqChar")  (ty [ChType, ChType] IType) 2 (bcBin (==))+    (eOp E.eq_),+   Prim (UN "prim__ltChar")  (ty [ChType, ChType] IType) 2 (bcBin (<))+    (eOp E.lt_),+   Prim (UN "prim__lteChar") (ty [ChType, ChType] IType) 2 (bcBin (<=))+    (eOp E.lte_),+   Prim (UN "prim__gtChar")  (ty [ChType, ChType] IType) 2 (bcBin (>))+    (eOp E.gt_),+   Prim (UN "prim__gteChar") (ty [ChType, ChType] IType) 2 (bcBin (>=))+    (eOp E.gte_),+   Prim (UN "prim__addBigInt") (ty [BIType, BIType] BIType) 2 (bBin (+))+    (eOpFn tyBigInt tyBigInt "addBig"),+   Prim (UN "prim__subBigInt") (ty [BIType, BIType] BIType) 2 (bBin (-))+    (eOpFn tyBigInt tyBigInt "subBig"),+   Prim (UN "prim__mulBigInt") (ty [BIType, BIType] BIType) 2 (bBin (*))+    (eOpFn tyBigInt tyBigInt "mulBig"),+   Prim (UN "prim__divBigInt") (ty [BIType, BIType] BIType) 2 (bBin (div))+    (eOpFn tyBigInt tyBigInt "divBig"),+   Prim (UN "prim__eqBigInt")  (ty [BIType, BIType] IType) 2 (bbBin (==))+    (eOpFn tyBigInt tyInt "eqBig"),+   Prim (UN "prim__ltBigInt")  (ty [BIType, BIType] IType) 2 (bbBin (<))+    (eOpFn tyBigInt tyInt "ltBig"),+   Prim (UN "prim__lteBigInt")  (ty [BIType, BIType] IType) 2 (bbBin (<=))+    (eOpFn tyBigInt tyInt "leBig"),+   Prim (UN "prim__gtBigInt")  (ty [BIType, BIType] IType) 2 (bbBin (>))+    (eOpFn tyBigInt tyInt "gtBig"),+   Prim (UN "prim__gtBigInt")  (ty [BIType, BIType] IType) 2 (bbBin (>=))+    (eOpFn tyBigInt tyInt "geBig"),+   Prim (UN "prim__addFloat") (ty [FlType, FlType] FlType) 2 (fBin (+))+    (eOp E.plusF_),+   Prim (UN "prim__subFloat") (ty [FlType, FlType] FlType) 2 (fBin (-))+    (eOp E.minusF_),+   Prim (UN "prim__mulFloat") (ty [FlType, FlType] FlType) 2 (fBin (*))+    (eOp E.timesF_),+   Prim (UN "prim__divFloat") (ty [FlType, FlType] FlType) 2 (fBin (/))+    (eOp E.divideF_),+   Prim (UN "prim__eqFloat")  (ty [FlType, FlType] IType) 2 (bfBin (==))+    (eOp E.eqF_),+   Prim (UN "prim__ltFloat")  (ty [FlType, FlType] IType) 2 (bfBin (<))+    (eOp E.ltF_),+   Prim (UN "prim__lteFloat") (ty [FlType, FlType] IType) 2 (bfBin (<=))+    (eOp E.lteF_),+   Prim (UN "prim__gtFloat")  (ty [FlType, FlType] IType) 2 (bfBin (>))+    (eOp E.gtF_),+   Prim (UN "prim__gteFloat") (ty [FlType, FlType] IType) 2 (bfBin (>=))+    (eOp E.gteF_),+   Prim (UN "prim__concat") (ty [StrType, StrType] StrType) 2 (sBin (++))+    ([E.name "x", E.name "y"], (fun "append") @@ fun "x" @@ fun "y"),+   Prim (UN "prim__eqString") (ty [StrType, StrType] IType) 2 (bsBin (==))+    ([E.name "x", E.name "y"], strEq (fun "x") (fun "y")),+   Prim (UN "prim__ltString") (ty [StrType, StrType] IType) 2 (bsBin (<))+    ([E.name "x", E.name "y"], strLt (fun "x") (fun "y")),+    -- Conversions+   Prim (UN "prim__strToInt") (ty [StrType] IType) 1 (c_strToInt)+    ([E.name "x"], strToInt (fun "x")),+   Prim (UN "prim__intToStr") (ty [IType] StrType) 1 (c_intToStr)+    ([E.name "x"], intToStr (fun "x")),+   Prim (UN "prim__charToInt") (ty [ChType] IType) 1 (c_charToInt)+    ([E.name "x"], charToInt (fun "x")),+   Prim (UN "prim__intToChar") (ty [IType] ChType) 1 (c_intToChar)+    ([E.name "x"], intToChar (fun "x")),+   Prim (UN "prim__intToBigInt") (ty [IType] BIType) 1 (c_intToBigInt)+    ([E.name "x"], intToBigInt (fun "x")),+   Prim (UN "prim__strToBigInt") (ty [StrType] BIType) 1 (c_strToBigInt)+    ([E.name "x"], strToBigInt (fun "x")),+   Prim (UN "prim__bigIntToStr") (ty [BIType] StrType) 1 (c_bigIntToStr)+    ([E.name "x"], bigIntToStr (fun "x")),+   Prim (UN "prim__strToFloat") (ty [StrType] FlType) 1 (c_strToFloat)+    ([E.name "x"], strToFloat (fun "x")),+   Prim (UN "prim__floatToStr") (ty [FlType] StrType) 1 (c_floatToStr)+    ([E.name "x"], floatToStr (fun "x")),+   Prim (UN "prim__intToFloat") (ty [IType] FlType) 1 (c_intToFloat)+    ([E.name "x"], intToFloat (fun "x")),+   Prim (UN "prim__floatToInt") (ty [FlType] IType) 1 (c_floatToInt)+    ([E.name "x"], floatToInt (fun "x")),++   Prim (UN "prim__floatExp") (ty [FlType] FlType) 1 (p_floatExp)+    ([E.name "x"], floatExp (fun "x")), +   Prim (UN "prim__floatLog") (ty [FlType] FlType) 1 (p_floatLog)+    ([E.name "x"], floatLog (fun "x")),+   Prim (UN "prim__floatSin") (ty [FlType] FlType) 1 (p_floatSin)+    ([E.name "x"], floatSin (fun "x")),+   Prim (UN "prim__floatCos") (ty [FlType] FlType) 1 (p_floatCos)+    ([E.name "x"], floatCos (fun "x")),+   Prim (UN "prim__floatTan") (ty [FlType] FlType) 1 (p_floatTan)+    ([E.name "x"], floatTan (fun "x")),+   Prim (UN "prim__floatASin") (ty [FlType] FlType) 1 (p_floatASin)+    ([E.name "x"], floatASin (fun "x")),+   Prim (UN "prim__floatACos") (ty [FlType] FlType) 1 (p_floatACos)+    ([E.name "x"], floatACos (fun "x")),+   Prim (UN "prim__floatATan") (ty [FlType] FlType) 1 (p_floatATan)+    ([E.name "x"], floatATan (fun "x")),+   Prim (UN "prim__floatSqrt") (ty [FlType] FlType) 1 (p_floatSqrt)+    ([E.name "x"], floatSqrt (fun "x")),+   Prim (UN "prim__floatFloor") (ty [FlType] FlType) 1 (p_floatFloor)+    ([E.name "x"], floatFloor (fun "x")),+   Prim (UN "prim__floatCeil") (ty [FlType] FlType) 1 (p_floatCeil)+    ([E.name "x"], floatCeil (fun "x")),++   Prim (UN "prim__strHead") (ty [StrType] ChType) 1 (p_strHead)+    ([E.name "x"], strHead (fun "x")),+   Prim (UN "prim__strTail") (ty [StrType] StrType) 1 (p_strTail)+    ([E.name "x"], strTail (fun "x")),+   Prim (UN "prim__strCons") (ty [ChType, StrType] StrType) 2 (p_strCons)+    ([E.name "x", E.name "xs"], strCons (fun "x") (fun "xs")),+   Prim (UN "prim__strIndex") (ty [StrType, IType] ChType) 2 (p_strIndex)+    ([E.name "x", E.name "i"], strIndex (fun "x") (fun "i")),+   Prim (UN "prim__strRev") (ty [StrType] StrType) 1 (p_strRev)+    ([E.name "x"], strRev (fun "x")),++   Prim (UN "prim__believe_me") believeTy 3 (p_believeMe)+    ([E.name "a", E.name "b", E.name "x"], fun "x") +  ]++p_believeMe [_,_,x] = Just x+p_believeMe _ = Nothing++iBin op [VConstant (I x), VConstant (I y)] = Just $ VConstant (I (op x y))+iBin _ _ = Nothing++bBin op [VConstant (BI x), VConstant (BI y)] = Just $ VConstant (BI (op x y))+bBin _ _ = Nothing++bBini op [VConstant (BI x), VConstant (BI y)] = Just $ VConstant (I (op x y))+bBini _ _ = Nothing++biBin op = iBin (\x y -> if (op x y) then 1 else 0)+bbBin op = bBini (\x y -> if (op x y) then 1 else 0)++fBin op [VConstant (Fl x), VConstant (Fl y)] = Just $ VConstant (Fl (op x y))+fBin _ _ = Nothing++bfBin op [VConstant (Fl x), VConstant (Fl y)] = let i = (if op x y then 1 else 0) in+                                                Just $ VConstant (I i)+bfBin _ _ = Nothing++bcBin op [VConstant (Ch x), VConstant (Ch y)] = let i = (if op x y then 1 else 0) in+                                                Just $ VConstant (I i)+bcBin _ _ = Nothing++bsBin op [VConstant (Str x), VConstant (Str y)] +    = let i = (if op x y then 1 else 0) in+          Just $ VConstant (I i)+bsBin _ _ = Nothing++sBin op [VConstant (Str x), VConstant (Str y)] = Just $ VConstant (Str (op x y))+sBin _ _ = Nothing++c_intToStr [VConstant (I x)] = Just $ VConstant (Str (show x))+c_intToStr _ = Nothing+c_strToInt [VConstant (Str x)] = Just $ VConstant (I (read x))+c_strToInt _ = Nothing++c_intToChar [VConstant (I x)] = Just $ VConstant (Ch (toEnum x))+c_intToChar _ = Nothing+c_charToInt [VConstant (Ch x)] = Just $ VConstant (I (fromEnum x))+c_charToInt _ = Nothing++c_intToBigInt [VConstant (I x)] = Just $ VConstant (BI (fromIntegral x))+c_intToBigInt _ = Nothing++c_bigIntToStr [VConstant (BI x)] = Just $ VConstant (Str (show x))+c_bigIntToStr _ = Nothing+c_strToBigInt [VConstant (Str x)] = Just $ VConstant (BI (read x))+c_strToBigInt _ = Nothing++c_floatToStr [VConstant (Fl x)] = Just $ VConstant (Str (show x))+c_floatToStr _ = Nothing+c_strToFloat [VConstant (Str x)] = Just $ VConstant (Fl (read x))+c_strToFloat _ = Nothing++c_floatToInt [VConstant (Fl x)] = Just $ VConstant (I (truncate x))+c_floatToInt _ = Nothing++c_intToFloat [VConstant (I x)] = Just $ VConstant (Fl (fromIntegral x))+c_intToFloat _ = Nothing++p_fPrim f [VConstant (Fl x)] = Just $ VConstant (Fl (f x))+p_fPrim f _ = Nothing++p_floatExp = p_fPrim exp+p_floatLog = p_fPrim log+p_floatSin = p_fPrim sin+p_floatCos = p_fPrim cos+p_floatTan = p_fPrim tan+p_floatASin = p_fPrim asin+p_floatACos = p_fPrim acos+p_floatATan = p_fPrim atan+p_floatSqrt = p_fPrim sqrt+p_floatFloor = p_fPrim (fromInteger . floor)+p_floatCeil = p_fPrim (fromInteger . ceiling)++p_strHead [VConstant (Str (x:xs))] = Just $ VConstant (Ch x)+p_strHead _ = Nothing+p_strTail [VConstant (Str (x:xs))] = Just $ VConstant (Str xs)+p_strTail _ = Nothing+p_strIndex [VConstant (Str xs), VConstant (I i)] +   | i < length xs = Just $ VConstant (Ch (xs!!i))+p_strIndex _ = Nothing+p_strCons [VConstant (Ch x), VConstant (Str xs)] = Just $ VConstant (Str (x:xs))+p_strCons _ = Nothing+p_strRev [VConstant (Str xs)] = Just $ VConstant (Str (reverse xs))+p_strRev _ = Nothing++elabPrim :: Prim -> Idris ()+elabPrim (Prim n ty i def epic) +    = do updateContext (addOperator n ty i def)+         i <- getIState+         putIState i { idris_prims = (n, epic) : idris_prims i }++elabPrims :: Idris ()+elabPrims = do mapM_ (elabDecl toplevel) +                     (map (PData defaultSyntax (FC "builtin" 0))+                         [inferDecl, unitDecl, falseDecl, pairDecl, eqDecl])+               mapM_ elabPrim primitives+
+ src/Idris/Prover.hs view
@@ -0,0 +1,120 @@+module Idris.Prover where++import Core.Elaborate hiding (Tactic(..))+import Core.TT+import Core.Evaluate+import Core.CaseTree+import Core.Typecheck++import Idris.AbsSyntax+import Idris.Delaborate+import Idris.ElabDecls+import Idris.ElabTerm+import Idris.Parser+import Idris.Error+import Idris.DataOpts++import System.Console.Haskeline+import Control.Monad.State++prover :: Bool -> Name -> Idris ()+prover lit x =+           do ctxt <- getContext+              i <- get+              case lookupTy Nothing x ctxt of+                  [t] -> if elem x (idris_metavars i)+                               then prove ctxt lit x t+                               else fail $ show x ++ " is not a metavariable"+                  _ -> fail "No such metavariable"++showProof :: Bool -> Name -> [String] -> String+showProof lit n ps +    = bird ++ show n ++ " = proof {" ++ break +++             showSep break (map (\x -> "    " ++ x ++ ";") ps) +++                     break ++ "}\n"+  where bird = if lit then "> " else ""+        break = "\n" ++ bird++prove :: Context -> Bool -> Name -> Type -> Idris ()+prove ctxt lit n ty +    = do let ps = initElaborator n ctxt ty +         (tm, prf) <- ploop True ("-" ++ show n) [] (ES (ps, []) "" Nothing)+         iLOG $ "Adding " ++ show tm+         iputStrLn $ showProof lit n prf+         i <- get+         put (i { last_proof = Just (n, prf) })+         let tree = simpleCase False True [(P Ref n ty, tm)]+         logLvl 3 (show tree)+         (ptm, pty) <- recheckC ctxt (FC "proof" 0) [] tm+         ptm' <- applyOpts ptm+         updateContext (addCasedef n True False True [(P Ref n ty, ptm)] +                                                [(P Ref n ty, ptm')] ty)+         solveDeferred n+elabStep :: ElabState [PDecl] -> ElabD a -> Idris (a, ElabState [PDecl])+elabStep st e = do case runStateT e st of+                     OK (a, st') -> return (a, st')+                     Error a -> do i <- get+                                   fail (pshow i a)+                  +dumpState :: IState -> ProofState -> IO ()+dumpState ist (PS nm [] _ tm _ _ _ _ _ _ _ _ _ _ _) = putStrLn $ (show nm) ++ ": no more goals"+dumpState ist ps@(PS nm (h:hs) _ tm _ _ _ _ problems i _ _ ctxy _ _)+   = do let OK ty = goalAtFocus ps+        let OK env = envAtFocus ps+--         putStrLn $ "Other goals: " ++ show hs ++ "\n"+        putStr $ "\n" ++ showPs (reverse env)+        putStrLn $ "---------------------------------- (" ++ show nm+                     ++ ") --------"+        putStrLn $ show h ++ " : " ++ showG ty ++ "\n"+  where+    tshow t = show (delab ist t)++    showPs [] = ""+    showPs ((MN _ "rewrite_rule", _) : bs) = showPs bs+    showPs ((n, Let t v) : bs)+        = "  " ++ show n ++ " = " ++ tshow v ++ " : " +++            tshow t ++ "\n" ++ showPs bs+    showPs ((n, b) : bs)+        = "  " ++ show n ++ " : " +++            tshow (binderTy b) ++ "\n" ++ showPs bs++    showG (Guess t v) = tshow t ++ " =?= " ++ tshow v+    showG b = tshow (binderTy b)++lifte :: ElabState [PDecl] -> ElabD a -> Idris a+lifte st e = do (v, _) <- elabStep st e+                return v++ploop :: Bool -> String -> [String] -> ElabState [PDecl] -> Idris (Term, [String])+ploop d prompt prf e +    = do i <- get+         when d $ liftIO $ dumpState i (proof e)+         x <- lift $ getInputLine (prompt ++ "> ")+         (cmd, step) <- case x of+            Nothing -> fail "Abandoned"+            Just input -> do return (parseTac i input, input)+         (d, st, done, prf') <- idrisCatch +           (case cmd of+              Left err -> do iputStrLn (show err)+                             return (False, e, False, prf)+              Right Undo -> +                           do (_, st) <- elabStep e loadState+                              return (True, st, False, init prf)+              Right ProofState ->+                              return (True, e, False, prf)+              Right ProofTerm -> +                           do tm <- lifte e get_term+                              iputStrLn $ "TT: " ++ show tm ++ "\n"+                              return (False, e, False, prf)+              Right Qed -> do hs <- lifte e get_holes+                              when (not (null hs)) $ fail "Incomplete proof"+                              return (False, e, True, prf)+              Right tac -> do (_, e) <- elabStep e saveState+                              (_, st) <- elabStep e (runTac True i tac)+                              return (True, st, False, prf ++ [step]))+           (\err -> do iputStrLn (show err)+                       return (False, e, False, prf))+         if done then do (tm, _) <- elabStep st get_term +                         return (tm, prf')+                 else ploop d prompt prf' st+
+ src/Idris/REPL.hs view
@@ -0,0 +1,250 @@+{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, DeriveFunctor,+             PatternGuards #-}++module Idris.REPL where++import Idris.AbsSyntax+import Idris.REPLParser+import Idris.ElabDecls+import Idris.ElabTerm+import Idris.Error+import Idris.Delaborate+import Idris.Compiler+import Idris.Prover+import Idris.Parser+import Paths_idris++import Core.Evaluate+import Core.ProofShell+import Core.TT+import Core.Constraints++import System.Console.Haskeline as H+import System.FilePath+import System.Environment+import System.Process+import System.Directory+import System.IO+import Control.Monad+import Control.Monad.State+import Data.List+import Data.Char+import Data.Version++repl :: IState -> [FilePath] -> Idris ()+repl orig mods+   = H.catch+      (do let prompt = mkPrompt mods+          x <- lift $ getInputLine (prompt ++ "> ")+          case x of+              Nothing -> do iputStrLn "Bye bye"+                            return ()+              Just input -> H.catch +                              (do ms <- processInput input orig mods+                                  case ms of+                                      Just mods -> repl orig mods+                                      Nothing -> return ())+                              ctrlC)+      ctrlC+   where ctrlC :: SomeException -> Idris ()+         ctrlC e = do iputStrLn (show e)+                      repl orig mods++mkPrompt [] = "Idris"+mkPrompt [x] = "*" ++ dropExtension x+mkPrompt (x:xs) = "*" ++ dropExtension x ++ " " ++ mkPrompt xs++lit f = case splitExtension f of+            (_, ".lidr") -> True+            _ -> False++processInput :: String -> IState -> [FilePath] -> Idris (Maybe [FilePath])+processInput cmd orig inputs+    = do i <- get+         let fn = case inputs of+                        (f:_) -> f+                        _ -> ""+         case parseCmd i cmd of+                Left err ->   do liftIO $ print err+                                 return (Just inputs)+                Right Reload -> do put (orig { idris_options = idris_options i })+                                   clearErr+                                   mods <- mapM loadModule inputs  +                                   return (Just inputs)+                Right Edit -> do edit fn orig+                                 return (Just inputs)+                Right AddProof -> do idrisCatch (addProof fn orig)+                                                (\e -> iputStrLn (show e))+                                     return (Just inputs)+                Right Quit -> do iputStrLn "Bye bye"+                                 return Nothing+                Right cmd  -> do idrisCatch (process fn cmd)+                                            (\e -> iputStrLn (show e))+                                 return (Just inputs)++edit :: FilePath -> IState -> Idris ()+edit "" orig = iputStrLn "Nothing to edit"+edit f orig+    = do i <- get+         env <- liftIO $ getEnvironment+         let editor = getEditor env+         let line = case errLine i of+                        Just l -> " +" ++ show l ++ " "+                        Nothing -> " "+         let cmd = editor ++ line ++ f+         liftIO $ system cmd+         clearErr+         put (orig { idris_options = idris_options i })+         loadModule f+         iucheck+         return ()+   where getEditor env | Just ed <- lookup "EDITOR" env = ed+                       | Just ed <- lookup "VISUAL" env = ed+                       | otherwise = "vi"++addProof :: FilePath -> IState -> Idris ()+addProof "" orig = iputStrLn "Nothing to add to"+addProof f orig+    = do let fb = f ++ "~"+         liftIO $ copyFile f fb -- make a backup in case something goes wrong!+         prog <- liftIO $ readFile fb+         i <- get+         case last_proof i of+            Nothing -> iputStrLn "No proof to add"+            Just (n, p) -> do let prog' = insertScript (showProof (lit f) n p) (lines prog)+                              liftIO $ writeFile f (unlines prog')+                              iputStrLn $ "Added proof " ++ show n+                              put (i { last_proof = Nothing })+                              -- lift $ removeFile fb -- uncomment when less scared :)++insertScript :: String -> [String] -> [String]+insertScript prf [] = "\n---------- Proofs ----------" : "" : [prf]+insertScript prf (p@"---------- Proofs ----------" : "" : xs) +    = p : "" : prf : xs+insertScript prf (x : xs) = x : insertScript prf xs++process :: FilePath -> Command -> Idris ()+process fn Help = iputStrLn displayHelp+process fn (Eval t) +                 = do (tm, ty) <- elabVal toplevel False t+                      ctxt <- getContext+                      ist <- get +                      let tm' = normaliseAll ctxt [] tm+                      let ty' = normaliseAll ctxt [] ty+                      logLvl 3 $ "Raw: " ++ show (tm', ty')+                      imp <- impShow+                      iputStrLn (showImp imp (delab ist tm') ++ " : " ++ +                                 showImp imp (delab ist ty'))+process fn (ExecVal t) +                    = do (tm, ty) <- elabVal toplevel False t +--                                         (PApp fc (PRef fc (NS (UN "print") ["prelude"]))+--                                                           [pexp t])+                         (tmpn, tmph) <- liftIO tempfile+                         liftIO $ hClose tmph+                         compile tmpn tm+                         liftIO $ system tmpn+                         return ()+    where fc = FC "(input)" 0 +process fn (Check (PRef _ n))+                  = do ctxt <- getContext+                       ist <- get+                       imp <- impShow+                       case lookupTy Nothing n ctxt of+                        [t] -> iputStrLn $ show n ++ " : " +++                                  showImp imp (delab ist t)+                        _ -> iputStrLn $ "No such variable " ++ show n+process fn (Check t) = do (tm, ty) <- elabVal toplevel False t+                          ctxt <- getContext+                          ist <- get +                          imp <- impShow+                          let ty' = normaliseC ctxt [] ty+                          iputStrLn (showImp imp (delab ist tm) ++ " : " ++ +                                    showImp imp (delab ist ty))+process fn Universes = do i <- get+                          let cs = idris_constraints i+--                        iputStrLn $ showSep "\n" (map show cs)+                          liftIO $ print (map fst cs)+                          let n = length cs+                          iputStrLn $ "(" ++ show n ++ " constraints)"+                          case ucheck cs of+                            Error e -> iputStrLn $ pshow i e+                            OK _ -> iputStrLn "Universes OK"+process fn (Defn n) = do i <- get+                         iputStrLn "Compiled patterns:\n"+                         liftIO $ print (lookupDef Nothing n (tt_ctxt i))+                         case lookupCtxt Nothing n (idris_patdefs i) of+                            [] -> return ()+                            [d] -> do iputStrLn "Original definiton:\n"+                                      mapM_ (printCase i) d+    where printCase i (lhs, rhs) = do liftIO $ putStr $ showImp True (delab i lhs)+                                      liftIO $ putStr " = "+                                      liftIO $ putStrLn $ showImp True (delab i rhs)+process fn (Info n) = do i <- get+                         let oi = lookupCtxt Nothing n (idris_optimisation i)+                         liftIO $ print oi+process fn (Spec t) = do (tm, ty) <- elabVal toplevel False t+                         ctxt <- getContext+                         ist <- get+                         let tm' = specialise ctxt (idris_statics ist) tm+                         iputStrLn (show (delab ist tm'))+process fn (Prove n) = prover (lit fn) n+process fn (HNF t)  = do (tm, ty) <- elabVal toplevel False t+                         ctxt <- getContext+                         ist <- get+                         let tm' = simplify ctxt [] tm+                         iputStrLn (show (delab ist tm'))+process fn TTShell  = do ist <- get+                         let shst = initState (tt_ctxt ist)+                         shst' <- lift $ runShell shst+                         return ()+process fn Execute = do (m, _) <- elabVal toplevel False +                                        (PApp fc +                                           (PRef fc (UN "run__IO"))+                                           [pexp $ PRef fc (NS (UN "main") ["main"])])+--                                      (PRef (FC "main" 0) (NS (UN "main") ["main"]))+                        (tmpn, tmph) <- liftIO tempfile+                        liftIO $ hClose tmph+                        compile tmpn m+                        liftIO $ system tmpn+                        return ()+  where fc = FC "main" 0                     +process fn (Compile f) = do (m, _) <- elabVal toplevel False+                                        (PApp fc +                                           (PRef fc (UN "run__IO"))+                                           [pexp $ PRef fc (NS (UN "main") ["main"])])+                            compile f m+  where fc = FC "main" 0                     +process fn (LogLvl i) = setLogLevel i +process fn Metavars +                 = do ist <- get+                      let mvs = idris_metavars ist \\ primDefs+                      case mvs of+                        [] -> iputStrLn "No global metavariables to solve"+                        _ -> iputStrLn $ "Global metavariables:\n\t" ++ show mvs+process fn NOP      = return ()++displayHelp = let vstr = showVersion version in+              "\nIdris version " ++ vstr ++ "\n" +++              "--------------" ++ map (\x -> '-') vstr ++ "\n\n" +++              concatMap cmdInfo help+  where cmdInfo (cmds, args, text) = "   " ++ col 16 12 (showSep " " cmds) args text +        col c1 c2 l m r = +            l ++ take (c1 - length l) (repeat ' ') ++ +            m ++ take (c2 - length m) (repeat ' ') ++ r ++ "\n"++help =+  [ (["Command"], "Arguments", "Purpose"),+    ([""], "", ""),+    (["<expr>"], "", "Evaluate an expression"),+    ([":t"], "<expr>", "Check the type of an expression"),+    ([":r",":reload"], "", "Reload current file"),+    ([":e",":edit"], "", "Edit current file using $EDITOR or $VISUAL"),+    ([":m",":metavars"], "", "Show remaining proof obligations (metavariables)"),+    ([":p",":prove"], "<name>", "Prove a metavariable"),+    ([":a",":addproof"], "", "Add last proof to source file"),+    ([":c",":compile"], "<filename>", "Compile to an executable <filename>"),+    ([":exec",":execute"], "", "Compile to an executable and run"),+    ([":?",":h",":help"], "", "Display this help text"),+    ([":q",":quit"], "", "Exit the Idris system")+  ]+
+ src/Idris/REPLParser.hs view
@@ -0,0 +1,43 @@+module Idris.REPLParser(parseCmd) where++import Idris.Parser+import Idris.AbsSyntax+import Core.TT++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+import Data.List++parseCmd i = runParser pCmd i "(input)"++cmd :: [String] -> IParser ()+cmd xs = do lchar ':'; docmd (sortBy (\x y -> compare (length y) (length x)) xs)+    where docmd [] = fail "No such command"+          docmd (x:xs) = try (discard (symbol x)) <|> docmd xs++pCmd :: IParser Command+pCmd = try (do cmd ["q", "quit"]; eof; return Quit)+   <|> try (do cmd ["h", "?", "help"]; eof; return Help)+   <|> try (do cmd ["r", "reload"]; eof; return Reload)+   <|> try (do cmd ["e", "edit"]; eof; return Edit)+   <|> try (do cmd ["exec", "execute"]; eof; return Execute)+   <|> try (do cmd ["ttshell"]; eof; return TTShell)+   <|> try (do cmd ["c", "compile"]; f <- identifier; eof; return (Compile f))+   <|> try (do cmd ["m", "metavars"]; eof; return Metavars)+   <|> try (do cmd ["p", "prove"]; n <- pName; eof; return (Prove n)) +   <|> try (do cmd ["a", "addproof"]; eof; return AddProof)+   <|> try (do cmd ["log"]; i <- natural; eof; return (LogLvl (fromIntegral i)))+   <|> try (do cmd ["spec"]; t <- pFullExpr defaultSyntax; return (Spec t))+   <|> try (do cmd ["hnf"]; t <- pFullExpr defaultSyntax; return (HNF t))+   <|> try (do cmd ["d", "def"]; n <- pName; eof; return (Defn n))+   <|> try (do cmd ["t", "type"]; do t <- pFullExpr defaultSyntax; return (Check t))+   <|> try (do cmd ["u", "universes"]; eof; return Universes)+   <|> try (do cmd ["i", "info"]; n <- pfName; eof; return (Info n))+   <|> try (do cmd ["x"]; t <- pFullExpr defaultSyntax; return (ExecVal t))+   <|> do t <- pFullExpr defaultSyntax; return (Eval t)+   <|> do eof; return NOP+
+ src/Idris/Transforms.hs view
@@ -0,0 +1,44 @@+{-# LANGUAGE PatternGuards #-}++module Idris.Transforms where++import Idris.AbsSyntax+import Core.CaseTree+import Core.TT++class Transform a where+    transform :: (a -> a) -> a -> a++instance Transform (TT Name) where+    transform t x = t (trans' x) where+        trans' (Bind n b sc) = Bind n (fmap (transform t) b) (transform t sc)+        trans' (App f a) = App (transform t f) (transform t a)+        trans' x = x++type TTOpt = TT Name -> TT Name++optimisations :: [TTOpt]+optimisations = [zero, suc]++instance Transform SC where+    transform t x = t (trans' x) where+        trans' (Case n alts) = Case n (map transAlt alts)+        trans' t = t++        transAlt (ConCase n i as sc) = ConCase n i as (trans' sc)+        transAlt (ConstCase c sc) = ConstCase c (trans' sc)+        transAlt (DefaultCase sc) = DefaultCase (trans' sc)++type CaseOpt = SC -> SC++zero :: TTOpt+zero (P _ n _) | n == NS (UN "O") ["nat","prelude"] +    = Constant (BI 0)+zero x = x++suc :: TTOpt+suc (App (P _ s _) a) | s == NS (UN "S") ["nat","prelude"] +    = mkApp (P Ref (UN "prim__addBigInt") Erased) [Constant (BI 1), a]+suc x = x++
+ src/Idris/Unlit.hs view
@@ -0,0 +1,27 @@+module Idris.Unlit(unlit) where++import Core.TT+import Data.Char++unlit :: FilePath -> String -> TC String+unlit f s = do let s' = map ulLine (lines s)+               check f 1 s'+               return $ unlines (map snd s')++data LineType = Prog | Blank | Comm++ulLine ('>':' ':xs)        = (Prog, xs)+ulLine ('>':xs)            = (Prog, xs)+ulLine xs | all isSpace xs = (Blank, "")+          | otherwise      = (Comm, '-':'-':xs)++check f l (a:b:cs) = do chkAdj f l (fst a) (fst b)+                        check f (l+1) (b:cs)+check f l [x] = return ()+check f l [] = return ()++chkAdj f l Prog Comm = tfail $ At (FC f l) ProgramLineComment+chkAdj f l Comm Prog = tfail $ At (FC f l) ProgramLineComment+chkAdj f l _    _    = return ()++
+ src/Main.hs view
@@ -0,0 +1,128 @@+module Main where++import System.Console.Haskeline+import System.IO+import System.Environment+import System.Exit++import Data.Maybe+import Data.Version+import Control.Monad.State++import Core.CoreParser+import Core.ShellParser+import Core.TT+import Core.Typecheck+import Core.ProofShell+import Core.Evaluate+import Core.Constraints++import Idris.AbsSyntax+import Idris.Parser+import Idris.REPL+import Idris.ElabDecls+import Idris.Primitives+import Idris.Imports+import Idris.Error+import Paths_idris++-- Main program reads command line options, parses the main program, and gets+-- on with the REPL.++data Opt = Filename String+         | Ver+         | Usage+         | NoPrelude+         | NoREPL+         | OLogging Int+         | Output String+         | TypeCase+         | TypeInType+         | NoCoverage +         | Verbose+    deriving Eq++main = do xs <- getArgs+          opts <- parseArgs xs+          runInputT defaultSettings $ execStateT (runIdris opts) idrisInit++runIdris :: [Opt] -> Idris ()+runIdris opts = +    do let inputs = opt getFile opts+       let runrepl = not (NoREPL `elem` opts)+       let output = opt getOutput opts+       when (Ver `elem` opts) $ liftIO showver+       when (Usage `elem` opts) $ liftIO usage+       setREPL runrepl+       setVerbose runrepl+       when (Verbose `elem` opts) $ setVerbose True+       mapM_ makeOption opts+       elabPrims+       when (not (NoPrelude `elem` opts)) $ do x <- loadModule "prelude"+                                               return ()+       when runrepl $ iputStrLn banner +       ist <- get+       mods <- mapM loadModule inputs+       ok <- noErrors+       when ok $ case output of+                    [] -> return ()+                    (o:_) -> process "" (Compile o)  +       when runrepl $ repl ist inputs+       ok <- noErrors+       when (not ok) $ liftIO (exitWith (ExitFailure 1))+  where+    makeOption (OLogging i) = setLogLevel i+    makeOption TypeCase = setTypeCase True+    makeOption TypeInType = setTypeInType True+    makeOption NoCoverage = setCoverage False+    makeOption _ = return ()++getFile :: Opt -> Maybe String+getFile (Filename str) = Just str+getFile _ = Nothing++getOutput :: Opt -> Maybe String+getOutput (Output str) = Just str+getOutput _ = Nothing++opt :: (Opt -> Maybe a) -> [Opt] -> [a]+opt = mapMaybe ++usage = do putStrLn usagemsg+           exitWith ExitSuccess++showver = do putStrLn $ "Idris version " ++ ver+             exitWith ExitSuccess++parseArgs :: [String] -> IO [Opt]+parseArgs [] = return []+parseArgs ("--log":lvl:ns)   = liftM (OLogging (read lvl) : ) (parseArgs ns)+parseArgs ("--noprelude":ns) = liftM (NoPrelude : ) (parseArgs ns)+parseArgs ("--check":ns)     = liftM (NoREPL : ) (parseArgs ns)+parseArgs ("-o":n:ns)        = liftM (\x -> NoREPL : Output n : x) (parseArgs ns)+parseArgs ("--typecase":ns)  = liftM (TypeCase : ) (parseArgs ns)+parseArgs ("--typeintype":ns) = liftM (TypeInType : ) (parseArgs ns)+parseArgs ("--nocoverage":ns) = liftM (NoCoverage : ) (parseArgs ns)+parseArgs ("--help":ns)      = liftM (Usage : ) (parseArgs ns)+parseArgs ("--version":ns)   = liftM (Ver : ) (parseArgs ns)+parseArgs ("--verbose":ns)   = liftM (Verbose : ) (parseArgs ns)+parseArgs (n:ns)             = liftM (Filename n : ) (parseArgs ns)++ver = showVersion version++banner = "     ____    __     _                                          \n" ++     +         "    /  _/___/ /____(_)____                                     \n" +++         "    / // __  / ___/ / ___/     Version " ++ ver ++ "\n" +++         "  _/ // /_/ / /  / (__  )      http://www.idris-lang.org/      \n" +++         " /___/\\__,_/_/  /_/____/       Type :? for help                \n" ++usagemsg = "Idris version " ++ ver ++ "\n" +++           "--------------" ++ map (\x -> '-') ver ++ "\n" +++           "Usage: idris [input file] [options]\n" +++           "Options:\n" +++           "\t--check       Type check only\n" +++           "\t-o [file]     Generate executable\n" +++           "\t--noprelude   Don't import the prelude\n" +++           "\t--typeintype  Disable universe checking\n" +++           "\t--log [level] Set debugging log level\n"+
+ tutorial/examples/binary.idr view
@@ -0,0 +1,62 @@+module main++data Binary : Nat -> Set where+    bEnd : Binary O+    bO : Binary n -> Binary (n + n)+    bI : Binary n -> Binary (S (n + n))++instance Show (Binary n) where+    show (bO x) = show x ++ "0"+    show (bI x) = show x ++ "1"+    show bEnd = ""++data Parity : Nat -> Set where+   even : Parity (n + n)+   odd  : Parity (S (n + n))++parity : (n:Nat) -> Parity n+parity O     = even {n=O}+parity (S O) = odd {n=O}+parity (S (S k)) with (parity k)+    parity (S (S (j + j)))     | even ?= even {n=S j}+    parity (S (S (S (j + j)))) | odd  ?= odd {n=S j}++natToBin : (n:Nat) -> Binary n+natToBin O = bEnd+natToBin (S k) with (parity k)+   natToBin (S (j + j))     | even  = bI (natToBin j)+   natToBin (S (S (j + j))) | odd  ?= bO (natToBin (S j))++intToNat : Int -> Nat+intToNat 0 = O+intToNat x = if (x>0) then (S (intToNat (x-1))) else O++main : IO ()+main = do putStr "Enter a number: "+          x <- getLine+          print (natToBin (fromInteger (cast x)))++---------- Proofs ----------++natToBin_lemma_1 = proof {+    intro;+    intro;+    rewrite plusn_Sm j j;+    trivial;+}++parity_lemma_2 = proof {+    intro;+    intro;+    rewrite plusn_Sm j j;+    trivial;+}++parity_lemma_1 = proof {+    intro j;+    intro;+    rewrite plusn_Sm j j;+    trivial;+}++
+ tutorial/examples/bmain.idr view
@@ -0,0 +1,8 @@+module main++import btree++main : IO ()+main = do let t = toTree [1,8,2,7,9,3] +          print (toList t)+
+ tutorial/examples/btree.idr view
@@ -0,0 +1,18 @@+module btree++data BTree a = Leaf+             | Node (BTree a) a (BTree a)++insert : Ord a => a -> BTree a -> BTree a+insert x Leaf = Node Leaf x Leaf+insert x (Node l v r) = if (x < v) then (Node (insert x l) v r)+                                   else (Node l v (insert x r))++toList : BTree a -> List a+toList Leaf = []+toList (Node l v r) = app (toList l) (v :: toList r)++toTree : Ord a => List a -> BTree a+toTree [] = Leaf+toTree (x :: xs) = insert x (toTree xs)+
+ tutorial/examples/classes.idr view
@@ -0,0 +1,10 @@+m_add : Maybe Int -> Maybe Int -> Maybe Int+m_add x y = do x' <- x -- Extract value from x+               y' <- y -- Extract value from y+               return (x' + y') -- Add them ++m_add' : Maybe Int -> Maybe Int -> Maybe Int+m_add' x y = [ x' + y' | x' <- x, y' <- y ]++sortAndShow : (Ord a, Show a) => List a -> String+sortAndShow xs = show (sort xs)
+ tutorial/examples/foo.idr view
@@ -0,0 +1,10 @@+module foo++namespace x+  test : Int -> Int+  test x = x * 2++namespace y+  test : String -> String+  test x = x ++ x +
+ tutorial/examples/hello.idr view
@@ -0,0 +1,5 @@+module main++main : IO ()+main = putStrLn "Hello world"+
+ tutorial/examples/interp.idr view
@@ -0,0 +1,65 @@+module main++data Ty = TyInt | TyBool| TyFun Ty Ty++interpTy : Ty -> Set+interpTy TyInt       = Int+interpTy TyBool      = Bool+interpTy (TyFun s t) = interpTy s -> interpTy t++using (G : Vect Ty n) ++  data Env : Vect Ty n -> Set where+      Nil  : Env Nil+      (::) : interpTy a -> Env G -> Env (a :: G)++  data HasType : (i : Fin n) -> Vect Ty n -> Ty -> Set where+      stop : HasType fO (t :: G) t+      pop  : HasType k G t -> HasType (fS k) (u :: G) t++  lookup : HasType i G t -> Env G -> interpTy t+  lookup stop    (x :: xs) = x+  lookup (pop k) (x :: xs) = lookup k xs++  data Expr : Vect Ty n -> Ty -> Set where+      Var : HasType i G t -> Expr G t+      Val : (x : Int) -> Expr G TyInt+      Lam : Expr (a :: G) t -> Expr G (TyFun a t)+      App : Expr G (TyFun a t) -> Expr G a -> Expr G t+      Op  : (interpTy a -> interpTy b -> interpTy c) -> Expr G a -> Expr G b -> +            Expr G c+      If  : Expr G TyBool -> Expr G a -> Expr G a -> Expr G a+  +  interp : Env G -> {static} Expr G t -> interpTy t+  interp env (Var i)     = lookup i env+  interp env (Val x)     = x+  interp env (Lam sc)    = \x => interp (x :: env) sc+  interp env (App f s)   = interp env f (interp env s)+  interp env (Op op x y) = op (interp env x) (interp env y)+  interp env (If x t e)  = if interp env x then interp env t +                                           else interp env e++  eId : Expr G (TyFun TyInt TyInt)+  eId = Lam (Var stop)++  eAdd : Expr G (TyFun TyInt (TyFun TyInt TyInt))+  eAdd = Lam (Lam (Op (+) (Var stop) (Var (pop stop))))+  +  eDouble : Expr G (TyFun TyInt TyInt)+  eDouble = Lam (App (App eAdd (Var stop)) (Var stop))+ +  app : |(f : Expr G (TyFun a t)) -> Expr G a -> Expr G t+  app = \f, a => App f a++  fact : Expr G (TyFun TyInt TyInt)+  fact = Lam (If (Op (==) (Var stop) (Val 0))+                 (Val 1) (Op (*) (app fact (Op (-) (Var stop) (Val 1))) (Var stop)))++testFac : Int+testFac = interp [] fact 4++main : IO ()+main = do putStr "Enter a number: "+          x <- getLine+          print (interp [] fact (cast x)) +
+ tutorial/examples/letbind.idr view
@@ -0,0 +1,16 @@+module letbind++mirror : List a -> List a+mirror xs = let xs' = rev xs in+                app xs xs'++data Person = MkPerson String Int++showPerson : Person -> String+showPerson p = let MkPerson name age = p in+                   name ++ " is " ++ show age ++ " years old"++splitAt : Char -> String -> (String, String)+splitAt c x = case break (== c) x of+                  (x, y) => (x, strTail y)+
+ tutorial/examples/prims.idr view
@@ -0,0 +1,14 @@+module prims++x : Int+x = 42++foo : String+foo = "Sausage machine"++bar : Char+bar = 'Z'++quux : Bool+quux = False+
+ tutorial/examples/theorems.idr view
@@ -0,0 +1,38 @@++fiveIsFive : 5 = 5+fiveIsFive = refl++twoPlusTwo : 2 + 2 = 4+twoPlusTwo = refl++plusReduces : (n:Nat) -> plus O n = n+plusReduces n = refl++plusReducesO : (n:Nat) -> n = plus n O+plusReducesO O = refl+plusReducesO (S k) = eqRespS (plusReducesO k)++plusReducesS : (n:Nat) -> (m:Nat) -> S (plus n m) = plus n (S m)+plusReducesS O m = refl+plusReducesS (S k) m = eqRespS (plusReducesS k m)++plusReducesO' : (n:Nat) -> n = plus n O+plusReducesO' O     = ?plusredO_O+plusReducesO' (S k) = let ih = plusReducesO' k in+                      ?plusredO_S+++---------- Proofs ----------++plusredO_S = proof {+    intro;+    intro;+    rewrite ih;+    trivial;+}++plusredO_O = proof {+    compute;+    trivial;+}+
+ tutorial/examples/universe.idr view
@@ -0,0 +1,7 @@+myid : (a : Set) -> a -> a+myid _ x = x++idid :  (a : Set) -> a -> a+idid = myid _ myid++
+ tutorial/examples/usefultypes.idr view
@@ -0,0 +1,20 @@++intVec : Vect Int 5+intVec = [1, 2, 3, 4, 5]++double : Int -> Int+double x = x * 2++vec : (n ** Vect Int n)+vec = (_ ** [3, 4])++list_lookup : Nat -> List a -> Maybe a+list_lookup _     Nil         = Nothing+list_lookup O     (x :: xs) = Just x+list_lookup (S k) (x :: xs) = list_lookup k xs++lookup_default : Nat -> List a -> a -> a+lookup_default i xs def = case list_lookup i xs of+                              Nothing => def+                              Just x => x+
+ tutorial/examples/vbroken.idr view
@@ -0,0 +1,5 @@+vapp : Vect a n -> Vect a m -> Vect a (n + m)+vapp Nil       ys = ys+vapp (x :: xs) ys = x :: vapp xs xs -- BROKEN++
+ tutorial/examples/views.idr view
@@ -0,0 +1,37 @@+module views++data Parity : Nat -> Set where+   even : Parity (n + n)+   odd  : Parity (S (n + n))++parity : (n:Nat) -> Parity n+parity O     = even {n=O}+parity (S O) = odd {n=O}+parity (S (S k)) with (parity k)+  parity (S (S (j + j)))     | even ?= even {n=S j}+  parity (S (S (S (j + j)))) | odd  ?= odd {n=S j}++natToBin : Nat -> List Bool+natToBin O = Nil+natToBin k with (parity k)+   natToBin (j + j)     | even = False :: natToBin j+   natToBin (S (j + j)) | odd  = True  :: natToBin j+++---------- Proofs ----------++views.parity_lemma_2 = proof {+    intro;+    intro;+    rewrite plusn_Sm j j;+    trivial;+}++views.parity_lemma_1 = proof {+    intro;+    intro;+    rewrite plusn_Sm j j;+    trivial;+}++