1
{-# OPTIONS -fglasgow-exts -XUndecidableInstances #-}
3
module Agda.Auto.SearchControl where
7
import Control.Monad.State
9
import Agda.Auto.NarrowingSearch
10
import Agda.Auto.Syntax
11
import Agda.Auto.Print
14
instance Refinable (ArgList o) (RefInfo o) where
15
refinements _ _ = return [
20
where cons hid = do p1 <- newPlaceholder
22
return $ ALCons hid p1 p2
23
printref x = pargs [] (NotM x)
26
getinfo [] (Just x) us = (x, us)
27
getinfo (x@(RIMainInfo _ _) : xs) Nothing us = getinfo xs (Just x) us
28
getinfo (x@(RIUnifInfo _ _ _) : xs) m us = getinfo xs m (x : us)
29
getinfo _ _ _ = error "getinfo: case should not occur"
31
instance Refinable (Exp o) (RefInfo o) where
32
refinements envinfo infos = do
33
let RIEnv hints = envinfo
34
(RIMainInfo n tt, unis) = getinfo infos Nothing []
35
occs <- mapM (\(RIUnifInfo mm _ opphne) -> occursCheck mm opphne) unis
37
HNApp (Const c) _ -> do
39
return $ case cdcont cd of
47
do p <- newPlaceholder
48
return $ Lam hid (Abs NoId p)
50
apps = map app [0..n - 1]
52
[] -> map capp (hints ++ cons)
54
app v = (if up then 0 else 1,
55
do p <- newPlaceholder
56
return $ App (Var v) p
58
capp c = (if up then 0 else 2,
59
do p <- newPlaceholder
60
return $ App (Const c) p
62
set l = map (\l -> (0, return $ Sort (SortLevel l))) [0 .. l - 1]
64
do p1 <- newPlaceholder
66
return $ Fun hid p1 p2)
68
do p1 <- newPlaceholder
70
return $ Pi hid True p1 (Abs NoId p2))
73
(RIUnifInfo _ cl hnopp : _) -> case hnopp of
74
HNApp (Const c) _ -> [capp c]
76
_ -> error "refinements: mimic: not matched"
78
HNFun hid _ _ -> return $ lam hid : apps ++ capps ++ mimic
79
HNPi hid _ _ _ -> return $ lam hid : apps ++ capps ++ mimic
80
HNSort (SortLevel l) -> return $ set l ++ [fun NotHidden, fun Hidden, pi NotHidden, pi Hidden] ++ apps ++ capps ++ mimic
81
_ -> return $ apps ++ capps ++ mimic
82
printref x = printExp [] (NotM x)
84
-- ---------------------------------
86
occursCheck :: forall a o . Metavar a (RefInfo o) -> HNExp o -> IO Bool
87
occursCheck m0 hn = liftM snd $ runStateT (
88
let f :: forall b . Trav b (RefInfo o) => MM b (RefInfo o) -> StateT Bool IO ()
89
f (NotM x) = traverse f x
91
bind <- lift $ readIORef $ mbind m
93
Just x -> traverse f x
94
Nothing -> when (hequalMetavar m m0) $ put True
99
-- ---------------------------------
101
prioNo, prioTypeUnknown, prioTypecheckArgList, prioInferredTypeUnknown, prioPreCompare, prioCompare, prioCompareArgList, prioCompIota, prioCompChoice :: Int
104
prioTypecheck False = 1
105
prioTypecheck True = 0
106
prioTypecheckArgList = 3
107
prioInferredTypeUnknown = 4
111
prioCompareArgList = 2
114
-- ---------------------------------
116
instance Trav a blk => Trav [a] blk where
117
traverse _ [] = return ()
118
traverse f (x:xs) = traverse f x >> traverse f xs
120
instance Trav (MId, CExp o) (RefInfo o) where
121
traverse f (_, ce) = traverse f ce
123
instance Trav a (RefInfo o) => Trav (Clos a o) (RefInfo o) where
124
traverse f (Clos cl e) = traverse f cl >> traverse f e
126
instance Trav (CAction o) (RefInfo o) where
127
traverse f (Sub ce) = traverse f ce
128
traverse _ Skip = return ()
129
traverse _ (Weak _) = return ()
131
instance Trav (Exp o) (RefInfo o) where
132
traverse f e = case e of
133
App _ args -> traverse f args
134
Lam _ (Abs _ b) -> traverse f b
135
Fun _ it ot -> traverse f it >> traverse f ot
136
Pi _ _ it (Abs _ ot) -> traverse f it >> traverse f ot
139
instance Trav (ArgList o) (RefInfo o) where
140
traverse _ ALNil = return ()
141
traverse f (ALCons _ arg args) = traverse f arg >> traverse f args
142
traverse f (ALConPar args) = traverse f args
144
instance Trav (HNExp o) (RefInfo o) where
145
traverse f e = case e of
146
HNApp _ args -> traverse f args
147
HNLam (Abs _ b) -> traverse f b
148
HNFun _ it ot -> traverse f it >> traverse f ot
149
HNPi _ _ it (Abs _ ot) -> traverse f it >> traverse f ot
150
HNSort _ -> return ()
152
instance Trav (CArgList o) (RefInfo o) where
153
traverse _ CALNil = return ()
154
traverse f (CALConcat arg args) = traverse f arg >> traverse f args