Boolean formula: part2

Hello! I have following code:
buildFormulas :: [Variable] -> Int -> [Formula]
buildFormulas vars 0 = map Var vars
buildFormulas vars n = join $
forM [0 .. n - 1 ] $ \i -> do
x <- buildFormulas vars i
y <- buildFormulas vars (n - i - 1)
z <- buildFormulas vars (n - 1)
let t1 = case z of
(Negation _) -> []
_ -> [Negation z]
t1 ++ [conj x y, impl x y, disj x y]
It is correct, typechecks, but it is insanely slow (calculating
take 35 (buildFormulas [P, Q, R] 5) hangs my computer).
My guess is that it builds too much before returning first results.
Can you suggest more efficent way enumerate formulas of set of variables?
--
Best regards, Dmitry Bogatov

* Dmitry Bogatov
Hello! I have following code:
buildFormulas :: [Variable] -> Int -> [Formula] buildFormulas vars 0 = map Var vars buildFormulas vars n = join $ forM [0 .. n - 1 ] $ \i -> do x <- buildFormulas vars i y <- buildFormulas vars (n - i - 1) z <- buildFormulas vars (n - 1) let t1 = case z of (Negation _) -> [] _ -> [Negation z] t1 ++ [conj x y, impl x y, disj x y]
It is correct, typechecks, but it is insanely slow (calculating take 35 (buildFormulas [P, Q, R] 5) hangs my computer).
My guess is that it builds too much before returning first results. Can you suggest more efficent way enumerate formulas of set of variables?
--
Best regards, Dmitry Bogatov
participants (1)
-
Dmitry Bogatov