Add searchNames

Can now search for expressions by trying constructors
This commit is contained in:
Edwin Brady 2019-05-04 19:19:22 +01:00
parent bfe78baf07
commit 87eeb200ce
2 changed files with 128 additions and 14 deletions

View File

@ -86,6 +86,53 @@ searchIfHole fc defaults (S depth) def top env locs arg
| _ => throw (CantSolveGoal fc env top) | _ => throw (CantSolveGoal fc env top)
pure () pure ()
successful : {auto c : Ref Ctxt Defs} ->
{auto u : Ref UST UState} ->
List (Core (NF vars)) ->
Core (List (Either Error (NF vars, Defs, UState)))
successful [] = pure []
successful (elab :: elabs)
= do ust <- get UST
defs <- branch
catch (do -- Run the elaborator
res <- elab
-- Record post-elaborator state
ust' <- get UST
defs' <- get Ctxt
-- Reset to previous state and try the rest
put UST ust
put Ctxt defs
elabs' <- successful elabs
-- Record success, and the state we ended at
pure (Right (res, defs', ust') :: elabs'))
(\err => do put UST ust
put Ctxt defs
elabs' <- successful elabs
pure (Left err :: elabs'))
exactlyOne : {auto c : Ref Ctxt Defs} ->
{auto u : Ref UST UState} ->
FC -> Env Term vars -> (topTy : Term vars) ->
List (Core (NF vars)) ->
Core (NF vars)
exactlyOne fc env top [elab]
= catch elab
(\err => case err of
CantSolveGoal _ _ _ => throw err
_ => throw (CantSolveGoal fc env top))
exactlyOne fc env top all
= do elabs <- successful all
case rights elabs of
[(res, defs, ust)] =>
do put UST ust
put Ctxt defs
commit
pure res
[] => throw (CantSolveGoal fc env top)
rs => do defs <- get Ctxt
empty <- clearDefs defs
rs' <- traverse (Normalise.quote empty env) (map fst rs)
throw (AmbiguousSearch fc env rs')
searchLocal : {auto c : Ref Ctxt Defs} -> searchLocal : {auto c : Ref Ctxt Defs} ->
{auto u : Ref UST UState} -> {auto u : Ref UST UState} ->
@ -109,13 +156,57 @@ searchLocal fc rigc defaults depth def top env locs ((ty, c) :: rest) target
nf defs env candidate) nf defs env candidate)
(searchLocal fc rigc defaults depth def top env locs rest target) (searchLocal fc rigc defaults depth def top env locs rest target)
searchName : {auto c : Ref Ctxt Defs} ->
{auto u : Ref UST UState} ->
FC -> RigCount ->
(defaults : Bool) -> (depth : Nat) ->
(defining : Name) -> (topTy : Term vars) ->
Env Term vars -> SearchEnv vars -> (target : NF vars) ->
(Name, GlobalDef) ->
Core (NF vars)
searchName fc rigc defaults depth def top env locs target (n, ndef)
= do defs <- get Ctxt
let ty = type ndef
let namety : NameType
= case definition ndef of
DCon tag arity => DataCon tag arity
TCon tag arity _ _ _ _ => TyCon tag arity
_ => Func
nty <- nf defs env (embed ty)
(args, appTy) <- mkArgs fc rigc env nty
ures <- unify InTerm fc env target appTy
let [] = constraints ures
| _ => throw (CantSolveGoal fc env top)
let candidate = applyInfo fc (Ref fc namety n)
(map (\i => (appInf i, metaApp i)) args)
traverse (searchIfHole fc defaults depth def top env locs) args
defs <- get Ctxt
nf defs env candidate
searchNames : {auto c : Ref Ctxt Defs} -> searchNames : {auto c : Ref Ctxt Defs} ->
{auto u : Ref UST UState} -> {auto u : Ref UST UState} ->
FC -> RigCount -> FC -> RigCount ->
(defaults : Bool) -> (depth : Nat) -> (defaults : Bool) -> (depth : Nat) ->
(defining : Name) -> (topTy : Term vars) -> (defining : Name) -> (topTy : Term vars) ->
Env Term vars -> List Name -> Env Term vars -> SearchEnv vars -> List Name ->
(target : NF vars) -> Core (NF vars) (target : NF vars) -> Core (NF vars)
searchNames fc rigc defaults depth defining topty env locs [] target
= throw (CantSolveGoal fc env topty)
searchNames fc rigc defaults depth defining topty env locs (n :: ns) target
= do defs <- get Ctxt
visnsm <- traverse (visible (gamma defs) (currentNS defs)) (n :: ns)
let visns = mapMaybe id visnsm
exactlyOne fc env topty
(map (searchName fc rigc defaults depth defining topty env locs target) visns)
where
visible : Context GlobalDef ->
List String -> Name -> Core (Maybe (Name, GlobalDef))
visible gam nspace n
= do Just def <- lookupCtxtExact n gam
| Nothing => pure Nothing
if visibleIn nspace n (visibility def)
then pure $ Just (n, def)
else pure $ Nothing
-- Declared at the top -- Declared at the top
searchType fc rigc defaults depth def top env locs (NBind nfc x (Pi c p ty) sc) searchType fc rigc defaults depth def top env locs (NBind nfc x (Pi c p ty) sc)
@ -137,7 +228,7 @@ searchType {vars} fc rigc defaults depth def top env locs target@(NTCon tfc tyn
tryGroups [] = throw (CantSolveGoal fc env top) tryGroups [] = throw (CantSolveGoal fc env top)
tryGroups (g :: gs) tryGroups (g :: gs)
= handleUnify = handleUnify
(searchNames fc rigc defaults depth def top env g target) (searchNames fc rigc defaults depth def top env locs g target)
(\err => if ambig err || isNil gs (\err => if ambig err || isNil gs
then throw err then throw err
else tryGroups gs) else tryGroups gs)

View File

@ -572,6 +572,16 @@ export
lookupTyName : Name -> Context GlobalDef -> Core (List (Name, Int, ClosedTerm)) lookupTyName : Name -> Context GlobalDef -> Core (List (Name, Int, ClosedTerm))
lookupTyName = lookupNameBy type lookupTyName = lookupNameBy type
-- private names are only visible in this namespace if their namespace
-- is the current namespace (or an outer one)
-- that is: given that most recent namespace is first in the list,
-- the namespace of 'n' is a suffix of nspace
export
visibleIn : (nspace : List String) -> Name -> Visibility -> Bool
visibleIn nspace (NS ns n) Private = isSuffixOf ns nspace
-- Public and Export names are always visible
visibleIn nspace n _ = True
export export
setFlag : {auto c : Ref Ctxt Defs} -> setFlag : {auto c : Ref Ctxt Defs} ->
FC -> Name -> DefFlag -> Core () FC -> Name -> DefFlag -> Core ()
@ -688,8 +698,14 @@ setDetermining fc tyn args
export export
addHintFor : {auto c : Ref Ctxt Defs} -> addHintFor : {auto c : Ref Ctxt Defs} ->
FC -> Name -> Name -> Bool -> Core () FC -> Name -> Name -> Bool -> Core ()
addHintFor fc tyn hintn direct addHintFor fc tyn hintn_in direct
= do defs <- get Ctxt = do defs <- get Ctxt
let hintn : Name
= case hintn_in of
Resolved i => hintn_in
_ => case getNameID hintn_in (gamma defs) of
Nothing => hintn_in
Just idx => Resolved idx
Just (TCon t a ps dets cons hs) <- lookupDefExact tyn (gamma defs) Just (TCon t a ps dets cons hs) <- lookupDefExact tyn (gamma defs)
| _ => throw (GenericMsg fc (show tyn ++ " is not a type constructor")) | _ => throw (GenericMsg fc (show tyn ++ " is not a type constructor"))
updateDef tyn (const (Just (TCon t a ps dets cons ((hintn, direct) :: hs)))) updateDef tyn (const (Just (TCon t a ps dets cons ((hintn, direct) :: hs))))
@ -697,15 +713,27 @@ addHintFor fc tyn hintn direct
export export
addGlobalHint : {auto c : Ref Ctxt Defs} -> addGlobalHint : {auto c : Ref Ctxt Defs} ->
Name -> Bool -> Core () Name -> Bool -> Core ()
addGlobalHint hint isdef addGlobalHint hintn_in isdef
= do d <- get Ctxt = do defs <- get Ctxt
put Ctxt (record { autoHints $= insert hint isdef } d) let hintn : Name
= case hintn_in of
Resolved i => hintn_in
_ => case getNameID hintn_in (gamma defs) of
Nothing => hintn_in
Just idx => Resolved idx
put Ctxt (record { autoHints $= insert hintn isdef } defs)
export export
addOpenHint : {auto c : Ref Ctxt Defs} -> Name -> Core () addOpenHint : {auto c : Ref Ctxt Defs} -> Name -> Core ()
addOpenHint hint addOpenHint hintn_in
= do d <- get Ctxt = do defs <- get Ctxt
put Ctxt (record { openHints $= insert hint () } d) let hintn : Name
= case hintn_in of
Resolved i => hintn_in
_ => case getNameID hintn_in (gamma defs) of
Nothing => hintn_in
Just idx => Resolved idx
put Ctxt (record { openHints $= insert hintn () } defs)
-- Set the default namespace for new definitions -- Set the default namespace for new definitions
export export
@ -816,11 +844,6 @@ toFullNames tm
= do Just gdef <- lookupCtxtExact (Resolved i) gam = do Just gdef <- lookupCtxtExact (Resolved i) gam
| Nothing => pure (Ref fc x (Resolved i)) | Nothing => pure (Ref fc x (Resolved i))
pure (Ref fc x (fullname gdef)) pure (Ref fc x (fullname gdef))
-- = do let a = content gam
-- arr <- get Arr
-- Just gdef <- coreLift (readArray arr i)
-- | Nothing => pure (Ref fc x (Resolved i))
-- pure (Ref fc x (fullname gdef))
full gam (Meta fc x y xs) full gam (Meta fc x y xs)
= pure (Meta fc x y !(traverse (full gam) xs)) = pure (Meta fc x y !(traverse (full gam) xs))
full gam (Bind fc x b scope) full gam (Bind fc x b scope)