{"id":1760,"date":"2011-12-10T17:06:30","date_gmt":"2011-12-10T17:06:30","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=1760"},"modified":"2013-03-08T05:48:58","modified_gmt":"2013-03-08T05:48:58","slug":"enumeracion-de-los-arboles-binarios-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/enumeracion-de-los-arboles-binarios-en-haskell\/","title":{"rendered":"Enumeraci\u00f3n de los \u00e1rboles binarios en Haskell"},"content":{"rendered":"<p>En esta relaci\u00f3n se definen funciones que enumeran el conjunto de los \u00e1rboles binarios cuyas hojas son n\u00fameros naturales; es decir, funciones biyectivas <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=f%3A+%5Cmathbb%7BN%7D+%5Cto+A&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"f: &#92;mathbb{N} &#92;to A\" class=\"latex\" \/> y <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=g%3A+A+%5Cto+%5Cmathbb%7BN%7D&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"g: A &#92;to &#92;mathbb{N}\" class=\"latex\" \/>, donde <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=A&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"A\" class=\"latex\" \/> es el conjunto de los \u00e1rboles binarios cuyas hojas son n\u00fameros naturales. La propiedad biyectiva se comprueba mostrando que <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=f+%5Ccdot+g&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"f &#92;cdot g\" class=\"latex\" \/> y <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=g+%5Ccdot+f&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"g &#92;cdot f\" class=\"latex\" \/> son la identidad. <\/p>\n<p>La enumeraci\u00f3n se basa en la de los pares de n\u00fameros naturales vista<br \/>\nen el m\u00f3dulo <a href=\"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/enumeracion-del-producto-cartesiano-de-los-naturales-en-haskell\/\">Enumeraci\u00f3n del producto cartesiano de los naturales<\/a>.<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Librerias auxiliares                                               --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Enumeracion_del_producto_cartesianos_de_naturales\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir el tipo de datos Arbol formado por los \u00e1rboles\r\n-- binarios cuyas hojas son n\u00fameros enteros. \r\n-- ---------------------------------------------------------------------\r\n\r\ndata Arbol = Hoja Int\r\n           | Nodo Arbol Arbol\r\n           deriving (Eq, Show)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la funci\u00f3n\r\n--    arbol :: Int -> Arbol\r\n-- tal que (arbol n) es el n-\u00e9simo \u00e1rbol binario construido mediante el\r\n-- siguiente procedimiento: sea (x,y) el n-\u00e9simo par de n\u00fameros\r\n-- naturales, entonces (arbol n) es\r\n--    * Hoja y,                       si x=0\r\n--    * Nodo (arbol (x-1)) (arbol y), en caso contrario.\r\n-- Por ejemplo, \r\n--    ghci> [(n, par n, arbol n) | n <- [0..19]]\r\n--    [(0,(0,0),Hoja 0),\r\n--     (1,(0,1),Hoja 1),\r\n--     (2,(1,0),Nodo (Hoja 0) (Hoja 0)),\r\n--     (3,(0,2),Hoja 2),\r\n--     (4,(1,1),Nodo (Hoja 0) (Hoja 1)),\r\n--     (5,(2,0),Nodo (Hoja 1) (Hoja 0)),\r\n--     (6,(0,3),Hoja 3),\r\n--     (7,(1,2),Nodo (Hoja 0) (Nodo (Hoja 0) (Hoja 0))),\r\n--     (8,(2,1),Nodo (Hoja 1) (Hoja 1)),\r\n--     (9,(3,0),Nodo (Nodo (Hoja 0) (Hoja 0)) (Hoja 0)),\r\n--     (10,(0,4),Hoja 4),\r\n--     (11,(1,3),Nodo (Hoja 0) (Hoja 2)),\r\n--     (12,(2,2),Nodo (Hoja 1) (Nodo (Hoja 0) (Hoja 0))),\r\n--     (13,(3,1),Nodo (Nodo (Hoja 0) (Hoja 0)) (Hoja 1)),\r\n--     (14,(4,0),Nodo (Hoja 2) (Hoja 0)),\r\n--     (15,(0,5),Hoja 5),\r\n--     (16,(1,4),Nodo (Hoja 0) (Nodo (Hoja 0) (Hoja 1))),\r\n--     (17,(2,3),Nodo (Hoja 1) (Hoja 2)),\r\n--     (18,(3,2),Nodo (Nodo (Hoja 0) (Hoja 0)) (Nodo (Hoja 0) (Hoja 0))),\r\n--     (19,(4,1),Nodo (Hoja 2) (Hoja 1))]\r\n--    ghci> arbol 41934\r\n--    Nodo (Hoja 7) (Nodo (Hoja 3) (Hoja 5))\r\n-- ---------------------------------------------------------------------\r\n\r\narbol :: Int -> Arbol\r\narbol n | x == 0    = Hoja y\r\n        | otherwise = Nodo (arbol (x-1)) (arbol y) \r\n        where (x,y) = par n\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Definir la funci\u00f3n\r\n--    indiceArbol :: Arbol -> Int\r\n-- tal que (indiceArbol x) es el \u00edndice del \u00e1rbol x; es decir el n\u00famero\r\n-- n tal que x (arbol n) es x. Por ejemplo, \r\n--    ghci> indiceArbol (Nodo (Hoja 7) (Nodo (Hoja 3) (Hoja 5)))\r\n--    41934\r\n-- ---------------------------------------------------------------------\r\n\r\nindiceArbol :: Arbol -> Int\r\nindiceArbol (Hoja n)   = indice (0,n)\r\nindiceArbol (Nodo i d) = indice (1 + indiceArbol i, indiceArbol d)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir la funci\u00f3n\r\n--    prop_indiceArbol_arbol :: Int -> Bool\r\n-- tal que (prop_indiceArbol_arbol n) se verifica si para todo \u00e1rbol x\r\n-- de \u00edndice menor o igual que n se tiene que (indiceArbol (arbol x)) es\r\n-- x. Por ejemplo, \r\n--    ghci> prop_indiceArbolArbol 100\r\n--    True\r\n-- ---------------------------------------------------------------------\r\n\r\nprop_indiceArbol_arbol :: Int -> Bool\r\nprop_indiceArbol_arbol n =\r\n    and [indiceArbol (arbol x) == x | x <- [0..n]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Definir la funci\u00f3n\r\n--    arbolesMenores :: Arbol -> [Arbol]\r\n-- tal que (arbolesMenores x) es la lista de \u00e1rboles cuyo \u00edndice es\r\n-- menor o igual que el de \u00e1rbol x. Por ejemplo,\r\n--    ghci> arbolesMenores (Hoja 3)\r\n--    [Hoja 0,\r\n--     Hoja 1,\r\n--     Nodo (Hoja 0) (Hoja 0),\r\n--     Hoja 2,\r\n--     Nodo (Hoja 0) (Hoja 1),\r\n--     Nodo (Hoja 1) (Hoja 0),\r\n--     Hoja 3]\r\n-- ---------------------------------------------------------------------\r\n\r\narbolesMenores :: Arbol -> [Arbol]\r\narbolesMenores x = [arbol n | n <- [0..indiceArbol x]] \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Definir la propiedad\r\n--    prop_arbol_indiceArbol :: Arbol -> Bool\r\n-- tal que (prop_arbol_indiceArbol x) se verifica si para cualquier\r\n-- \u00e1rbol y menor que x se tiene que (arbol (indiceArbol y)) es y. Por\r\n-- ejemplo, \r\n--    ghci> prop_arbol_indiceArbol (Hoja 5)\r\n--    True\r\n-- ---------------------------------------------------------------------\r\n\r\nprop_arbol_indiceArbol :: Arbol -> Bool\r\nprop_arbol_indiceArbol x =\r\n    and [arbol (indiceArbol y) == y | y <- arbolesMenores x] \r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En esta relaci\u00f3n se definen funciones que enumeran el conjunto de los \u00e1rboles binarios cuyas hojas son n\u00fameros naturales; es decir, funciones biyectivas y , donde es el conjunto de los \u00e1rboles binarios cuyas hojas son n\u00fameros naturales. La propiedad biyectiva se comprueba mostrando que y son la identidad. La enumeraci\u00f3n se basa en la&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","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],"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\/1760"}],"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=1760"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1760\/revisions"}],"predecessor-version":[{"id":2889,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1760\/revisions\/2889"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=1760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=1760"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=1760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}