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
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
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
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,
λ> 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,
λ> 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,
λ> valorP [3,0,5] 2 23
Comprobar con QuickCheck que, para todo polinomio p y todo entero n,
valorP p n == valorE (expresion p) n
Soluciones
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.