{"id":1459,"date":"2011-07-23T16:38:33","date_gmt":"2011-07-23T16:38:33","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=1459"},"modified":"2011-07-23T16:41:29","modified_gmt":"2011-07-23T16:41:29","slug":"expresiones-aritmeticas-mediante-tipos-abstracto-de-datos-y-polinomios-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/expresiones-aritmeticas-mediante-tipos-abstracto-de-datos-y-polinomios-en-haskell\/","title":{"rendered":"Expresiones aritm\u00e9ticas mediante tipos abstracto de datos y polinomios en Haskell"},"content":{"rendered":"<p>El objetivo de esta relaci\u00f3n de ejercicios es estudiar dos representaciones de las expresiones aritm\u00e9ticas construidas con una variable, los n\u00fameros enteros y las operaciones suma y producto. <\/p>\n<p>Una representaci\u00f3n es mediante tipo algebraico y la otra es mediante la lista de los coeficientes del polinomio correspondiente. <\/p>\n<p>Se ver\u00e1 como puede transformarse una representaci\u00f3n en la otra y se comprobar\u00e1 con QuickCheck la equivalencia de las representaciones.<\/p>\n<p>La relaci\u00f3n est\u00e1 basada en el ejercicio 3.3 (p\u00e1gina 15) del art\u00edculo <a href=\"http:\/\/www4.in.tum.de\/~nipkow\/MOD2011\/isabelle-notes.pdf\">Interactive Proof Introduction to Isabelle\/HOL<\/a> de Tobias Nipkow.<\/p>\n<p>El contenido de la relaci\u00f3n de ejercicios se encuentra en <a href=\"https:\/\/www.glc.us.es\/~jalonso\/LogicaMente\/index.php5\/Expresiones_aritm%C3%A9ticas_mediante_tipos_abstracto_de_datos_y_polinomios\">L\u00f3gicaMente<\/a> y se muestra a continuaci\u00f3n:<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Librer\u00edas auxiliares                                               --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Test.QuickCheck\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir el tipo de datos Exp para representar la\r\n-- expresiones aritm\u00e9ticas construidas con una variables, los n\u00fameros\r\n-- enteros y las operaciones de sumar y multiplicar. Por ejemplo, la\r\n-- expresi\u00f3n 3+5x^2 se puede representar por\r\n--    Sum (Const 2) (Mul Var (Mul Var (Const 5)))\r\n-- ---------------------------------------------------------------------\r\n\r\ndata Exp = Var | Const Int | Sum Exp Exp | Mul Exp  Exp\r\n           deriving Show\r\n\r\nexp1 :: Exp\r\nexp1 = Sum (Const 3) (Mul Var (Mul Var (Const 5)))\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la funci\u00f3n \r\n--    valorE :: Exp -> Int -> Int\r\n-- tal que (valorE e n) es el valor de la expresi\u00f3n e cuando se\r\n-- sustituye su variable por n. Por ejemplo,\r\n--    valorE exp1 2  ==  23\r\n-- ---------------------------------------------------------------------\r\n\r\nvalorE :: Exp -> Int -> Int\r\nvalorE Var         n = n\r\nvalorE (Const a)   n = a\r\nvalorE (Sum e1 e2) n = (valorE e1 n) + (valorE e2 n)\r\nvalorE (Mul e1 e2) n = (valorE e1 n) * (valorE e2 n)\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Los polinomios se pueden representar por la lista de sus\r\n-- coeficientes. Por ejemplo, el polinomio 3+5x^2 se puede representar\r\n-- por [3,0,5]. Definir el tipo Pol para representar polinomios.\r\n-- ---------------------------------------------------------------------\r\n\r\ntype Pol = [Int]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir la funci\u00f3n\r\n--    simplifica :: Pol -> Pol\r\n-- tal que (simplifica p) es el polinomio obtenido eliminando los ceros\r\n-- finales de p. Por ejemplo,\r\n--    simplifica [3,0,5,0,0]  ==  [3,0,5]\r\n-- ---------------------------------------------------------------------\r\n\r\nsimplifica :: Pol -> Pol\r\nsimplifica p = reverse (dropWhile (==0) (reverse p))\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Definir la funci\u00f3n\r\n--    sumaPol :: Pol -> Pol -> Pol\r\n-- tal que (sumaPol p1 p2) es la suma de los polinomios p1 y p2. Por\r\n-- ejemplo, \r\n--    sumaPol [1,3] [4,-3,7]              ==  [5,0,7]\r\n--    sumaPol [1,3,7] [4,-3]              ==  [5,0,7]\r\n--    sumaPol [1,4,7,3,-5] [6,-4,1,-3,5]  ==  [7,0,8]\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaPol :: Pol -> Pol -> Pol\r\nsumaPol p1 p2 = simplifica ((zipWith (+) q1 q2) ++ r1 ++ r2)\r\n    where n1      = length p1\r\n          n2      = length p2\r\n          n       = min n1 n2\r\n          (q1,r1) = splitAt n p1\r\n          (q2,r2) = splitAt n p2\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Definir la funci\u00f3n\r\n--    multiplicaPol :: Pol -> Pol -> Pol\r\n-- tal que (multiplicaPol p1 p2) es el producto de los polinomios p1 y\r\n-- p2. Por ejemplo, \r\n--    multiplicaPol [1,3] [2,0,5]  ==  [2,6,5,15]\r\n-- ---------------------------------------------------------------------\r\n\r\nmultiplicaPol :: Pol -> Pol -> Pol\r\nmultiplicaPol [a] p2    = [a*b | b <- p2]\r\nmultiplicaPol p1 [b]    = [a*b | a <- p1]\r\nmultiplicaPol (a:p1) (b:p2) = (a*b) : suma3Pol (multiplicaPol [a] p2)\r\n                                               (multiplicaPol p1 [b])\r\n                                               (0 : (multiplicaPol p1 p2))\r\n    where suma3Pol p q r = sumaPol p (sumaPol q r)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Definir la funci\u00f3n\r\n--    polinomio :: Exp -> Pol\r\n-- tal que (polinomio e) es el polinomio equivalente a la expresi\u00f3n\r\n-- e. Por ejemplo,\r\n--    exp1            ==  Sum (Const 3) (Mul Var (Mul Var (Const 5)))\r\n--    polinomio exp1  ==  [3,0,5]\r\n-- ---------------------------------------------------------------------\r\n\r\npolinomio :: Exp -> Pol\r\npolinomio Var         = [0,1]\r\npolinomio (Const a)   = [a]\r\npolinomio (Sum e1 e2) = sumaPol (polinomio e1) (polinomio e2)\r\npolinomio (Mul e1 e2) = multiplicaPol (polinomio e1) (polinomio e2) \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8. Definir la funci\u00f3n\r\n--    expresion :: Pol -> Exp\r\n-- tal que (expresion p) es una expresi\u00f3n aritm\u00e9tica equivalente al\r\n-- polinomio p. Por ejemplo,\r\n--    ghci> expresion [3,0,5]\r\n--    Sum (Const 3) (Mul Var (Sum (Const 0) (Mul Var (Const 5))))\r\n--    ghci> polinomio (expresion [3,0,5])\r\n--    [3,0,5]\r\n-- ---------------------------------------------------------------------\r\n\r\nexpresion :: Pol -> Exp\r\nexpresion [a]   = Const a\r\nexpresion (a:p) = Sum (Const a) (Mul Var (expresion p))\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9. Comprobar con QuickCheck que, para todo polinomio p,\r\n--    polinomio (expresion p) == p\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La propiedad es\r\nprop_polinomio_expresion :: Pol -> Property\r\nprop_polinomio_expresion p =\r\n    not (null p) ==> polinomio (expresion p) == p\r\n\r\n-- La comprobaci\u00f3n es\r\n--    ghci> quickCheck prop_polinomio_expresion\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10. Definir la funci\u00f3n\r\n--    valorP :: Pol -> Int -> Int\r\n-- tal que (valorP p n) es el valor del polinomio p cuando se sustituye\r\n-- su variable por n. Por ejemplo,\r\n--    valorP [3,0,5] 2  ==  23\r\n-- ---------------------------------------------------------------------\r\n\r\nvalorP :: Pol -> Int -> Int\r\nvalorP [a] _ = a\r\nvalorP (a:p) n = a + n * valorP p n\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 11. Comprobar con QuickCheck que, para todo polinomio p y\r\n-- todo entero n,\r\n--    valorP p n == valorE (expresion p) n\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La propiedad es\r\nprop_valor :: Pol -> Int -> Property\r\nprop_valor p n =\r\n    not (null p) ==> \r\n    valorP p n == valorE (expresion p) n\r\n\r\n-- La comprobaci\u00f3n es\r\n--    ghci> quickCheck prop_valor\r\n--    +++ OK, passed 100 tests.\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>El objetivo de esta relaci\u00f3n de ejercicios es estudiar dos representaciones de las expresiones aritm\u00e9ticas construidas con una variable, los n\u00fameros enteros y las operaciones suma y producto. Una representaci\u00f3n es mediante tipo algebraico y la otra es mediante la lista de los coeficientes del polinomio correspondiente. Se ver\u00e1 como puede transformarse una representaci\u00f3n en&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[5],"tags":[270,175,126],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1459"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=1459"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1459\/revisions"}],"predecessor-version":[{"id":1464,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1459\/revisions\/1464"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=1459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=1459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=1459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}