{"id":4030,"date":"2018-05-02T06:00:11","date_gmt":"2018-05-02T04:00:11","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4030"},"modified":"2018-05-09T05:56:35","modified_gmt":"2018-05-09T03:56:35","slug":"clausura-respecto-de-una-operacion-binaria","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/clausura-respecto-de-una-operacion-binaria\/","title":{"rendered":"Clausura respecto de una operaci\u00f3n binaria"},"content":{"rendered":"<p>Se dice que una operador @ es interno en un conjunto A si al  @ sobre elementos de A se obtiene como resultado otro elemento de A. Por ejemplo, la suma es un operador interno en el conjunto de los n\u00fameros naturales pares.<\/p>\n<p>La clausura de un conjunto A con respecto a un operador @ es el menor conjunto B tal que A est\u00e1 contenido en B y el operador @ es interno en el conjunto B. Por ejemplo, la clausura del conjunto {2} con respecto a la suma es el conjunto de los n\u00fameros pares positivos:<\/p>\n<pre lang=\"tex\">\n   {2, 4, 6, 8, ...} = {2*k | k <- [1..]}\n<\/pre>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"tex\">\n   clausuraOperador :: (Int -> Int -> Int) -> Set Int -> Set Int\n<\/pre>\n<p>tal que (clausuraOperador op xs) es la clausura del conjunto xs con respecto a la operaci\u00f3n op. Por ejemplo,<\/p>\n<pre lang=\"tex\">\n   clausuraOperador gcd (fromList [6,9,10])     ==\n      fromList [1,2,3,6,9,10]\n   clausuraOperador gcd (fromList [42,70,105])  ==\n      fromList [7,14,21,35,42,70,105]\n   clausuraOperador lcm (fromList [6,9,10])     ==\n      fromList [6,9,10,18,30,90]\n   clausuraOperador lcm (fromList [2,3,5,7])    ==\n      fromList [2,3,5,6,7,10,14,15,21,30,35,42,70,105,210]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Prelude hiding (map)\nimport Data.Set ( Set\n                , elems\n                , fromList\n                , map\n                , notMember\n                , union\n                , unions\n                ) \n\n-- 1\u00aa definici\u00f3n \nclausuraOperador :: (Int -> Int -> Int) -> Set Int -> Set Int\nclausuraOperador op =\n  until (\\ xs -> null [(x,y) | x <- elems xs,\n                               y <- elems xs,\n                               notMember (op x y) xs])\n        (\\ xs -> union xs (fromList [op x y | x <- elems xs,\n                                              y <- elems xs]))\n\n-- 2\u00aa definici\u00f3n \nclausuraOperador2 :: (Int -> Int -> Int) -> Set Int -> Set Int\nclausuraOperador2 op = until ((==) <*> g) g\n  where g ys = unions [map (`op` y) ys | y <- elems ys]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Se dice que una operador @ es interno en un conjunto A si al @ sobre elementos de A se obtiene como resultado otro elemento de A. Por ejemplo, la suma es un operador interno en el conjunto de los n\u00fameros naturales pares. La clausura de un conjunto A con respecto a un operador @&#8230;<\/p>\n","protected":false},"author":1,"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":[4],"tags":[331,452,392,393,141,11,405,367],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4030"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=4030"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4030\/revisions"}],"predecessor-version":[{"id":4063,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4030\/revisions\/4063"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}