Valores de polinomios y de expresiones
Las expresiones aritméticas construidas con una variables, los números enteros y las operaciones de sumar y multiplicar se pueden representar mediante el tipo de datos Exp definido por
1 2 |
data Exp = Var | Const Int | Sum Exp Exp | Mul Exp Exp deriving Show |
Por ejemplo, la expresión 3+5x^2 se puede representar por
1 2 |
exp1 :: Exp exp1 = Sum (Const 3) (Mul Var (Mul Var (Const 5))) |
Por su parte, los polinomios se pueden representar por la lista de sus
coeficientes. Por ejemplo, el polinomio 3+5x^2 se puede representar por [3,0,5].
Definir las funciones
1 2 3 |
valorE :: Exp -> Int -> Int expresion :: [Int] -> Exp valorP :: [Int] -> Int -> Int |
tales que
- (valorE e n) es el valor de la expresión e cuando se sustituye su variable por n. Por ejemplo,
1 2 |
λ> valorE (Sum (Const 3) (Mul Var (Mul Var (Const 5)))) 2 23 |
- (expresion p) es una expresión aritmética equivalente al polinomio p. Por ejemplo,
1 2 |
λ> expresion [3,0,5] Sum (Const 3) (Mul Var (Sum (Const 0) (Mul Var (Const 5)))) |
- (valorP p n) es el valor del polinomio p cuando se sustituye su variable por n. Por ejemplo,
1 2 |
λ> valorP [3,0,5] 2 23 |
Comprobar con QuickCheck que, para todo polinomio p y todo entero n,
1 |
valorP p n == valorE (expresion p) n |
Soluciones
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 29 30 31 |
import Test.QuickCheck data Exp = Var | Const Int | Sum Exp Exp | Mul Exp Exp deriving Show exp1 :: Exp exp1 = Sum (Const 3) (Mul Var (Mul Var (Const 5))) valorE :: Exp -> Int -> Int valorE Var n = n valorE (Const a) n = a valorE (Sum e1 e2) n = valorE e1 n + valorE e2 n valorE (Mul e1 e2) n = valorE e1 n * valorE e2 n expresion :: [Int] -> Exp expresion [a] = Const a expresion (a:p) = Sum (Const a) (Mul Var (expresion p)) valorP :: [Int] -> Int -> Int valorP [a] _ = a valorP (a:p) n = a + n * valorP p n -- La propiedad es prop_valor :: [Int] -> Int -> Property prop_valor p n = not (null p) ==> valorP p n == valorE (expresion p) n -- La comprobación es -- λ> quickCheck prop_valor -- +++ OK, passed 100 tests. |
3 Comentarios