{"id":983,"date":"2015-01-21T06:00:46","date_gmt":"2015-01-21T04:00:46","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=983"},"modified":"2015-11-30T19:27:20","modified_gmt":"2015-11-30T17:27:20","slug":"triparticiones-de-una-lista","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/triparticiones-de-una-lista\/","title":{"rendered":"Triparticiones de una lista"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   triparticiones :: [a] -> [([a],[a],[a])]\n<\/pre>\n<p>tal que (triparticiones xs) es la lista de las ternas (xs1,xs2,xs3) tales que su concatenaci\u00f3n es xs. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   ghci> triparticiones \"abc\"\n   [(\"\",\"\",\"abc\"),(\"\",\"a\",\"bc\"),(\"\",\"ab\",\"c\"),(\"\",\"abc\",\"\"),\n    (\"a\",\"\",\"bc\"),(\"a\",\"b\",\"c\"),(\"a\",\"bc\",\"\"),(\"ab\",\"\",\"c\"),\n    (\"ab\",\"c\",\"\"),(\"abc\",\"\",\"\")]\n<\/pre>\n<p>Comprobar con QuickCheck que, suponiendo que xs es una lista de elementos comparables por igualdad, entonces para cada terna de (triparticiones xs) se cumple que la concatenaci\u00f3n de sus elementos es xs.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck\n\ntriparticiones :: [a] -> [([a],[a],[a])]\ntriparticiones xs = [(xs1,xs2,xs3) | (xs1,ys)  <- biparticiones xs,\n                                     (xs2,xs3) <- biparticiones ys]\n\n-- (biparticiones xs) es la lista de los pares (xs1,xs2) tales que su\n-- concatenaci\u00f3n es xs. Por ejemplo, \n--    ghci> biparticiones \"abc\"\n--    [(\"\",\"abc\"),(\"a\",\"bc\"),(\"ab\",\"c\"),(\"abc\",\"\")]\nbiparticiones :: [a] -> [([a],[a])]\nbiparticiones []     = [([],[])]\nbiparticiones (x:xs) = ([],x:xs) :\n                       [(x:xs1,xs2) | (xs1,xs2) <- biparticiones xs]\n\n-- La propiedad es\nprop_triparticiones :: Eq a => [a] -> Bool\nprop_triparticiones xs =\n    all (\\(xs1,xs2,xs3) -> xs1 ++ xs2 ++ xs3 == xs) (triparticiones xs)\n\n-- La comprobaci\u00f3n es \n--    ghci> quickCheck prop_triparticiones\n--    +++ OK, passed 100 tests.\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n triparticiones :: [a] -> [([a],[a],[a])] tal que (triparticiones xs) es la lista de las ternas (xs1,xs2,xs3) tales que su concatenaci\u00f3n es xs. Por ejemplo, ghci> triparticiones \u00ababc\u00bb [(\u00ab\u00bb,\u00bb\u00bb,\u00bbabc\u00bb),(\u00ab\u00bb,\u00bba\u00bb,\u00bbbc\u00bb),(\u00ab\u00bb,\u00bbab\u00bb,\u00bbc\u00bb),(\u00ab\u00bb,\u00bbabc\u00bb,\u00bb\u00bb), (\u00aba\u00bb,\u00bb\u00bb,\u00bbbc\u00bb),(\u00aba\u00bb,\u00bbb\u00bb,\u00bbc\u00bb),(\u00aba\u00bb,\u00bbbc\u00bb,\u00bb\u00bb),(\u00abab\u00bb,\u00bb\u00bb,\u00bbc\u00bb), (\u00abab\u00bb,\u00bbc\u00bb,\u00bb\u00bb),(\u00ababc\u00bb,\u00bb\u00bb,\u00bb\u00bb)] Comprobar con QuickCheck que, suponiendo que xs es una lista de elementos comparables por igualdad, entonces para cada terna de (triparticiones xs)&#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":[41,8,6,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/983"}],"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=983"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/983\/revisions"}],"predecessor-version":[{"id":1800,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/983\/revisions\/1800"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=983"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=983"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}