- | We can only evaluate closed formulas
isClosed :: Formula -> Bool
isClosed = isClosed' S.empty
  where isClosed' :: S.Set Variable -> Formula -> Bool
        isClosed' _ FTrue = True
        isClosed' _ FFalse = True
        isClosed' bv (Pred _ t) = S.null $ freeVars t S.\\ bv
        isClosed' bv (Rel _ ts) = S.null $ (S.unions $ map freeVars ts) S.\\ bv
        isClosed' bv (Eq t t') = S.null $ (freeVars t `S.union` freeVars t') S.\\ bv
        isClosed' bv (Neg f) = isClosed' bv f
        isClosed' bv (And f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (Or f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (Impl f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (Equiv f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (ForAll v f) = isClosed' (S.insert v bv) f
        isClosed' bv (Exist v f) = isClosed' (S.insert v bv) f


-- Un Modelo es una interpretación de una signatura, dentro de un universo.
-- "subuniv" es el subconjunto (en gral finito) de los elementos del universo
-- que ocurren en las interpretaciones de la signatura.

-- | Model with the universe of discourse as a parameter.
d
isClosed :: Formula -> Bool
isClosed = isClosed' S.empty
  where isClosed' :: S.Set Variable -> Formula -> Bool
        isClosed' _ FTrue = True
        isClosed' _ FFalse = True
        isClosed' bv (Pred _ t) = S.null $ freeVars t S.\\ bv
        isClosed' bv (Rel _ ts) = S.null $ (S.unions $ map freeVars ts) S.\\ bv
        isClosed' bv (Eq t t') = S.null $ (freeVars t `S.union` freeVars t') S.\\ bv
        isClosed' bv (Neg f) = isClosed' bv f
        isClosed' bv (And f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (Or f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (Impl f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (Equiv f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (ForAll v f) = isClosed' (S.insert v bv) f
        isClosed' bv (Exist v f) = isClosed' (S.insert v bv) f


-- Un Modelo es una interpretación de una signatura, dentro de un universo.
-- "subuniv" es el subconjunto (en gral finito) de los elementos del universo
-- que ocurren en las interpretaciones de la signatura.

-- | Model with the universe of discourse as a parameter.
isClosed = isClosed' S.empty
  where isClosed' :: S.Set Variable -> Formula -> Bool
        isClosed' _ FTrue = True
        isClosed' _ FFalse = True
        isClosed' bv (Pred _ t) = S.null $ freeVars t S.\\ bv
        isClosed' bv (Rel _ ts) = S.null $ (S.unions $ map freeVars ts) S.\\ bv
        isClosed' bv (Eq t t') = S.null $ (freeVars t `S.union` freeVars t') S.\\ bv
        isClosed' bv (Neg f) = isClosed' bv f
        isClosed' bv (And f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (Or f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (Impl f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (Equiv f f') = isClosed' bv f && isClosed' bv f'
        isClosed' bv (ForAll v f) = isClosed' (S.insert v bv) f
        isClosed' bv (Exist v f) = isClosed' (S.insert v bv) f


-- Un Modelo es una interpretación de una signatura, dentro de un universo.
-- "subuniv" es el subconjunto (en gral finito) de los elementos del universo
-- que ocurren en las interpretaciones de la signatura.

-- | Model with the universe of discourse as a parameter.