[Обновлять]
Поэтому я изменил свой код, чтобы сделать его более читаемым. У функции dpfsSat два аргумента, klauselMenge — это огромный набор с элементами из X. Во время рекурсии klauselMenge должен сокращаться через какие-то функции.
import qualified Data.IntSet as Set
import qualified Data.IntMap as IntMap
import qualified Data.Vector as V
data X
= Xin !(Int,(Set.IntSet)) deriving (Eq,Show,Ord)
type Klausel = [Atom]
type KlauselMenge = [Klausel]
dpfsSat :: Int -> KlauselMenge -> Klausel
dpfsSat fset klauselMenge = dpfsSat' fset klauselMenge []
where
dpfsSat' :: Int -> KlauselMenge -> Klausel -> Klausel
dpfsSat' _ [] l = resolveDuplicateLiterals l
dpfsSat' f k l
| f `seq` k `seq` l `seq` False = undefined
| [] `elem` k = []
| ok1 = dpfsSat' f rTF l
| ok2 = dpfsSat' f (substituteSimilarUnits (atomToTupel v2) k) l
| ok3 = dpfsSat' f (resolveUnit1 v3 k ) ((Xin v3):l)
| ok4 = dpfsSat' f (resolvePureLiteral v4 k) ((Xin v4):l)
| otherwise = case (dpfsSat' f (resolveUnit1 minUnit k) ((Xin minUnit): l)) of
[] -> dpfsSat' f ( resolveUnit1 kompl k) ((Xin kompl): l)
xs -> xs
where
rTF = resolveTrueFalse f v1 k
minUnit = findBestLiteral4 k
kompl = (fst minUnit,Set.difference (Set.fromList [1..f]) (snd minUnit))
fTF = findTrueFalse4 f k
fSU = findSimilarAtomUnits f k
fU = findUnit' k
fP = findPureLiteral k
ok1 = maybeToBool fTF
ok2 = maybeToBool fSU
ok3 = maybeToBool fU
ok4 = maybeToBool fP
v1 = expectJust fTF
v2 = expectJust fSU
v3 = expectJust fU
v4 = expectJust fP
maybeToBool :: Maybe a -> Bool
maybeToBool (Just x) = True
maybeToBool Nothing = False
expectJust :: Maybe a -> a
expectJust (Just x) = x
expectJust Nothing = error "Unexpected Nothing"
Поскольку мне не разрешено загружать изображения, я записываю вывод профиля кучи (-hy). Куча полна IntSet.
A
,B
,C
иD
быть функциями? Написание их в верхнем регистре делает их похожими на конструкторы. И какX
актуально? - person dave4420   schedule 07.02.2012a (c u) f l
является результатом, его оценка может быть принудительно выполнена только извнеa
. Чтобы определить утечку, мы должны увидеть больше кода. - person Daniel Fischer   schedule 07.02.2012a (c u) f l
? - person leftaroundabout   schedule 07.02.2012findTrueFalse
вы приводите списокconcat xs
кData.Vector
только для того, чтобы O (1) найти в нем элемент, удовлетворяющий предикатуfT
?? Это выглядит невероятно контрпродуктивным, просто выполнение этого поиска в списке напрямую должно быть быстрее, чем приведение только кVector
, и он вообще не выделяет никакого места, как вы должны для этого вектора! - person leftaroundabout   schedule 07.02.2012a
», я имею в виду, что вы не можете заставить функцию полностью оценить свой результат изнутри функции, он будет оцениваться только тогда, когда что-то вне функции должно оценить результат. Вы можете сделать так, чтобы он полностью оценивался, если что-то внешнее требует только частичной оценки —let r = foo bar baz in deepseq r r
— если тип результата имеет экземплярNFData
, но это не обязательно хорошая идея. Общее замечание: типы помогают, всегда ставьте сигнатуру типа на свою функцию, это помогает компилятору и читателям... - person Daniel Fischer   schedule 07.02.2012k
- это то же самое, что иklauselMenge
, верно? Можем ли мы получить компилируемый пример? Не видя реализации таких вещей, какsubstituteSimilarUnits
, трудно догадаться, откуда может браться утечка. - person Daniel Fischer   schedule 07.02.2012[] `elem` klauselMenge
, либо нет. Если[]
является элементомklauselMenge
, тоdpfsSat x y z
оценивается как[]
независимо от аргументов. Если это не так, то условие никогда не выполняется, и мы всегда переходим кotherwise
: но если ghc не может понять это, ему приходится вычислять истинное значение[] `elem` klauselMenge
каждый раз, когда он делает рекурсивный шаг. - person applicative   schedule 08.02.2012resolveUnit1
свой первый аргументkompl
и насколько глубоко? Простое сопоставление с образцом не заставит его составляющие, так как это пара.kompl
также держится за паруminUnit
, поэтому, возможно, у него может быть утечка пространства в паре Вадлера. - person Will Ness   schedule 11.02.2012maybeToBool
точно такой же, какisJust
, а вашexpectJust
почти такой же (вплоть до сообщения об ошибке), что иfromJust
, функционирующий изData.Maybe
. - person Will Ness   schedule 11.02.2012