on master help sign in
Merge pull request #2528 from david-christiansen/wip/tactical

Features and bug fixes for Elab reflection

commitd9b5682edd7f69280e40c950129fa00809b263b0 authorDavid Christiansen <david@davidchristiansen.dk> dateSun 16 Aug 2015, 21:14 (11 years ago) parent2cefa5cd7db8ca
7 files changed+271−140
libs/base/Language/Reflection/Utils.idr+18−4 libs/prelude/Language/Reflection.idr+50−21 libs/prelude/Language/Reflection/Elab.idr+68−28 src/Idris/Elab/Term.hs+16−3 src/Idris/Reflection.hs+102−67 test/meta001/Finite.idr+16−16 test/tactics001/Tactics.idr+1−1
libs/base/Language/Reflection/Utils.idr+18−4
@@ -242,6 +242,12 @@ instance Eq TT where
242242 equalp (TType u) (TType u') = u == u'
243243 equalp x y = False
244244
245+instance Eq Universe where
246+ Reflection.NullType == Reflection.NullType = True
247+ Reflection.UniqueType == Reflection.UniqueType = True
248+ Reflection.AllTypes == Reflection.AllTypes = True
249+ _ == _ = False
250+
245251total
246252forget : TT -> Maybe Raw
247253forget tm = fe [] tm
@@ -333,10 +339,18 @@ instance Show Erasure where
333339 show Erased = "Erased"
334340 show NotErased = "NotErased"
335341
336−instance Show Arg where
337− showPrec d (Explicit n e t) = showCon d "Explicit" $ showArg n ++ showArg e ++ showArg t
338− showPrec d (Implicit n e t) = showCon d "Implicit" $ showArg n ++ showArg e ++ showArg t
339− showPrec d (Constraint n e t) = showCon d "Constraint" $ showArg n ++ showArg e ++ showArg t
342+instance Show Plicity where
343+ show Explicit = "Explicit"
344+ show Implicit = "Implicit"
345+ show Constraint = "Constraint"
346+
347+instance Show FunArg where
348+ showPrec d (MkFunArg n ty plic era) = showCon d "MkFunArg" $ showArg n ++
349+ showArg ty ++ showArg plic ++ showArg era
350+
351+instance Show CtorArg where
352+ showPrec d (CtorParameter fa) = showCon d "CtorParameter" $ showArg fa
353+ showPrec d (CtorField fa) = showCon d "CtorField" $ showArg fa
340354
341355instance Show TyDecl where
342356 showPrec d (Declare fn args ret) = showCon d "Declare" $ showArg fn ++
libs/prelude/Language/Reflection.idr+50−21
@@ -579,33 +579,62 @@ mutual
579579 quote (PVTy x) = `(PVTy {a=TT} ~(assert_total (quote x)))
580580
581581mutual
582− quoteRaw : Raw -> TT
583− quoteRaw (Var n) = `(Var ~(quote n))
584− quoteRaw (RBind n b tm) = `(RBind ~(quote n) ~(assert_total $ quoteRawBinder b) ~(quoteRaw tm))
585− quoteRaw (RApp tm tm') = `(RApp ~(quoteRaw tm) ~(quoteRaw tm'))
586− quoteRaw RType = `(RType)
587− quoteRaw (RUType u) = `(RUType ~(quote u))
588− quoteRaw (RForce tm) = `(RForce ~(quoteRaw tm))
589− quoteRaw (RConstant c) = `(RConstant ~(quote c))
590−
591− quoteRawBinder : Binder Raw -> TT
592− quoteRawBinder (Lam x) = `(Lam {a=Raw} ~(quoteRaw x))
593− quoteRawBinder (Pi x k) = `(Pi {a=Raw} ~(quoteRaw x) ~(quoteRaw k))
594− quoteRawBinder (Let x y) = `(Let {a=Raw} ~(quoteRaw x) ~(quoteRaw y))
595− quoteRawBinder (NLet x y) = `(NLet {a=Raw} ~(quoteRaw x) ~(quoteRaw y))
596− quoteRawBinder (Hole x) = `(Hole {a=Raw} ~(quoteRaw x))
597− quoteRawBinder (GHole x) = `(GHole {a=Raw} ~(quoteRaw x))
598− quoteRawBinder (Guess x y) = `(Guess {a=Raw} ~(quoteRaw x) ~(quoteRaw y))
599− quoteRawBinder (PVar x) = `(PVar {a=Raw} ~(quoteRaw x))
600− quoteRawBinder (PVTy x) = `(PVTy {a=Raw} ~(quoteRaw x))
582+ quoteRawTT : Raw -> TT
583+ quoteRawTT (Var n) = `(Var ~(quote n))
584+ quoteRawTT (RBind n b tm) = `(RBind ~(quote n) ~(assert_total $ quoteRawBinderTT b) ~(quoteRawTT tm))
585+ quoteRawTT (RApp tm tm') = `(RApp ~(quoteRawTT tm) ~(quoteRawTT tm'))
586+ quoteRawTT RType = `(RType)
587+ quoteRawTT (RUType u) = `(RUType ~(quote u))
588+ quoteRawTT (RForce tm) = `(RForce ~(quoteRawTT tm))
589+ quoteRawTT (RConstant c) = `(RConstant ~(quote c))
590+
591+ quoteRawBinderTT : Binder Raw -> TT
592+ quoteRawBinderTT (Lam x) = `(Lam {a=Raw} ~(quoteRawTT x))
593+ quoteRawBinderTT (Pi x k) = `(Pi {a=Raw} ~(quoteRawTT x) ~(quoteRawTT k))
594+ quoteRawBinderTT (Let x y) = `(Let {a=Raw} ~(quoteRawTT x) ~(quoteRawTT y))
595+ quoteRawBinderTT (NLet x y) = `(NLet {a=Raw} ~(quoteRawTT x) ~(quoteRawTT y))
596+ quoteRawBinderTT (Hole x) = `(Hole {a=Raw} ~(quoteRawTT x))
597+ quoteRawBinderTT (GHole x) = `(GHole {a=Raw} ~(quoteRawTT x))
598+ quoteRawBinderTT (Guess x y) = `(Guess {a=Raw} ~(quoteRawTT x) ~(quoteRawTT y))
599+ quoteRawBinderTT (PVar x) = `(PVar {a=Raw} ~(quoteRawTT x))
600+ quoteRawBinderTT (PVTy x) = `(PVTy {a=Raw} ~(quoteRawTT x))
601601
602602instance Quotable Raw TT where
603603 quotedTy = `(Raw)
604− quote = quoteRaw
604+ quote = quoteRawTT
605605
606606instance Quotable (Binder Raw) TT where
607607 quotedTy = `(Binder Raw)
608− quote = quoteRawBinder
608+ quote = quoteRawBinderTT
609+
610+mutual
611+ quoteRawRaw : Raw -> Raw
612+ quoteRawRaw (Var n) = `(Var ~(quote n))
613+ quoteRawRaw (RBind n b tm) = `(RBind ~(quote n) ~(assert_total $ quoteRawBinderRaw b) ~(quoteRawRaw tm))
614+ quoteRawRaw (RApp tm tm') = `(RApp ~(quoteRawRaw tm) ~(quoteRawRaw tm'))
615+ quoteRawRaw RType = `(RType)
616+ quoteRawRaw (RUType u) = `(RUType ~(quote u))
617+ quoteRawRaw (RForce tm) = `(RForce ~(quoteRawRaw tm))
618+ quoteRawRaw (RConstant c) = `(RConstant ~(quote c))
619+
620+ quoteRawBinderRaw : Binder Raw -> Raw
621+ quoteRawBinderRaw (Lam x) = `(Lam {a=Raw} ~(quoteRawRaw x))
622+ quoteRawBinderRaw (Pi x k) = `(Pi {a=Raw} ~(quoteRawRaw x) ~(quoteRawRaw k))
623+ quoteRawBinderRaw (Let x y) = `(Let {a=Raw} ~(quoteRawRaw x) ~(quoteRawRaw y))
624+ quoteRawBinderRaw (NLet x y) = `(NLet {a=Raw} ~(quoteRawRaw x) ~(quoteRawRaw y))
625+ quoteRawBinderRaw (Hole x) = `(Hole {a=Raw} ~(quoteRawRaw x))
626+ quoteRawBinderRaw (GHole x) = `(GHole {a=Raw} ~(quoteRawRaw x))
627+ quoteRawBinderRaw (Guess x y) = `(Guess {a=Raw} ~(quoteRawRaw x) ~(quoteRawRaw y))
628+ quoteRawBinderRaw (PVar x) = `(PVar {a=Raw} ~(quoteRawRaw x))
629+ quoteRawBinderRaw (PVTy x) = `(PVTy {a=Raw} ~(quoteRawRaw x))
630+
631+instance Quotable Raw Raw where
632+ quotedTy = `(Raw)
633+ quote = quoteRawRaw
634+
635+instance Quotable (Binder Raw) Raw where
636+ quotedTy = `(Binder Raw)
637+ quote = quoteRawBinderRaw
609638
610639instance Quotable ErrorReportPart TT where
611640 quotedTy = `(ErrorReportPart)
libs/prelude/Language/Reflection/Elab.idr+68−28
@@ -7,6 +7,7 @@ module Language.Reflection.Elab
77
88import Builtins
99import Prelude.Applicative
10+import Prelude.Basics
1011import Prelude.Bool
1112import Prelude.Functor
1213import Prelude.List
@@ -18,17 +19,36 @@ import Language.Reflection
1819||| erased.
1920data Erasure = Erased | NotErased
2021
21−||| Arguments, with plicity.
22−data Arg : Type where
23− ||| An explicit argument
24− Explicit : TTName -> Erasure -> Raw -> Arg
22+||| How an argument is provided in high-level Idris
23+data Plicity =
24+ ||| The argument is directly provided at the application site
25+ Explicit |
26+ ||| The argument is found by Idris at the application site
27+ Implicit |
28+ ||| The argument is solved using type class resolution
29+ Constraint
2530
26− ||| An implicit argument, to be solved by unification
27− Implicit : TTName -> Erasure -> Raw -> Arg
28−
29− ||| A type-class constraint argument, to be solved by type class
30− ||| resolution
31− Constraint : TTName -> Erasure -> Raw -> Arg
31+||| Function arguments
32+|||
33+||| These are the simplest representation of argument lists, and are
34+||| used for functions.
35+record FunArg where
36+ constructor MkFunArg
37+ argName : TTName
38+ argTy : Raw
39+ plicity : Plicity
40+ erasure : Erasure
41+
42+||| Type constructor arguments
43+|||
44+||| Each argument is identified as being either a parameter that is
45+||| consistent in all constructors, or an index that varies based on
46+||| which constructor is selected.
47+data TyConArg =
48+ ||| Parameters are uniform across the constructors
49+ TyConParameter FunArg |
50+ ||| Indices are not uniform
51+ TyConIndex FunArg
3252
3353||| A type declaration
3454data TyDecl : Type where
@@ -41,7 +61,7 @@ data TyDecl : Type where
4161 ||| @ fn the name to be declared, fully-qualified
4262 ||| @ args the arguments to the function
4363 ||| @ ret the final return type
44− Declare : (fn : TTName) -> (args : List Arg) -> (ret : Raw) -> TyDecl
64+ Declare : (fn : TTName) -> (args : List FunArg) -> (ret : Raw) -> TyDecl
4565
4666||| A single pattern-matching clause
4767data FunClause : Type where
@@ -51,26 +71,24 @@ data FunClause : Type where
5171data FunDefn : Type where
5272 DefineFun : TTName -> List FunClause -> FunDefn
5373
54−||| An argument to a type constructor.
55−data TyConArg : Type where
56− ||| Parameters are consistent across all constructors of the type
57− Parameter : TTName -> Erasure -> Raw -> TyConArg
5874
59− ||| Indices are allowed to vary across constructors
60− Index : TTName -> Erasure -> Raw -> TyConArg
75+data CtorArg = CtorParameter FunArg | CtorField FunArg
6176
6277||| A reflected datatype definition
63−data Datatype : Type where
64− ||| A reflected datatype definition
65− |||
66− ||| @ familyName the name of the type constructor
67− ||| @ tyConArgs the arguments to the type constructor
68− ||| @ tyConRes the result of the type constructor
69− ||| @ constrs the constructors, with their types
70− MkDatatype : (familyName : TTName) ->
71− (tyConArgs : List TyConArg) -> (tyConRes : Raw) ->
72− (constrs : List (TTName, List Arg, Raw)) ->
73− Datatype
78+record Datatype where
79+ constructor MkDatatype
80+
81+ ||| The name of the type constructor
82+ familyName : TTName
83+
84+ ||| The arguments to the type constructor
85+ tyConArgs : List TyConArg
86+
87+ ||| The result of the type constructor
88+ tyConRes : Raw
89+
90+ ||| The constructors for the family
91+ constructors : List (TTName, List CtorArg, Raw)
7492
7593||| A reflected elaboration script.
7694abstract
@@ -113,8 +131,11 @@ data Elab : Type -> Type where
113131 prim__Forall : TTName -> Raw -> Elab ()
114132 prim__PatVar : TTName -> Elab ()
115133 prim__PatBind : TTName -> Elab ()
134+ -- TODO: letbind
116135
117136 prim__Compute : Elab ()
137+ prim__Normalise : (List (TTName, Binder TT)) -> TT -> Elab TT
138+ prim__Whnf : TT -> Elab TT
118139
119140 prim__DeclareType : TyDecl -> Elab ()
120141 prim__DefineFunction : FunDefn -> Elab ()
@@ -204,6 +225,12 @@ namespace Tactics
204225 forgetTypes : TT -> Elab Raw
205226 forgetTypes tt = prim__Forget tt
206227
228+ ||| Get the goal type as a Raw term
229+ goalType : Elab Raw
230+ goalType = do g <- getGoal
231+ forgetTypes (snd g)
232+
233+
207234 ||| Generate a unique name based on some hint.
208235 |||
209236 ||| **NB**: the generated name is unique _for this run of the
@@ -316,6 +343,19 @@ namespace Tactics
316343 compute : Elab ()
317344 compute = prim__Compute
318345
346+ ||| Normalise a term in some lexical environment
347+ |||
348+ ||| @ env the environment in which to compute (get one of these from `getEnv`)
349+ ||| @ term the term to normalise
350+ normalise : (env : List (TTName, Binder TT)) -> (term : TT) -> Elab TT
351+ normalise env term = prim__Normalise env term
352+
353+ ||| Reduce a closed term to weak-head normal form
354+ |||
355+ ||| @ term the term to reduce
356+ whnf : (term : TT) -> Elab TT
357+ whnf term = prim__Whnf term
358+
319359 ||| Find the source context for the elaboration script
320360 getSourceLocation : Elab SourceLocation
321361 getSourceLocation = prim__SourceLocation
src/Idris/Elab/Term.hs+16−3
@@ -17,6 +17,7 @@ import Idris.Core.Evaluate
1717import Idris.Core.Unify
1818import Idris.Core.ProofTerm (getProofTerm)
1919import Idris.Core.Typecheck (check, recheck, converts, isType)
20+import Idris.Core.WHNF (whnf)
2021import Idris.Coverage (buildSCG, checkDeclTotality, genClauses, recoverableCoverage, validCoverageCase)
2122import Idris.ErrReverse (errReverse)
2223import Idris.ElabQuasiquote (extractUnquotes)
@@ -2050,8 +2051,10 @@ runElabAction ist fc env tm ns = do tm' <- eval tm
20502051 returnUnit
20512052 | n == tacN "prim__Focus", [what] <- args
20522053 = do n' <- reifyTTName what
2053− focus n'
2054− returnUnit
2054+ hs <- get_holes
2055+ if elem n' hs
2056+ then focus n' >> returnUnit
2057+ else lift . tfail . Msg $ "The name " ++ show n' ++ " does not denote a hole"
20552058 | n == tacN "prim__Unfocus", [what] <- args
20562059 = do n' <- reifyTTName what
20572060 movelast n'
@@ -2077,6 +2080,16 @@ runElabAction ist fc env tm ns = do tm' <- eval tm
20772080 returnUnit
20782081 | n == tacN "prim__Compute", [] <- args
20792082 = do compute ; returnUnit
2083+ | n == tacN "prim__Normalise", [env, tm] <- args
2084+ = do env' <- reifyEnv env
2085+ tm' <- reifyTT tm
2086+ ctxt <- get_context
2087+ let out = normaliseAll ctxt env' (finalise tm')
2088+ fmap fst . checkClosed $ reflect out
2089+ | n == tacN "prim__Whnf", [tm] <- args
2090+ = do tm' <- reifyTT tm
2091+ ctxt <- get_context
2092+ fmap fst . checkClosed . reflect $ whnf ctxt tm'
20802093 | n == tacN "prim__DeclareType", [decl] <- args
20812094 = do (RDeclare n args res) <- reifyTyDecl decl
20822095 ctxt <- get_context
@@ -2097,7 +2110,7 @@ runElabAction ist fc env tm ns = do tm' <- eval tm
20972110 let decl = TyDecl Ref checked
20982111 ctxt' = addCtxtDef n decl ctxt
20992112 set_context ctxt'
2100− updateAux $ \e -> e { new_tyDecls = (RTyDeclInstrs n fc (map rArgToPArg args) checked) :
2113+ updateAux $ \e -> e { new_tyDecls = (RTyDeclInstrs n fc (map rFunArgToPArg args) checked) :
21012114 new_tyDecls e }
21022115 aux <- getAux
21032116 returnUnit
src/Idris/Reflection.hs+102−67
@@ -6,9 +6,9 @@ quoters and unquoters along with some supporting datatypes.
66module Idris.Reflection where
77
88import Control.Applicative ((<$>), (<*>), pure)
9−import Control.Monad (liftM, liftM2, liftM3)
9+import Control.Monad (liftM, liftM2, liftM4)
1010import Data.Maybe (catMaybes)
11−import Data.List ((\\))
11+import Data.List ((\\), findIndex)
1212import qualified Data.Text as T
1313
1414import Idris.Core.Elaborate (claim, fill, focus, getNameFrom, initElaborator,
@@ -23,27 +23,33 @@ import Idris.Delaborate (delab)
2323
2424data RErasure = RErased | RNotErased deriving Show
2525
26−data RArg = RExplicit { argName :: Name, argErased :: RErasure, argTy :: Raw }
27− | RImplicit { argName :: Name, argErased :: RErasure, argTy :: Raw }
28− | RConstraint { argName :: Name, argErased :: RErasure, argTy :: Raw }
26+data RPlicity = RExplicit | RImplicit | RConstraint deriving Show
27+
28+data RFunArg = RFunArg { argName :: Name
29+ , argTy :: Raw
30+ , argPlicity :: RPlicity
31+ , erasure :: RErasure
32+ }
2933 deriving Show
3034
31−data RTyDecl = RDeclare Name [RArg] Raw deriving Show
35+data RTyDecl = RDeclare Name [RFunArg] Raw deriving Show
3236
33−data RTyConArg = RParameter { tcArgName :: Name, tcArgErased :: RErasure, tcArgTy :: Raw }
34− | RIndex { tcArgName :: Name, tcArgErased :: RErasure, tcArgTy :: Raw }
37+data RTyConArg = RParameter RFunArg
38+ | RIndex RFunArg
3539 deriving Show
3640
37−data RDatatype = RDatatype Name [RTyConArg] Raw [(Name, [RArg], Raw)] deriving Show
41+data RCtorArg = RCtorParameter RFunArg | RCtorField RFunArg deriving Show
42+
43+data RDatatype = RDatatype Name [RTyConArg] Raw [(Name, [RCtorArg], Raw)] deriving Show
3844
3945rArgOpts :: RErasure -> [ArgOpt]
4046rArgOpts RErased = [InaccessibleArg]
4147rArgOpts _ = []
4248
43−rArgToPArg :: RArg -> PArg
44−rArgToPArg (RExplicit n e _) = PExp 0 (rArgOpts e) n Placeholder
45−rArgToPArg (RImplicit n e _) = PImp 0 False (rArgOpts e) n Placeholder
46−rArgToPArg (RConstraint n e _) = PConstraint 0 (rArgOpts e) n Placeholder
49+rFunArgToPArg :: RFunArg -> PArg
50+rFunArgToPArg (RFunArg n _ RExplicit e) = PExp 0 (rArgOpts e) n Placeholder
51+rFunArgToPArg (RFunArg n _ RImplicit e) = PImp 0 False (rArgOpts e) n Placeholder
52+rFunArgToPArg (RFunArg n _ RConstraint e) = PConstraint 0 (rArgOpts e) n Placeholder
4753
4854data RFunClause = RMkFunClause Raw Raw
4955 | RMkImpossibleClause Raw
@@ -795,6 +801,9 @@ reflectEnv = foldr consToEnvList emptyEnvList
795801 emptyEnvList = raw_apply (Var (sNS (sUN "Nil") ["List", "Prelude"]))
796802 [envTupleType]
797803
804+reifyEnv :: Term -> ElabD Env
805+reifyEnv = reifyList (reifyPair reifyTTName (reifyTTBinder reifyTT (reflm "TT")))
806+
798807-- | Reflect an error into the internal datatype of Idris -- TODO
799808rawBool :: Bool -> Raw
800809rawBool True = Var (sNS (sUN "True") ["Bool", "Prelude"])
@@ -977,29 +986,31 @@ reifyErasure (P (DCon _ _ _) n _)
977986 | n == tacN "NotErased" = return RNotErased
978987reifyErasure tm = fail $ "Can't reify " ++ show tm ++ " as erasure info."
979988
989+reifyPlicity :: Term -> ElabD RPlicity
990+reifyPlicity (P (DCon _ _ _) n _)
991+ | n == tacN "Explicit" = return RExplicit
992+ | n == tacN "Implicit" = return RImplicit
993+ | n == tacN "Constraint" = return RConstraint
994+reifyPlicity tm = fail $ "Couldn't reify " ++ show tm ++ " as RPlicity."
995+
996+reifyRFunArg :: Term -> ElabD RFunArg
997+reifyRFunArg (App _ (App _ (App _ (App _ (P (DCon _ _ _) n _) argN) argTy) argPl) argE)
998+ | n == tacN "MkFunArg" = liftM4 RFunArg
999+ (reifyTTName argN)
1000+ (reifyRaw argTy)
1001+ (reifyPlicity argPl)
1002+ (reifyErasure argE)
1003+reifyRFunArg aTm = fail $ "Couldn't reify " ++ show aTm ++ " as an RArg."
1004+
9801005reifyTyDecl :: Term -> ElabD RTyDecl
9811006reifyTyDecl (App _ (App _ (App _ (P (DCon _ _ _) n _) tyN) args) ret)
9821007 | n == tacN "Declare" =
9831008 do tyN' <- reifyTTName tyN
9841009 args' <- case unList args of
9851010 Nothing -> fail $ "Couldn't reify " ++ show args ++ " as an arglist."
986− Just xs -> mapM reifyRArg xs
1011+ Just xs -> mapM reifyRFunArg xs
9871012 ret' <- reifyRaw ret
9881013 return $ RDeclare tyN' args' ret'
989− where reifyRArg :: Term -> ElabD RArg
990− reifyRArg (App _ (App _ (App _ (P (DCon _ _ _) n _) argN) argE) argTy)
991− | n == tacN "Explicit" = liftM3 RExplicit
992− (reifyTTName argN)
993− (reifyErasure argE)
994− (reifyRaw argTy)
995− | n == tacN "Implicit" = liftM3 RImplicit
996− (reifyTTName argN)
997− (reifyErasure argE)
998− (reifyRaw argTy) | n == tacN "Constraint" = liftM3 RConstraint
999− (reifyTTName argN)
1000− (reifyErasure argE)
1001− (reifyRaw argTy)
1002− reifyRArg aTm = fail $ "Couldn't reify " ++ show aTm ++ " as an RArg."
10031014reifyTyDecl tm = fail $ "Couldn't reify " ++ show tm ++ " as a type declaration."
10041015
10051016reifyFunDefn :: Term -> ElabD RFunDefn
@@ -1028,19 +1039,25 @@ envTupleType
10281039
10291040-- | Apply Idris's implicit info to get a signature. The [PArg] should
10301041-- come from a lookup in idris_implicits on IState.
1031−getArgs :: [PArg] -> Raw -> ([RArg], Raw)
1042+getArgs :: [PArg] -> Raw -> ([RFunArg], Raw)
10321043getArgs [] r = ([], r)
10331044getArgs (a:as) (RBind n (Pi _ ty _) sc) =
10341045 let (args, res) = getArgs as sc
10351046 erased = if InaccessibleArg `elem` argopts a then RErased else RNotErased
10361047 arg' = case a of
1037− PImp {} -> RImplicit n erased ty
1038− PExp {} -> RExplicit n erased ty
1039− PConstraint {} -> RConstraint n erased ty
1040− PTacImplicit {} -> RImplicit n erased ty -- TODO?
1048+ PImp {} -> RFunArg n ty RImplicit erased
1049+ PExp {} -> RFunArg n ty RExplicit erased
1050+ PConstraint {} -> RFunArg n ty RConstraint erased
1051+ PTacImplicit {} -> RFunArg n ty RImplicit erased
10411052 in (arg':args, res)
10421053getArgs _ r = ([], r)
10431054
1055+unApplyRaw :: Raw -> (Raw, [Raw])
1056+unApplyRaw tm = ua [] tm
1057+ where
1058+ ua args (RApp f a) = ua (a:args) f
1059+ ua args t = (t, args)
1060+
10441061-- | Build the reflected datatype definition(s) that correspond(s) to
10451062-- a provided unqualified name
10461063buildDatatypes :: IState -> Name -> [RDatatype]
@@ -1052,44 +1069,62 @@ buildDatatypes ist n =
10521069 ctxt = tt_ctxt ist
10531070 impls = idris_implicits ist
10541071
1055− ctorSig cn = do cty <- fmap forget (lookupTyExact cn ctxt)
1056− argInfo <- lookupCtxtExact cn impls
1057− let (args, res) = getArgs argInfo cty
1058− return (cn, args, res)
1072+ ctorSig params cn = do cty <- fmap forget (lookupTyExact cn ctxt)
1073+ argInfo <- lookupCtxtExact cn impls
1074+ let (args, res) = getArgs argInfo cty
1075+ return (cn, ctorArgsStatus args res params, res)
1076+
1077+ argPos n [] res = findPos n res
1078+ where findPos n app = case unApplyRaw app of
1079+ (_, argL) -> findIndex (== Var n) argL
1080+ argPos n (arg:args) res = if n == argName arg
1081+ then Nothing
1082+ else argPos n args res
1083+
1084+ ctorArgsStatus :: [RFunArg] -> Raw -> [Int] -> [RCtorArg]
1085+ ctorArgsStatus [] _ _ = []
1086+ ctorArgsStatus (arg:args) res params =
1087+ case argPos (argName arg) args res of
1088+ Nothing -> RCtorField arg : ctorArgsStatus args res params
1089+ Just i -> if i `elem` params
1090+ then RCtorParameter arg : ctorArgsStatus args res params
1091+ else RCtorField arg : ctorArgsStatus args res params
10591092
10601093 mkDataType name (TI {param_pos = params, con_names = constrs}) =
10611094 do (TyDecl (TCon _ _) ty) <- lookupDefExact name ctxt
10621095 implInfo <- lookupCtxtExact name impls
1063− let (tcargs, tcres) = getTCArgs params implInfo (forget ty) 0
1064− ctors <- mapM ctorSig constrs
1096+ let (tcargs, tcres) = getTCArgs params implInfo (forget ty)
1097+ ctors <- mapM (ctorSig params) constrs
10651098 return $ RDatatype name tcargs tcres ctors
10661099
1067− getTCArgs params implInfo (RBind an (Pi _ ty _) body) i =
1068− let (erased, implInfo') = case implInfo of
1069− [] -> (RNotErased, [])
1070− (a:as) -> (if InaccessibleArg `elem` argopts a
1071− then RErased
1072− else RNotErased,
1073− as)
1074− (args, res) = getTCArgs params implInfo' body (i+1)
1075− in if i `elem` params
1076− then (RParameter an erased ty : args, res )
1077− else (RIndex an erased ty : args, res)
1078− getTCArgs _ implInfo tm _ = ([], tm)
1100+ getTCArgs :: [Int] -> [PArg] -> Raw -> ([RTyConArg], Raw)
1101+ getTCArgs params implInfo tcTy =
1102+ let (args, res) = getArgs implInfo tcTy
1103+ in (tcArg args 0, res)
1104+ where tcArg [] _ = []
1105+ tcArg (arg:args) i | i `elem` params = RParameter arg : tcArg args (i+1)
1106+ | otherwise = RIndex arg : tcArg args (i+1)
1107+
10791108
10801109reflectErasure :: RErasure -> Raw
10811110reflectErasure RErased = Var (tacN "Erased")
10821111reflectErasure RNotErased = Var (tacN "NotErased")
10831112
1084−reflectArg :: RArg -> Raw
1085−reflectArg arg =
1086− RApp (RApp (RApp (Var con) (reflectName $ argName arg))
1087− (reflectErasure $ argErased arg))
1088− (reflectRaw $ argTy arg)
1089− where con = case arg of
1090− RExplicit{} -> tacN "Explicit"
1091− RImplicit{} -> tacN "Implicit"
1092− RConstraint{} -> tacN "Constraint"
1113+reflectPlicity :: RPlicity -> Raw
1114+reflectPlicity RExplicit = Var (tacN "Explicit")
1115+reflectPlicity RImplicit = Var (tacN "Implicit")
1116+reflectPlicity RConstraint = Var (tacN "Constraint")
1117+
1118+reflectArg :: RFunArg -> Raw
1119+reflectArg (RFunArg n ty plic erasure) =
1120+ RApp (RApp (RApp (RApp (Var $ tacN "MkFunArg") (reflectName n))
1121+ (reflectRaw ty))
1122+ (reflectPlicity plic))
1123+ (reflectErasure erasure)
1124+
1125+reflectCtorArg :: RCtorArg -> Raw
1126+reflectCtorArg (RCtorParameter arg) = RApp (Var $ tacN "CtorParameter") (reflectArg arg)
1127+reflectCtorArg (RCtorField arg) = RApp (Var $ tacN "CtorField") (reflectArg arg)
10931128
10941129reflectDatatype :: RDatatype -> Raw
10951130reflectDatatype (RDatatype tyn tyConArgs tyConRes constrs) =
@@ -1097,18 +1132,18 @@ reflectDatatype (RDatatype tyn tyConArgs tyConRes constrs) =
10971132 , rawList (Var $ tacN "TyConArg") (map reflectConArg tyConArgs)
10981133 , reflectRaw tyConRes
10991134 , rawList (rawTripleTy (Var $ reflm "TTName")
1100− (RApp (Var (sNS (sUN "List") ["List", "Prelude"])) (Var $ tacN "Arg"))
1135+ (RApp (Var (sNS (sUN "List") ["List", "Prelude"])) (Var $ tacN "CtorArg"))
11011136 (Var $ reflm "Raw"))
11021137 [ rawTriple ((Var $ reflm "TTName"),
1103− (RApp (Var (sNS (sUN "List") ["List", "Prelude"])) (Var $ tacN "Arg")),
1138+ (RApp (Var (sNS (sUN "List") ["List", "Prelude"])) (Var $ tacN "CtorArg")),
11041139 (Var $ reflm "Raw"))
11051140 (reflectName cn,
1106− rawList (Var $ tacN "Arg") (map reflectArg cargs),
1141+ rawList (Var $ tacN "CtorArg") (map reflectCtorArg cargs),
11071142 reflectRaw cty)
11081143 | (cn, cargs, cty) <- constrs
11091144 ]
11101145 ]
1111− where reflectConArg (RParameter n e t) =
1112− raw_apply (Var $ tacN "Parameter") [reflectName n, reflectErasure e, reflectRaw t]
1113− reflectConArg (RIndex n e t) =
1114− raw_apply (Var $ tacN "Index") [reflectName n, reflectErasure e, reflectRaw t]
1146+ where reflectConArg (RParameter a) =
1147+ RApp (Var $ tacN "TyConParameter") (reflectArg a)
1148+ reflectConArg (RIndex a) =
1149+ RApp (Var $ tacN "TyConIndex") (reflectArg a)
test/meta001/Finite.idr+16−16
@@ -28,7 +28,7 @@ mkFin (S k) (S j) = do i <- mkFin k j
2828 return `(FS {k=~(quote k)} ~i)
2929
3030mkToClause : TTName -> (size, i : Nat) ->
31− (constr : (TTName, List Arg, Raw)) ->
31+ (constr : (TTName, List CtorArg, Raw)) ->
3232 Elab FunClause
3333mkToClause fn size i (n, [], Var ty) =
3434 MkFunClause (RApp (Var fn) (Var n)) <$> mkFin size i
@@ -37,7 +37,7 @@ mkToClause fn size i (n, _, ty) =
3737
3838
3939mkFromClause : TTName -> (size, i : Nat) ->
40− (constr : (TTName, List Arg, Raw)) ->
40+ (constr : (TTName, List CtorArg, Raw)) ->
4141 Elab FunClause
4242mkFromClause fn size i (n, [], Var ty) =
4343 return $ MkFunClause (RApp (Var fn) !(mkFin size i)) (Var n)
@@ -45,7 +45,7 @@ mkFromClause fn size i (n, _, ty) =
4545 fail [TextPart "unsupported constructor", NamePart n]
4646
4747
48−mkOk1Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List Arg, Raw)) -> Elab FunClause
48+mkOk1Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List CtorArg, Raw)) -> Elab FunClause
4949mkOk1Clause fn size i (n, [], Var ty) =
5050 return $ MkFunClause (RApp (Var fn) (Var n))
5151 [| (Var (UN "Refl")) (Var ty) (Var n) |]
@@ -53,7 +53,7 @@ mkOk1Clause fn size i (n, _, ty) =
5353 fail [TextPart "unsupported constructor", NamePart n]
5454
5555
56−mkOk2Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List Arg, Raw)) -> Elab FunClause
56+mkOk2Clause : TTName -> (size, i : Nat) -> (constr : (TTName, List CtorArg, Raw)) -> Elab FunClause
5757mkOk2Clause fn size i (n, [], Var ty) =
5858 return $ MkFunClause (RApp (Var fn) !(mkFin size i))
5959 [| (Var "Refl") `(Fin ~(quote size))
@@ -62,9 +62,9 @@ mkOk2Clause fn size i (n, _, ty) =
6262 fail [TextPart "unsupported constructor", NamePart n]
6363
6464
65−mkToClauses : TTName -> Nat -> List (TTName, List Arg, Raw) -> Elab (List FunClause)
65+mkToClauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
6666mkToClauses fn size xs = mkToClauses' Z xs
67− where mkToClauses' : Nat -> List (TTName, List Arg, Raw) -> Elab (List FunClause)
67+ where mkToClauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
6868 mkToClauses' k [] = return []
6969 mkToClauses' k (x :: xs) = do rest <- mkToClauses' (S k) xs
7070 clause <- mkToClause fn size k x
@@ -92,26 +92,26 @@ mkAbsurdFinClause fn goal size =
9292
9393
9494mkFromClauses : TTName -> TTName -> Nat ->
95− List (TTName, List Arg, Raw) -> Elab (List FunClause)
95+ List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
9696mkFromClauses fn ty size xs = mkFromClauses' Z xs
97− where mkFromClauses' : Nat -> List (TTName, List Arg, Raw) -> Elab (List FunClause)
97+ where mkFromClauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
9898 mkFromClauses' k [] =
9999 return [!(mkAbsurdFinClause fn (const (Var ty)) size)]
100100 mkFromClauses' k (x :: xs) = do rest <- mkFromClauses' (S k) xs
101101 clause <- mkFromClause fn size k x
102102 return $ clause :: rest
103103
104−mkOk1Clauses : TTName -> Nat -> List (TTName, List Arg, Raw) -> Elab (List FunClause)
104+mkOk1Clauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
105105mkOk1Clauses fn size xs = mkOk1Clauses' Z xs
106− where mkOk1Clauses' : Nat -> List (TTName, List Arg, Raw) -> Elab (List FunClause)
106+ where mkOk1Clauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
107107 mkOk1Clauses' k [] = return []
108108 mkOk1Clauses' k (x :: xs) = do rest <- mkOk1Clauses' (S k) xs
109109 clause <- mkOk1Clause fn size k x
110110 return $ clause :: rest
111111
112−mkOk2Clauses : TTName -> Nat -> List (TTName, List Arg, Raw) -> (Raw -> Raw) -> Elab (List FunClause)
112+mkOk2Clauses : TTName -> Nat -> List (TTName, List CtorArg, Raw) -> (Raw -> Raw) -> Elab (List FunClause)
113113mkOk2Clauses fn size xs resTy = mkOk2Clauses' Z xs
114− where mkOk2Clauses' : Nat -> List (TTName, List Arg, Raw) -> Elab (List FunClause)
114+ where mkOk2Clauses' : Nat -> List (TTName, List CtorArg, Raw) -> Elab (List FunClause)
115115 mkOk2Clauses' k [] = return [!(mkAbsurdFinClause fn resTy size)]
116116 mkOk2Clauses' k (x :: xs) = do rest <- mkOk2Clauses' (S k) xs
117117 clause <- mkOk2Clause fn size k x
@@ -123,19 +123,19 @@ genToFin to from ok1 ok2 ty =
123123 do (MkDatatype famn tcargs tcres constrs) <- lookupDatatypeExact ty
124124 let size = length constrs
125125 argn <- gensym "arg"
126− declareType $ Declare to [Explicit argn NotErased (Var ty)]
126+ declareType $ Declare to [MkFunArg argn (Var ty) Explicit NotErased]
127127 `(Fin ~(quote size))
128128 toClauses <- mkToClauses to size constrs
129129 defineFunction $ DefineFun to toClauses
130130
131131 argn' <- gensym "arg"
132− declareType $ Declare from [Explicit argn' NotErased `(Fin ~(quote size))]
132+ declareType $ Declare from [MkFunArg argn' `(Fin ~(quote size)) Explicit NotErased ]
133133 (Var ty)
134134 fromClauses <- mkFromClauses from ty size constrs
135135 defineFunction $ DefineFun from fromClauses
136136
137137 argn'' <- gensym "arg"
138− declareType $ Declare ok1 [Explicit argn'' NotErased (Var ty)]
138+ declareType $ Declare ok1 [MkFunArg argn'' (Var ty) Explicit NotErased]
139139 `((=) {A=~(Var ty)} {B=~(Var ty)}
140140 ~(RApp (Var from) (RApp (Var to) (Var argn'')))
141141 ~(Var argn''))
@@ -148,7 +148,7 @@ genToFin to from ok1 ok2 ty =
148148 (\n => `((=) {A=~fty} {B=~fty}
149149 ~(RApp (Var to) (RApp (Var from) n))
150150 ~n))
151− declareType $ Declare ok2 [Explicit argn''' NotErased fty]
151+ declareType $ Declare ok2 [MkFunArg argn''' fty Explicit NotErased]
152152 (ok2ResTy (Var argn'''))
153153 ok2Clauses <- mkOk2Clauses ok2 size constrs ok2ResTy
154154 defineFunction $ DefineFun ok2 ok2Clauses
test/tactics001/Tactics.idr+1−1
@@ -33,7 +33,7 @@ plusSuccRightSuccNew (S j) k =
3333
3434mkDecl : ()
3535mkDecl = %runElab (do declareType $ Declare (NS (UN "repUnit") ["Tactics"])
36− [Implicit (UN "z") NotErased `(Nat)]
36+ [MkFunArg (UN "z") `(Nat) Implicit NotErased]
3737 `(Vect ~(Var (UN "z")) ())
3838 fill `(() : ())
3939 solve)