module Main(main) where import Asignaciones import ListaAsignaciones import Formula import Comando import Evaluar import Tabla import Formas -- http://www.makam.org/ -- v2006 obtenerVariablesProposicionales :: ListaAsignaciones -> Asignacion -> Maybe LVar_prop obtenerVariablesProposicionales lista asign | esLVariableProp asign = Just (obtenerVarProps asign) | not existeVariableAsignacion = Nothing | esVariableAsignacion asign = Just varPropsReferenciadas | esVariableCorregida asign = Just (corregirListaVariables varPropsReferenciadas (obtenerVarProps asign)) where varAsign = obtenerVarAsign asign existeVariableAsignacion = existeAsignacion varAsign lista varPropsReferenciadas = obtenerAsignacion varAsign lista extract :: Maybe a -> [a] extract Nothing = [] extract (Just f) = f:[] extract' :: Maybe a -> a extract' Nothing = error "NO!" extract' (Just f) = f nully :: [a]->Bool nully [] = True nully _ = False cmdEvaluar :: ListaAsignaciones -> Asignacion -> Formula -> String cmdEvaluar listaAsign asign formula = cmdEvaluar' formula (obtenerVariablesProposicionales listaAsign asign) cmdEvaluar' :: Formula -> Maybe LVar_prop -> String cmdEvaluar' _ Nothing = "ERROR" cmdEvaluar' formula (Just lista) = valor2str resultado where resultado = evaluar lista formula cmdAsignar :: ListaAsignaciones -> VarAsignacion -> Asignacion -> (String,ListaAsignaciones) cmdAsignar listaAsign var asign = cmdAsignar' listaAsign var (obtenerVariablesProposicionales listaAsign asign) cmdAsignar' :: ListaAsignaciones -> VarAsignacion -> Maybe LVar_prop -> (String,ListaAsignaciones) cmdAsignar' listaAsign _ Nothing = ("ERROR",listaAsign) cmdAsignar' listaAsign v (Just lista) = ([v] ++ " = { " ++ str ++ "}",nuevaLista) where str = imprimirLVarprop lista nuevaLista = insertarAsignacion v lista listaAsign main :: IO () main = mainLoop crearAsignacion mainLoop :: ListaAsignaciones -> IO () mainLoop listaAsign = do putStr("> ") line <- getLine let lcmd = parseComando line if (not (nully (extract (lcmd)))) then do let cmd = (head (extract(lcmd))) if (getString(cmd) /= "salir") then do case (getString(cmd)) of "evaluar" -> do { putStrLn(cmdEvaluar listaAsign (getAsignacion cmd) (getF cmd)); mainLoop listaAsign } "asignar" -> do let ss = cmdAsignar listaAsign (getVarAsignacion cmd) (getAsignacion cmd) putStrLn (fst ss) do mainLoop (snd ss) "tabla" -> do {putStr (tabla (getF cmd)); mainLoop listaAsign} "fnc" -> do {putStrLn (fnc (getF cmd)) ; mainLoop listaAsign } "fnd" -> do {putStrLn (fnd (getF cmd)) ; mainLoop listaAsign } "vacio" -> do {putStr("") ; mainLoop listaAsign } _ -> do {putStrLn "ERROR SUPER EXTRA CRITICO" ; mainLoop listaAsign } else return() else do {putStrLn "ERROR" ; mainLoop listaAsign }