Expresiones aritmética normalizadas
El siguiente tipo de dato representa expresiones construidas con variables, sumas y productos
1 2 3 |
data Expr = Var String | S Expr Expr | P Expr Expre |
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
1 |
esTermino, esNormal :: Expr -> Bool |
tales que
- (esTermino a) se verifica si a es un término. Por ejemplo,
1 2 3 4 |
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,
1 2 3 4 5 |
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 |