difficult profiling example

Serge D. Mechveliani mechvel at botik.ru
Sat Dec 2 10:27:50 EST 2006


Dear GHC developers, dear users,

I am starting to doubt in the GHC time profiling.
Why can advise, please, on the following example?

This is important for me: I need to find who eats time in this 
particular example.

This is for  ghc-6.6.
I `make' my large program (of many modules) via Cabal, with  -O -prof
and  -enable-profiling  included.

The  Main  module contains the test example  main.

`main'  calls for  LemmaSearch.searchLemmataInInitial.

`Main' is also built under  -prof  and run under  +RTS -p -RTS.

I set the cost centers  only  inside  LemmaSearch.hs.

And I set  {-# SCC ... #-}  in all valuable places in the module  
LemmaSearch.hs,  I skip only the places where a data field is 
extracted/set, or such. 

(I would like to set  -auto-all  for the module  LemmaSearch.hs  
only, but GHC does not accept the pragma {-# OPTIONS_GHC auto-all #-},
I wonder, why
).

The  .prof  file shows 

----------------------------------------
  ...
  COST CENTRE                    MODULE               %time %alloc
  searchLemmata                  LemmaSearch           91.9   93.2
  splitDisjunctScheme            LemmaSearch            3.9    3.0
  addEquationsWithReduction      LemmaSearch            3.7    3.3
                                                                          
                 individual    inherited
  COST CENTRE              MODULE                                           
  ...
----------------------------------------

searchLemmata  is the main loop inside  searchLemmataInInitial
               where everything happens, 
and   splitDisjunctScheme, addEquationsWithReduction
are called from this loop.
It looks correct that  searchLemmata  costs  90%.
I could believe that  splitDisjunctScheme and addEquationsWithReduction
take together about  8%  of what  searchLemma  costs.

But who  inside the  searchLemmata  loop  takes the rest of (90 - 8)%  ? 

I do not see this, because all other parts (about 15 of centers) are 
shown in profiling as close to zero %.

The centers for the imported functions are set before each their 
envocation in this module.
The centers for the functions from this module are set before their 
first defining statement, and they are all defined in the style of  
``f = ...'', with single equality at top.

I append below the module  LemmaSearch.hs  (with comments skipped)
and the  .prof  file.

(Does this 770 line letter damage the ghc-users list? 
I am sorry, if it does).

If the GHC team asks for the whole example source and provides me with 
a private address for this, then I would send the source archive of the 
project.

Thank you in advance for help,

-----------------
Serge Mechveliani
mechvel at botik.ru




--------------------------------------------------------------------
module LemmaSearch (searchLemmataInInitial)
where
import qualified Data.Set as Set ...
import qualified Data.Map as Map ...
import Char  (isDigit)
import List  (genericLength, nub, (\\), insertBy)
import Ratio (numerator, denominator)
import Dumatel.Prelude ...
...
import ...


root :: Natural -> Natural -> Natural
root    n       =  {-# SCC "root" #-}   fst . intRoot n
 
type ExtLemmataSearchState = 
                           ((LemmataSearchState, [Disjunct]),  Resource)

searchLemmataInInitial :: ProverOptions        ->         -- proverOpts
                          Resource             ->         -- rc
                          Resource             ->         -- rcPerLemma
                          PreferableOrOrdinary ->         -- pref
                          LemmataSearchState   ->         -- searchState
                          ExtLemmataSearchState

searchLemmataInInitial proverOpts rc rcPerLemma pref searchState =

  (let ((state', newProveds), rcRem) = 
                                   searchLemmata ((searchState, []), rc)
       cost = lsisCost searchState
   in
   ((state' {lsisCost = cost + rc - rcRem},  newProveds),  rcRem)
  )
  where
  message0 = 
    showString "\nsearchLemmataInInitial " . 
    showString "(skolParam, superpty, jump, lsearchParams)\n  " . 
    shows rc . showChar ' ' . shows rcPerLemma . showChar ' ' . 
    shows pref . showString " searchState,\n" .
    showString "lsisVariables = " . shows (lsisVariables searchState) . 
    showChar '\n' . 
    showString "lsisOperators =\n " . shows (map name ordOps) . 
    showChar '\n'

  (superpty, jump, umrBounds, lsearchParams) =
          (provOptSupty         proverOpts, provOptRdJump proverOpts,
           provOptUMRMemoBounds proverOpts, provOptLSIParams proverOpts
          )
  (_, mBounds, rKeyBound)  = umrBounds
  mrBounds                 = (mBounds, rKeyBound)
  rcForDisproof            = quot rcPerLemma 2
  rcForProof               = 0 
  calculusEquationsSize    = genericLength . equationList
  testRangePerVariable     = lsipTestRangePerVariable     lsearchParams
  depthBoundForGroundSubst = lsipDepthBoundForGroundSubst lsearchParams
  ordOps                   = lsisOperators searchState

  isFalseTerm t =  case t of VarT _  -> False
                             App o _ -> name o == "false"

  isTrivialFormula f = case f of VarT _  -> False
                                 App o _ -> 
                                   name o == "true" || name o == "false"

  addFormula :: Calculus -> Formula -> Calculus   
  addFormula    calc        f       =  

                {-# SCC "addFormula" #-}
                let memo = (Map.empty, Map.empty, Map.empty)
                in
                tuple41 $ addFormulae mrBounds memo jump calc 
                                      SkolemizeNot Ordinary superpty [f]

  allSorts = Map.keys $ snd $ sortIdTabs $ lsisCalculus searchState

  ----------------------------------------------------------------------
  searchLemmata  extState@ ((searchState, newProveds), rc) = 

    {-# SCC "searchLemmata" #-}
    let umMemo         = lsisUnifMatchMemo searchState
        (uMemo, mMemo) = umMemo
        store          = lsisStore searchState
        disproveds     = lsiDisproved        store
        passedCps      = lsiPassedCompletion store
        sMulty         = lsiMultiplicity     store
    in
    (case splitCs
     of
     [] -> extState

     (((calc', lastName, newVars, preeqs), dj, _), djCost) : splitCs' ->

       if rc < minRc  then  extState
       else
       case (findMatchEquivalentIn2tables mBounds (uMemo, mMemo) 
                      (opTab calc') (fst passedCps) (fst disproveds) dj,

             {-# SCC "opVarMulKind" #-}
             opVarMulKind dj,                               -- djOVKind

             {-# SCC "nonSchemeOpVarMultisets" #-}
             nonSchemeOpVarMultisets isSchemeOperator dj    -- djOVMS
            )
       of
       ((mMemo2, Just dj', searchCost1), _, _) ->

          let state' = searchState  
                       {lsisDSplits = splitCs',
                        lsisStore   = sStore 
                                        {lsiMultiplicity = succ sMulty},
                        lsisUnifMatchMemo = (uMemo, mMemo2)
                       }
              rc' = rc - djCost - searchCost1
          in
          searchLemmata ((state', newProveds), rc')

       ((mMemo2, _, searchCost1), djOVKind, djOVMS) ->

         case  findSchemeEquivalentTermIn2tables 
                         mrBounds (uMemo, mMemo2) isSchemeOperator calc'
                         (snd passedCps) (snd disproveds) dj djOVMS
         of
         (Just dj', searchCost2) ->

           let state' = searchState  
                        {lsisDSplits = splitCs',
                         lsisStore   = sStore 
                                        {lsiMultiplicity = succ sMulty},
                         lsisUnifMatchMemo = (uMemo, mMemo2)
                        }
               rc' = rc - djCost - searchCost1 - searchCost2
           in
           searchLemmata ((state', newProveds), rc')

         (_, searchCost2) ->

           let (matchRes, matchCost) = 
                 
                         {-# SCC "matchAnySubdisjunctSchemeInList" #-} 
                         matchAnySubdisjunctSchemeInList 
                         mrBounds (uMemo, mMemo2) isSchemeOperator calc'
                         (filter hasScheme disprovedsL) dj

               rc' = rc - djCost - searchCost1 - searchCost2 - matchCost
           in
           case matchRes
           of
           Just (dj', litSubset, _rCalc) -> 
             let 
               state' = 
                  searchState  
                  {lsisDSplits = splitCs',
                   lsisStore   = sStore {lsiMultiplicity = succ sMulty},
                   lsisUnifMatchMemo = (uMemo, mMemo2)}
             in
             searchLemmata ((state', newProveds), rc')

           _ ->
             case  {-# SCC "matchAnySubdisjunctInList" #-}
                   matchAnySubdisjunctInList mBounds (uMemo, mMemo2) 
                                            (opTab calc') disprovedsL dj
             of
             (mMemo3, Just (dj', subD, _), matchCost) ->
               let 
                 state' = 
                  searchState  
                  {lsisDSplits = splitCs',
                   lsisStore   = sStore {lsiMultiplicity = succ sMulty},
                   lsisUnifMatchMemo = (uMemo, mMemo3)}
               in
               searchLemmata ((state', newProveds), rc' - matchCost)

             (mMemo3, _,  matchCost) ->
               let 
                 (disprovedByTilde, ukbbRes, rcRem) =
                                -- {-# "disproveStatement" #-}
                                disproveStatement calc' rcForDisproof dj

                 rcAfterDispr = rc' - matchCost - rcForDisproof + rcRem
                 disprovedByCompl =  ukbbGoalRem ukbbRes == ([], []) 
                 (complEqs, _, complBTs) = ukbbCompl ukbbRes
                 calc'1            = calc'   
                 (calc'', addCost) = 

                   let umrMemo     = (uMemo, mMemo3, Map.empty) 
                       (_, cc, c1) =
                                 {-# SCC "addEquationsWithReduction" #-}
                                 addEquationsWithReduction 
                                   mrBounds umrMemo jump calc'1 complEqs
                   in
                   mapTuple22 (+ c1) $
                   {-# SCC "addBTLawsWithReduction" #-}
                   addBTLawsWithReduction mrBounds umrMemo 
                                          jump cc complBTs

                 calc''scTopOrNonSc = 
                                   setEquations calc''
                                   [e | e <- equationList calc'',
                                    not $ hasScheme e || isSchemeTopEq e
                                   ] []

                 (_, dj', djRdCost) = {-# SCC "reduceDisjunct" #-}
                                      reduceDisjunct mrBounds 
                                          (uMemo, mMemo, Map.empty) jump 
                                          calc''scTopOrNonSc dj

                 rcAfterRd   = rcAfterDispr - djRdCost - addCost 
                 djSchemeOps = Set.toList $ schemeOperators dj
               in
               if  disprovedByTilde 
               then   
                 let disps' = insertToMapListPair djOVKind djOVMS dj 
                                                              disproveds
                     state' =
                          searchState  
                          {lsisDSplits = splitCs',
                           lsisStore   = sStore {lsiDisproved = disps'},
                           lsisUnifMatchMemo = (uMemo, mMemo3)}
                 in
                 searchLemmata ((state', newProveds), rcAfterDispr)
               else
               if  disprovedByCompl 
               then
                 let disps' = insertToMapListPair djOVKind djOVMS dj
                                                              disproveds
                     state' = 
                       searchState  
                       {lsisDSplits       = splitCs',
                        lsisUnifMatchMemo = (uMemo, mMemo3),
                        lsisStore         = 
                                  sStore {lsiDisproved   = disps',
                                          lsiPassedTilde = 
                                            Set.insert dj passedTildes}}
                 in  
                 searchLemmata ((state', newProveds), rcAfterDispr)

               else
               if  (not $ null djSchemeOps)  &&  dj /= dj'  
               then
                 let
                   dj'sp = {-# SCC "dj'sp" #-}
                           (((calc'', lastName, newVars, preeqs), dj',
                              termSplitMeasure isSchemeOperator dj'), 0)

                   splitCs'' = {-# SCC "splitCs''" #-}
                               if  isTrivialFormula dj'  then  splitCs'
                               else
                               insertBy (\ (s, _) (s', _) ->  
                                         compareTermSplitsByMeasure s s'
                                        )
                                        dj'sp splitCs'
                   passedCps' = insertToMapListPair djOVKind djOVMS dj
                                                               passedCps
                   state' = 
                      searchState  
                      {lsisDSplits       = splitCs'',
                       lsisUnifMatchMemo = (uMemo, mMemo3),
                       lsisStore         = 
                         sStore 
                         {lsiPassedCompletion = passedCps',
                          lsiPassedTilde = Set.insert dj passedTildes,
                          lsiHasReduced  = Set.insert dj reduceds}    }     
                 in
                 searchLemmata ((state', newProveds), rcAfterRd)

               else
               if  not $ null djSchemeOps
               then
                 let 
                   (splitCs0, _splitStatistic) =
                              {-# SCC "splitDisjunctScheme" #-}
                              splitDisjunctScheme mrBounds umMemo ordOps 
                                     calc'' jump lastName dj djSchemeOps
                   splitCs'' = 
                     {-# SCC "splitCs''" #-}
                     map (\ ((osp, dis, meas), c) -> 
                            ((mapTuple44 (++ preeqs) osp, dis, meas), c)
                         ) $
                     filter (\ ((_, d, _), _) -> d /= dj) splitCs0

                   passedCps' = insertToMapListPair djOVKind djOVMS dj 
                                                               passedCps
                   state' = 
                     searchState  
                     {lsisUnifMatchMemo = (uMemo, mMemo3),
                      lsisDSplits       =
                              {-# SCC "lsisDSplits = ..mergeBy.." #-} 
                              mergeBy (\ (s, _) (s', _) -> 
                                         compareTermSplitsByMeasure s s'
                                      )
                                      splitCs' splitCs'',
                      lsisStore = 
                           sStore 
                           {lsiPassedCompletion = passedCps',
                            lsiPassedTilde = Set.insert dj passedTildes}}
                 in   
                 searchLemmata ((state', newProveds), rcAfterRd)

               else
               let 
                 lemParamsForProof = lsearchParams {lsipFactor   = 0,
                                                    lsipExponent = 0}
                 opts' = proverOpts 
                                  {provOptLSIParams = lemParamsForProof}
                 (proved, _, rcRem) =
                             proveStatementInInitial opts' rcForProof dj
                 rc' = rcAfterDispr - rcForProof + rcRem
               in
               if not proved 
               then
                 let passedCps' = insertToMapListPair djOVKind djOVMS dj 
                                                               passedCps
                     state' = 
                       searchState  
                       {lsisDSplits       = splitCs',
                        lsisUnifMatchMemo = (uMemo, mMemo3),
                        lsisStore         = 
                          sStore 
                          {lsiPassedCompletion = passedCps',
                           lsiPassedTilde  = Set.insert dj passedTildes}
                       }
                 in
                 searchLemmata ((state', newProveds), rc')
               else
               let
                 passedCps' = insertToMapListPair djOVKind djOVMS dj 
                                                               passedCps
                 state' = 
                   searchState  
                   {lsisDSplits       = map addStatement splitCs',
                    lsisUnifMatchMemo = (uMemo, mMemo3),
                    lsisStore         = 
                      sStore 
                      {lsiPassedTilde      = Set.insert dj passedTildes,
                       lsiPassedCompletion = passedCps',
                       lsiProved           = Set.insert dj proveds}  }

                 addStatement ((osp, d, m), c) = 

                    {-# SCC "addStatement" #-}
                    ((mapTuple41 (\ calc -> addF calc dj) osp, d, m), c)

                 addF calc = addFormula calc . closeFormula calc
               in
               searchLemmata ((state', dj : newProveds), rc')
    )
    where
    calc0      = lsisCalculus searchState
    sStore     = lsisStore    searchState
    splitCs    = lsisDSplits  searchState
    calc0ops   = operators calc0
    minRc      = calculusEquationsSize calc0
    isSchemeOperator f =
                    {-# SCC "isSchemeOperator" #-}
                    (not $ Set.member f calc0ops) && (isScName $ name f)

    isScName nm = case nm of 's': 'c': nm' -> all isDigit nm'
                             _             -> False

    schemeOperators :: WithOperatorSet a => a -> Set.Set Operator
    schemeOperators =  {-# SCC "schemeOperators" #-}
                       Set.filter isSchemeOperator . operators
 
    hasScheme :: WithOperatorSet a => a -> Bool
    hasScheme =  {-# SCC "hasScheme" #-}
                 not . Set.null . schemeOperators

    isSchemeTopEq e = 
                  {-# SCC "isSchemeTopEq" #-}
                  any isSTop [l, r]
                  where
                  (l, r)   = sides e
                  isSTop t = (not $ isVariable t) &&
                             (not $ Set.member (topOperator t) calc0ops)
 
    disproveds   = lsiDisproved        sStore
    passedTildes = lsiPassedTilde      sStore
    passedCps    = lsiPassedCompletion sStore
    reduceds     = lsiHasReduced       sStore
    proveds      = lsiProved           sStore
    disprovedsL  = 
                   {-# SCC "disprovedsL" #-}
                   concat $ Map.elems $ fst disproveds

    opsForSubst = {-# SCC "opsForSubst" #-}
                  (extraRelatedConstants calc0 ordOps) ++ ordOps
      where
      extraRelatedConstants calc ops = 
                       (concat $ map contantsOfSort relatedSorts) \\ ops
        where        
        calcConsts = filter isConstantOperator $ Set.toList $ 
                                                          operators calc
        relatedSorts     = Set.toList $ sUnion $ map sortageUnion ops
        contantsOfSort s = filter ((s ==) . coarity) calcConsts

      sortageUnion f = let ((lsorts, rsorts), cosort) = sortage f
                       in
                       Set.insert cosort $ 
                       sUnion [Set.fromList lsorts, Set.fromList rsorts]
    
    --------------------------------------------------------------------
    disproveStatement :: 
        Calculus -> Resource -> Disjunct -> (Bool, UKBBResult, Resource)

    disproveStatement calcExt rc dj =  

      {-# SCC "disproveStatement" #-}
      (if  disprovedByTilde  then
             (True, dummy "dummy complRes in disproveStatement",
                                                           rcAfterTilde)
       else  (False, ukbbRes, rcAfterCompl)
      )       
      where
      testingSubsts = groundSubstsForTest $ Set.toList $ vars dj

      (tildePairsPassed, tildePairsRest) = 

         let memo = (Map.empty, Map.empty, Map.empty)
         in
         span (not . isFalseTerm . fst)
            [(dj', c) | 
             sb <- testingSubsts,
             let (_, dj', c) = reduceDisjunct mrBounds memo jump calcExt
                               $ substitute sb dj]

      disprovedByTilde = not $ null tildePairsRest
      tildeCost        = succ $ sum $ map snd tildePairsPassed
      rcAfterTilde     = rc - tildeCost 
      rcCompl  = 0
      refutRes = 
             let uMtMemo = (Map.empty, Map.empty)
             in
             refuteFormulaSetByCompletion 
             TraceNot umrBounds uMtMemo jump (Fin rcCompl) (Fin rcCompl)
             0 SkolemizeNot Preferable superpty calcExt 
             [closeFormula calcExt dj]

      ukbbRes        = cpRefInitialCompletion refutRes  
      Fin complRcRem = cpRefRcRem             refutRes  
      rcAfterCompl   = rcAfterTilde - rcCompl + complRcRem

      groundSubstsForTest xs = 

        (if  null opsForSubst || null xs  then  [identitySubstitution]  
         else                       gsubsForTest xs testRangePerVariable
        )
        where
        varSorts   = nub $ map sort xs
        varDomains =
                   Map.fromList [(s, varDomain calc0 s) | s <- varSorts]

        gsubsForTest xs range =  case xs of    

          []  -> []
          [x] -> map (Map.singleton x) $
                 takeTermsFromTermsOfSort 
                 range depthBoundForGroundSubst 
                                              (varDomain calc0 $ sort x)
          x: ys -> 
             case  Map.lookup (sort x) varDomains
             of
             Nothing ->
                    error $ concat
                    ["\ndisproveStatement calcExt ", shows rc "\n  ", 
                     shows dj "\n...", 
                     "gsubsForTest ", shows xs " ", shows range 
                     "\n...Impossible happened:\n",
                     "Map.lookup (sort x) varDomains  failed for  x = ",
                     shows x ".\n"
                    ]
             Just vd ->
                 case  takeTermsFromTermsOfSort 
                       range depthBoundForGroundSubst vd
                 of
                 []   -> []  
                 vals -> [Map.insert x v sb | sb <- sbs', v <- vals]
                         where
                         cardVals = genericLength vals
                         sbs'     = gsubsForTest ys (2*range - cardVals)

        varDomain :: Calculus -> Sort -> TermsOfSort
        varDomain    calc        s    = 

          (case  Map.lookup s nts  of  Just v -> v
                                       _      -> Map.empty
          )
          where
          nts = 
             let umMemo = (Map.empty, Map.empty)
             in
             termSetUpToLevel (not . reducesAtTop mBounds umMemo calc) 
                       allSorts [] opsForGround depthBoundForGroundSubst

          opsForGround = sgens ++ (opsForSubst \\ sgens)
                                           -- move generators of s ahead
          sgens = concat $ sortGeneratorLists (sortGenTab calc) s 

    --------------------------------------------------------------------
    proveStatementInInitial :: 
       ProverOptions-> Resource-> Disjunct-> (Bool, Inference, Resource)

    proveStatementInInitial proverOpts rc dj =  

      {-# SCC "proveStatementInInitial" #-}
      (isProved $ psStateTree inferState, reduceInference inference,
                                                     rc - inferenceCost)
      where
      goal = Prove {goalCalculus = calc0,
                    goalFormula  = closeFormula calc0 dj,
                    goalMode     = InInitial
                   }
      state0 = proofSearchStateFromGoal umrBounds superpty jump rc goal
      p      = lsipExponent lsearchParams
      (n, m) = (numerator p, denominator p)

      rcPerStepInLemma = if p == 0 then 1 
                         else       
                         if p == 1 then  rc  else  (root m rc)^n

      inferenceBound = rc
      inference      = takeUpToBound inferenceBound $ 
                       prove proverOpts rcPerStepInLemma state0

      inferState    = last inference
      inferenceCost = rcPerStepInLemma * (genericLength inference)

      takeUpToBound :: Natural -> Inference -> Inference
      takeUpToBound    bound      inference =  tk 0 inference
        where
        tk _      []              = []
        tk volume (state: states) =
                if
                  volume > bound  then  []
                else              
                state : (tk (volume + (inferenceVolume [state])) states)


------------------------------------------------------------------------
insertToMapListPair ::                                          -- local
            (Ord key1, Ord key2) => 
            key1 -> key2 -> v -> (Map.Map key1 [v], Map.Map key2 [v]) ->
                                 (Map.Map key1 [v], Map.Map key2 [v])

insertToMapListPair key1 key2 v (map1, map2) = 
 
  {-# SCC "insertToMapListPair" #-}  
                    
  (Map.insertWith (++) key1 [v] map1, Map.insertWith (++) key2 [v] map2)


findMatchEquivalentIn2tables mBounds (uMemo, mMemo) otab tab1 tab2 dj = 
                                                                -- local
  {-# SCC "findMatchEquivalentIn2tables" #-}
  (case  find1 0 mMemo tab1
   of
   (mMemo', Nothing, cost) -> find1 cost mMemo' tab2
   triple                  -> triple
  )
  where
  ovKind               =  opVarMulKind dj
  find1 cost mMemo tab =  case  Map.lookup ovKind tab  of

            Nothing        -> (mMemo, Nothing, cost)
            Just listOfKey -> mapTuple33 (+ cost) $ 
                              findMatchEquivalent mBounds (uMemo, mMemo)
                                                  otab listOfKey dj

findSchemeEquivalentTermIn2tables                               -- local
    mrBounds umMemo isSchemeOperator calc tab1 tab2 t key =

  {-# SCC "findSchemeEquivalentTermIn2tables" #-}

  (case  find1 0 tab1  of (Nothing,  cost) -> find1 cost tab2
                          pair             -> pair
  )
  where
  find1 cost tab = case  Map.lookup key tab  
                   of
                   Nothing -> (Nothing, cost)
                   Just ts -> mapTuple22 (+ cost) $ 
                              findSchemeEquivalentTerm mrBounds umMemo
                                              isSchemeOperator calc ts t


--------------------------------------------------------------------------
	Sat Dec  2 17:18 2006 Time and Allocation Profiling Report  (Final)

	   LemSearchList +RTS -M200m -p -RTS

	total time  =      268.25 secs   (5365 ticks @ 50 ms)
	total alloc = 9,796,199,364 bytes  (excludes profiling overheads)

COST CENTRE                    MODULE               %time %alloc

searchLemmata                  LemmaSearch           91.9   93.2
splitDisjunctScheme            LemmaSearch            3.9    3.0
addEquationsWithReduction      LemmaSearch            3.7    3.3

                                                                                               individual    inherited
COST CENTRE              MODULE                                               no.    entries  %time %alloc   %time %alloc

MAIN                     MAIN                                                   1           0   0.0    0.0   100.0  100.0
 CAF                     Main                                                 280          66   0.0    0.0   100.0  100.0
  disprovedsL            LemmaSearch                                          295           1   0.0    0.0     0.0    0.0
  opsForSubst            LemmaSearch                                          290           1   0.0    0.0     0.0    0.0
  hasScheme              LemmaSearch                                          289           0   0.0    0.0     0.0    0.0
  isSchemeOperator       LemmaSearch                                          288           0   0.0    0.0     0.0    0.0
  addFormula             LemmaSearch                                          287           0   0.0    0.0     0.0    0.0
  searchLemmata          LemmaSearch                                          286        3143  91.9   93.2   100.0   99.9
   root                  LemmaSearch                                          315           8   0.0    0.0     0.0    0.0
   disprovedsL           LemmaSearch                                          314         303   0.0    0.0     0.0    0.0
   opVarMulKind          LemmaSearch                                          312         128   0.0    0.0     0.0    0.0
   opsForSubst           LemmaSearch                                          311         128   0.1    0.0     0.1    0.0
   isSchemeOperator      LemmaSearch                                          310       23738   0.0    0.0     0.0    0.0
   lsisDSplits = ..mergeBy.. LemmaSearch                                          309          89   0.0    0.0     0.0    0.0
   splitCs''             LemmaSearch                                          308         841   0.0    0.0     0.0    0.0
   splitDisjunctScheme   LemmaSearch                                          307          89   3.9    3.0     3.9    3.0
   isSchemeTopEq         LemmaSearch                                          306        2670   0.0    0.0     0.0    0.0
   hasScheme             LemmaSearch                                          303        7275   0.0    0.0     0.0    0.0
    schemeOperators      LemmaSearch                                          304        7275   0.0    0.0     0.0    0.0
     isSchemeOperator    LemmaSearch                                          305          82   0.0    0.0     0.0    0.0
   addBTLawsWithReduction LemmaSearch                                          302          89   0.0    0.0     0.0    0.0
   addEquationsWithReduction LemmaSearch                                          301          89   3.7    3.3     3.7    3.3
   schemeOperators       LemmaSearch                                          299          97   0.0    0.0     0.0    0.0
    isSchemeOperator     LemmaSearch                                          300           3   0.0    0.0     0.0    0.0
   reduceDisjunct        LemmaSearch                                          298         267   0.1    0.1     0.1    0.1
   disproveStatement     LemmaSearch                                          297         129   0.0    0.0     0.0    0.0
   matchAnySubdisjunctInList LemmaSearch                                          296         190   0.2    0.2     0.2    0.2
   matchAnySubdisjunctSchemeInList LemmaSearch                                          294         304   0.0    0.0     0.0    0.0
   findSchemeEquivalentTermIn2tables LemmaSearch                                          293         343   0.0    0.0     0.0    0.0
   nonSchemeOpVarMultisets LemmaSearch                                          292         343   0.0    0.0     0.0    0.0
    isSchemeOperator     LemmaSearch                                          313           3   0.0    0.0     0.0    0.0
   findMatchEquivalentIn2tables LemmaSearch                                          291         664   0.0    0.1     0.0    0.1
 CAF                     Text.Read.Lex                                        257          14   0.0    0.0     0.0    0.0
 CAF                     GHC.Real                                             254           1   0.0    0.0     0.0    0.0
 CAF                     GHC.Read                                             251           2   0.0    0.0     0.0    0.0
 CAF                     GHC.Handle                                           233           3   0.0    0.0     0.0    0.0
 CAF                     BTerm0                                               192           1   0.0    0.0     0.0    0.0
 CAF                     Unify                                                191           5   0.0    0.0     0.0    0.0
 CAF                     Parse1                                               190           4   0.0    0.0     0.0    0.0
 CAF                     Prelude4                                             189           5   0.0    0.0     0.0    0.0
 CAF                     Prelude3_1                                           188           7   0.0    0.0     0.0    0.0
 CAF                     Prelude3_0                                           187           2   0.0    0.0     0.0    0.0
 CAF                     Prelude3                                             186           8   0.0    0.0     0.0    0.0
 CAF                     Prelude2_0                                           185           6   0.0    0.0     0.0    0.0
 CAF                     Prelude2                                             184           1   0.0    0.0     0.0    0.0
 CAF                     Prelude1                                             183           2   0.0    0.0     0.0    0.0
 CAF                     Prelude00                                            168           1   0.0    0.0     0.0    0.0
 CAF                     Dumatel.Reduce                                       166           1   0.0    0.0     0.0    0.0
 CAF                     Split                                                165           7   0.0    0.0     0.0    0.0
 CAF                     Bool0                                                163          55   0.0    0.0     0.0    0.0
 CAF                     Parse2                                               162           5   0.0    0.0     0.0    0.0
 CAF                     LemmaSearch                                          156           1   0.0    0.0     0.0    0.0
 CAF                     Prover1                                              154           1   0.0    0.0     0.0    0.0
 CAF                     Prover00                                             153           6   0.0    0.0     0.0    0.0
 CAF                     Dumatel.Prelude5                                     152           1   0.0    0.0     0.0    0.0
 CAF                     Dumatel.BTerm                                        151           2   0.0    0.0     0.0    0.0
 CAF                     UKBB0                                                147           1   0.0    0.0     0.0    0.0


More information about the Glasgow-haskell-users mailing list