Expresiones aritmética normalizadas
Enunciado
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
-- El siguiente tipo de dato representa expresiones construidas con -- variables, sumas y productos -- data Expr = V String -- | S Expr Expr -- | P Expr Expr -- Por ejemplo, x*(y+z) se representa por (P (V "x") (S (V "y") (V "z"))) -- -- Una expresión es un término si es un producto de variables. Por -- ejemplo, x*(y*z) es un término pero x+(y*z) ni x*(y+z) lo son. -- -- Una expresión está en forma normal si es una suma de términos. Por -- ejemplo, x*(y*z) y x+(y*z) está en forma normal; pero x*(y+z) y -- (x+y)*(x+z) no lo están. -- -- Definir las funciones -- esTermino, esNormal :: Expr -> Bool -- tales que -- + (esTermino a) se verifica si a es un término. Por ejemplo, -- esTermino (V "x") == True -- esTermino (P (V "x") (P (V "y") (V "z"))) == True -- esTermino (P (V "x") (S (V "y") (V "z"))) == False -- esTermino (S (V "x") (P (V "y") (V "z"))) == False -- + (esNormal a) se verifica si a está en forma normal. Por ejemplo, -- esNormal (V "x") == True -- esNormal (P (V "x") (P (V "y") (V "z"))) == True -- esNormal (S (V "x") (P (V "y") (V "z"))) == True -- esNormal (P (V "x") (S (V "y") (V "z"))) == False -- esNormal (P (S (V "x") (V "y")) (S (V "y") (V "z"))) == False |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 |
data Expr = V String | S Expr Expr | P Expr Expr esTermino :: Expr -> Bool esTermino (V _) = True esTermino (S _ _) = False esTermino (P a b) = esTermino a && esTermino b esNormal :: Expr -> Bool esNormal (S a b) = esNormal a && esNormal b esNormal a = esTermino a |
Un comentario