{"id":4113,"date":"2014-02-11T16:53:32","date_gmt":"2014-02-11T15:53:32","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=4113"},"modified":"2014-02-12T08:29:38","modified_gmt":"2014-02-12T07:29:38","slug":"i1m2013-definiciones-de-tipos-de-datos-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2013-definiciones-de-tipos-de-datos-en-haskell\/","title":{"rendered":"I1M2013: Definiciones de tipos de datos en Haskell"},"content":{"rendered":"<p>En la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-13\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se ha estudiado las definiciones de nuevos tipos de datos y de funciones sobre dichos tipos. Concretamente, se ha estudiado<\/p>\n<ul>\n<li> c\u00f3mo definir tipos usando <\/i>type<\/i>,\n<li> c\u00f3mo definir funciones con dominio o rango en tipos definidos usando <\/i>type<\/i>,\n<li> c\u00f3mo definir tipos usando <i>data<\/a>,\n<li> c\u00f3mo definir funciones con dominio o rango en tipos definidos usando <\/i>data<\/i> y\n<li> c\u00f3mo definir tipos de datos recursivos usando como ejemplo los naturales, las listas y los \u00e1rboles.\n<\/ul>\n<p>Se ha insistido en la metodolog\u00eda de definici\u00f3n de funciones recursivas sobre tipos de datos escribiendo una ecuaci\u00f3n por cada uno de los constructores del tipo de dato.<\/p>\n<p>Como caso de estudio se ha iniciado la construcci\u00f3n de un programa para determinar si una f\u00f3rmula es una tautolog\u00eda. Para ello se ha definido el tipo de dato de las f\u00f3rmulas proposicionales, el de las interpretaciones y una funci\u00f3n para definir el valor de una f\u00f3rmula respecto de una interpretaci\u00f3n. Se ha dejado como ejercicio la definici\u00f3n de las restantes funciones para completar el programa.<\/p>\n<p>El c\u00f3digo correspondiente es<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- Las f\u00f3rmulas proposicionales se definen por:\r\n--    * Las constantes booleanas son f\u00f3rmulas proposicionales.\r\n--    * Las f\u00f3rmulas at\u00f3micas son f\u00f3rmulas proposicionales.\r\n--    * Si F es una f\u00f3mula proposicional, entonces -F tambi\u00e9n los es.\r\n--    * Si F y F son f\u00f3rmulas proposicionales, entonces (F \/\\ G) y \r\n--      (F -> G) tambi\u00e9n lo son.\r\ndata Prop = Const Bool\r\n          | Var Char\r\n          | Neg Prop\r\n          | Conj Prop Prop\r\n          | Impl Prop Prop\r\n          deriving Show\r\n\r\n-- Ejemplos de representaci\u00f3n de f\u00f3rmulas proposicionales: Las f\u00f3rmulas\r\n--    * p1 := A \/\\ -A\r\n--    * p2 := (A \/\\ B) -> A\r\n--    * p3 := A -> (A \/\\ B)\r\n--    * p4 := (A -> (A -> B)) -> B\r\n-- se representan por\r\np1, p2, p3, p4 :: Prop\r\np1 = Conj (Var 'A') (Neg (Var 'A'))\r\np2 = Impl (Conj (Var 'A') (Var 'B')) (Var 'A')\r\np3 = Impl (Var 'A') (Conj (Var 'A') (Var 'B'))\r\np4 = Impl (Conj (Var 'A') (Impl (Var 'A') (Var 'B'))) (Var 'B')\r\n\r\n-- Las interpretaciones son listas formadas por el nombre de una\r\n-- variable proposicional y un valor de verdad. \r\ntype Interpretacion = [(Char,Bool)]\r\n\r\n-- (valor i p) es el valor de la proposici\u00f3n p en la interpretaci\u00f3n\r\n-- i. Por ejemplo, \r\n--    valor [('A',False),('B',True)] p3  =>  True\r\n--    valor [('A',True),('B',False)] p3  =>  False\r\nvalor :: Interpretacion -> Prop -> Bool\r\nvalor _ (Const b)  = b\r\nvalor i (Var x)    = busca x i\r\nvalor i (Neg p)    = not (valor i p)\r\nvalor i (Conj p q) = valor i p && valor i q\r\nvalor i (Impl p q) = valor i p <= valor i q\r\n<\/pre>\n<p> Las transparencias usadas en la clase son las p\u00e1ginas 1 a 23 del <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-12\/temas\/tema-9t.pdf\">tema 9<\/a>:<br \/>\n<div class=\"jetpack-video-wrapper\"><iframe src='https:\/\/www.slideshare.net\/slideshow\/embed_code\/6626199' width='1290' height='1057' sandbox=\"allow-popups allow-scripts allow-same-origin allow-presentation\" allowfullscreen webkitallowfullscreen mozallowfullscreen><\/iframe><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se ha estudiado las definiciones de nuevos tipos de datos y de funciones sobre dichos tipos. Concretamente, se ha estudiado c\u00f3mo definir tipos usando type, c\u00f3mo definir funciones con dominio o rango en tipos definidos usando type, c\u00f3mo definir tipos usando data,&#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":[222],"tags":[270,300],"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\/4113"}],"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=4113"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4113\/revisions"}],"predecessor-version":[{"id":4119,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4113\/revisions\/4119"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=4113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=4113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=4113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}