on master help sign in
Improved type-directed name disambiguation
commit1a87674afb3c4820294776dfee960d96510697c2 authorEdwin Brady <ecb10@st-andrews.ac.uk> dateSun 17 Mar 2013, 22:41 (14 years ago) parent5593697
7 files changed+56−17
CHANGELOG+6 src/Core/Elaborate.hs+25−16 src/Core/Unify.hs+10 test/reg014/expected test/reg014/reg014.idr+12 test/reg014/run+3 test/test020/test020a.idr−1
CHANGELOG+6
@@ -5,6 +5,12 @@ User visible changes:
55
66* Renamed EFF to EFFECT in Effect package
77* Experimental Java backend
8+* Tab completion in REPL
9+
10+Internal changes:
11+
12+* Improved name disambiguation
13+* Various unification and totality checking bug fixes
814
915New in 0.9.7:
1016-------------
src/Core/Elaborate.hs+25−16
@@ -516,9 +516,9 @@ try' :: Elab' aux a -> Elab' aux a -> Bool -> Elab' aux a
516516try' t1 t2 proofSearch
517517 = do s <- get
518518 ps <- get_probs
519− case prunStateT ps t1 s of
520− OK (v, s') -> do put s'
521− return v
519+ case prunStateT 999999 False ps t1 s of
520+ OK ((v, _), s') -> do put s'
521+ return v
522522 Error e1 -> if recoverableErr e1 then
523523 do case runStateT t2 s of
524524 OK (v, s') -> do put s'; return v
@@ -539,42 +539,51 @@ tryWhen False a b = a
539539
540540-- Try a selection of tactics. Exactly one must work, all others must fail
541541tryAll :: [(Elab' aux a, String)] -> Elab' aux a
542−tryAll xs = tryAll' [] (cantResolve, 0) (map fst xs)
542+tryAll xs = tryAll' [] 999999 (cantResolve, 0) (map fst xs)
543543 where
544544 cantResolve :: Elab' aux a
545545 cantResolve = lift $ tfail $ CantResolveAlts (map snd xs)
546546
547547 tryAll' :: [Elab' aux a] -> -- successes
548+ Int -> -- most problems
548549 (Elab' aux a, Int) -> -- smallest failure
549550 [Elab' aux a] -> -- still to try
550551 Elab' aux a
551− tryAll' [res] _ [] = res
552− tryAll' (_:_) _ [] = cantResolve
553− tryAll' [] (f, _) [] = f
554− tryAll' cs f (x:xs)
552+ tryAll' [res] pmax _ [] = res
553+ tryAll' (_:_) pmax _ [] = cantResolve
554+ tryAll' [] pmax (f, _) [] = f
555+ tryAll' cs pmax f (x:xs)
555556 = do s <- get
556557 ps <- get_probs
557− case prunStateT ps x s of
558− OK (v, s') -> tryAll' ((do put s'
559− return v):cs) f xs
558+ case prunStateT pmax True ps x s of
559+ OK ((v, newps), s') ->
560+ do let cs' = if (newps < pmax)
561+ then [do put s'; return v]
562+ else (do put s'; return v) : cs
563+ tryAll' cs' newps f xs
560564 Error err -> do put s
561565 if (score err) < 100
562− then tryAll' cs (better err f) xs
563− else tryAll' [] (better err f) xs -- give up
566+ then tryAll' cs pmax (better err f) xs
567+ else tryAll' [] pmax (better err f) xs -- give up
564568
565569
566570 better err (f, i) = let s = score err in
567571 if (s >= i) then (lift (tfail err), s)
568572 else (f, i)
569573
570−prunStateT ps x s
574+prunStateT pmax zok ps x s
571575 = case runStateT x s of
572576 OK (v, s'@(ES (p, _) _ _)) ->
573− if (length (problems p) > length ps)
577+ let newps = length (problems p) - length ps
578+ newpmax = if newps < 0 then 0 else newps in
579+ if (newpmax > pmax || (not zok && newps > 0)) -- length ps == 0 && newpmax > 0))
574580 then case reverse (problems p) of
575581 ((_,_,_,e):_) -> Error e
576− else OK (v, s')
582+ else OK ((v, newpmax), s')
577583 Error e -> Error e
578584
585+qshow :: Fails -> String
586+qshow fs = show (map (\ (x, y, _, _) -> (x, y)) fs)
587+
579588dumpprobs [] = ""
580589dumpprobs ((_,_,_,e):es) = show e ++ "\n" ++ dumpprobs es
src/Core/Unify.hs+10
@@ -95,6 +95,10 @@ unify ctxt env topx topy dont holes =
9595 = unifyFail topx topy
9696 un' fn names topx@(P (TCon _ _) x _) topy@(P (DCon _ _) y _)
9797 = unifyFail topx topy
98+ un' fn names topx@(Constant _) topy@(P (TCon _ _) y _)
99+ = unifyFail topx topy
100+ un' fn names topx@(P (TCon _ _) x _) topy@(Constant _)
101+ = unifyFail topx topy
98102 un' fn bnames tx@(P _ x _) ty@(P _ y _)
99103 | (x,y) `elem` bnames || x == y = do sc 1; return []
100104 | injective tx && not (holeIn env y || y `elem` holes)
@@ -310,8 +314,14 @@ unify ctxt env topx topy dont holes =
310314 recoverable (P (TCon _ _) x _) (P (TCon _ _) y _)
311315 | x == y = True
312316 | otherwise = False
317+ recoverable (Constant _) (P (DCon _ _) y _) = False
318+ recoverable (P (DCon _ _) x _) (Constant _) = False
319+ recoverable (Constant _) (P (TCon _ _) y _) = False
320+ recoverable (P (TCon _ _) x _) (Constant _) = False
313321 recoverable (P (DCon _ _) x _) (P (TCon _ _) y _) = False
314322 recoverable (P (TCon _ _) x _) (P (DCon _ _) y _) = False
323+ recoverable p@(Constant _) (App f a) = recoverable p f
324+ recoverable (App f a) p@(Constant _) = recoverable f p
315325 recoverable p@(P _ n _) (App f a) = recoverable p f
316326-- recoverable (App f a) p@(P _ _ _) = recoverable f p
317327 recoverable (App f a) (App f' a')
test/reg014/expectednew file

No changes to the content.

test/reg014/reg014.idrnew file+12
@@ -0,0 +1,12 @@
1+module reg014
2+
3+Matrix : Type -> Nat -> Nat -> Type
4+Matrix a n m = Vect (Vect a m) n
5+
6+transpose : Matrix a (S n) (S m) -> Matrix a (S m) (S n)
7+transpose ((x:: []) :: []) = [[x]]
8+transpose [x :: y :: xs] = [x] :: (transpose [y :: xs])
9+transpose (x :: y :: xs)
10+ = let tx = transpose [x] in
11+ let ux = transpose (y :: xs) in zipWith (++) tx ux
12+
test/reg014/runnew file+3
@@ -0,0 +1,3 @@
1+#!/bin/bash
2+idris $@ reg014.idr --check
3+rm -f *.ibc
test/test020/test020a.idr−1
@@ -16,4 +16,3 @@ foo xs = reverse xs
1616main : IO ()
1717main = print (foo [1,2,3])
1818
19−