[commit: ghc] type-nats: Improvements to use of ordering model (and remove traces). (c811cef)

Iavor Diatchki <[email protected]>
Newsgroups gmane.comp.lang.haskell.cvs.ghc
Message-ID <[email protected]>
Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : type-nats

http://hackage.haskell.org/trac/ghc/changeset/c811cef219a90b51ebe0d808606d587bd844fbda

>---------------------------------------------------------------

commit c811cef219a90b51ebe0d808606d587bd844fbda
Author: Iavor S. Diatchki <[email protected]>
Date:   Thu Sep 6 19:43:00 2012 -0700

    Improvements to use of ordering model (and remove traces).

>---------------------------------------------------------------

 compiler/typecheck/TcTypeNats.hs |   64 +++++++++++++++++++++++++++++---------
 1 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/compiler/typecheck/TcTypeNats.hs b/compiler/typecheck/TcTypeNats.hs
index fd253a6..d4531c2 100644
--- a/compiler/typecheck/TcTypeNats.hs
+++ b/compiler/typecheck/TcTypeNats.hs
@@ -10,8 +10,9 @@ import PrelNames( typeNatAddTyFamName
 import Outputable ( ppr, pprWithCommas
                   , Outputable
                   , SDoc
-                  , (<>), (<+>), colon, text, vcat, parens, braces
-                  , showSDoc
+                  , (<>), (<+>), text, vcat, parens
+                  -- , showSDoc
+                  , hsep
                   )
 import SrcLoc   ( noSrcSpan )
 import Var      ( TyVar )
@@ -29,6 +30,7 @@ import TysWiredIn ( typeNatAddTyCon
                   )
 import Bag      ( bagToList )
 import Panic    ( panic )
+import Pair     (Pair(..))
 
 -- From type checker
 import TcTypeNatsRules( bRules, impRules, widenRules
@@ -51,6 +53,7 @@ import TcEvidence ( EvTerm(..)
                   , evTermCoercion
                   , TcCoercion(TcTypeNatCo)
                   , mkTcSymCo, mkTcTransCo
+                  , tcCoercionKind
                   )
 import TcSMonad ( TcS, emitFrozenError, setEvBind
                 , InertSet
@@ -69,12 +72,14 @@ import Control.Monad ( msum, guard, when )
 import qualified Data.Set as S
 import qualified Data.Map as M
 
+{-
 -- Just fore debugging
 import Debug.Trace
 import DynFlags ( tracingDynFlags )
 
 ppsh :: SDoc -> String
 ppsh = showSDoc tracingDynFlags
+-}
 
 --------------------------------------------------------------------------------
 
@@ -423,6 +428,19 @@ data ActiveRule = AR
 
   }
 
+instance Outputable ActiveRule where
+  ppr r = args <+> text "=>" <+> eq (concl r)
+
+    where eq (x,y) = ppr x <+> text "~" <+> ppr y
+          todo (n, e) = (n, text"?:" <+> eq e)
+          done (n, ev) = let Pair x y = tcCoercionKind (evTermCoercion ev)
+                         in (n, text "!:" <+> eq (x,y))
+
+          args = hsep
+               $ map snd
+               $ sortBy (comparing fst)
+               $ map todo (todoArgs r) ++ map done (doneArgs r)
+
 {- Note [Symmetric Rules]
 
 For symmetric rules, we look for at most one argument that can be
@@ -436,6 +454,7 @@ one because we would just end up with another way to prove the same thing.
 
 -}
 
+{-
 instance Outputable ActiveRule where
   ppr r =
     braces (pprWithCommas ppr (doneTys r)) <+>
@@ -444,7 +463,7 @@ instance Outputable ActiveRule where
     where
     ppArg (x,e) = ppr x <> colon <+> ppr e
     ppEq (a,b)  = ppr a <+> text "~" <+> ppr b
-
+-}
 
 
 
@@ -522,15 +541,14 @@ by proofs for them.
 -}
 fireRule :: LeqFacts -> ActiveRule -> Maybe RuleResult
 fireRule leq r =
-  trace "Trying to fire rule -------------------" $
   do doneSides <- mapM solveSide $ todoArgs r
 
-     ts        <- trace "done with sides" $ mapM cvt (doneTys r)
+     ts        <- mapM cvt (doneTys r)
      (lhs,rhs) <- cvt2 (concl r)
      guard $ not $ eqType lhs rhs   -- Not interested in trivial results.
 
 
-     trace ("fired, concluding: " ++ ppsh (ppr lhs) ++ " ~ " ++ ppsh (ppr rhs)) $return RuleResult
+     return RuleResult
        { conclusion = (lhs,rhs)
        , evidence = \_ -> proof r ts $ map snd $ sortBy (comparing fst)
                                      $ doneSides ++ doneArgs r
@@ -545,13 +563,10 @@ fireRule leq r =
   cvt _           = Nothing
 
 
-  solveSide (n, eq@(a,b)) = trace (unwords [ "TRYING SIDE:", ppsh (ppr a), ppsh (ppr b)]) $
-    do (t1,t2) <- cvt2 eq
-       trace "cvt2" $ guard (eqType t2 trueTy)
-       (tc,[x,y]) <- splitTyConApp_maybe t1
-       trace "equals True" $ guard (tyConName tc == typeNatLeqTyFamName)
-       ev <- trace "is leq" $ isLeq leq x y
-       trace "found proof" $ return (n, ev)
+  solveSide (n, eq) =
+    do (x,y) <- isLeqEqn =<< cvt2 eq
+       ev    <- isLeq leq x y
+       return (n, ev)
 
 
 eqnToCt :: Eqn -> Maybe EvTerm -> Ct
@@ -708,14 +723,25 @@ The first set of constraints are ones that indicate a contradiction
 The second set are "good" constraints (not obviously contradicting each other).
 -}
 interactCt :: Bool -> Ct -> [Ct] -> ([Ct],[Ct])
-interactCt withEv ct asmps0 =
+interactCt withEv ct asmps0
+  | Just _ <- isLeqCt ct =
+  let active  = map activate impRules
+      -- XXX: We only really need to consider impRules that have
+      -- a side condition.
+
+      (leq, asmps) = makeLeqModel (ct : asmps0)
+      newWork = interactActiveRules leq active asmps
+  in partition isBad $ if withEv then map ruleResultToGiven newWork
+                                 else map ruleResultToDerived newWork
+
+  | otherwise =
   let active  = concatMap (`applyAsmp` ct)
               $ funRule typeNatAddTyCon
               : funRule typeNatMulTyCon
               : funRule typeNatExpTyCon
               : map activate (widen ++ impRules)
 
-      (leq, asmps) = makeLeqModel (ct : asmps0)
+      (leq, asmps) = makeLeqModel asmps0
       newWork = interactActiveRules leq active asmps
   in partition isBad $ if withEv then map ruleResultToGiven newWork
                                  else map ruleResultToDerived newWork
@@ -1028,6 +1054,14 @@ isLeqCt (CFunEqCan { cc_fun = tc, cc_tyargs = [t1,t2], cc_rhs = t })
   | tyConName tc == typeNatLeqTyFamName && eqType t trueTy = Just (t1,t2)
 isLeqCt _ = Nothing
 
+isLeqEqn :: Eqn -> Maybe (Type,Type)
+isLeqEqn (t1,t2) =
+  do guard (eqType t2 trueTy)
+     (tc,[x,y]) <- splitTyConApp_maybe t1
+     guard (tyConName tc == typeNatLeqTyFamName)
+     return (x,y)
+
+
 -- | Get the evidence associated with a constraint, if any.
 ctEvTermMaybe :: Ct -> Maybe EvTerm
 ctEvTermMaybe ct =
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.