{"id":3379,"date":"2013-05-28T16:32:26","date_gmt":"2013-05-28T16:32:26","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3379"},"modified":"2013-05-29T05:32:55","modified_gmt":"2013-05-29T05:32:55","slug":"lmf2013-introduccion-a-la-programacion-logica-con-prolog","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/lmf2013-introduccion-a-la-programacion-logica-con-prolog\/","title":{"rendered":"LMF2013: Introducci\u00f3n a la programaci\u00f3n l\u00f3gica con Prolog"},"content":{"rendered":"<p>En la clase de hoy del curso <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/lmf-12\">L\u00f3gica matem\u00e1tica y fundamentos<\/a> se ha realizado una introducci\u00f3n a la programaci\u00f3n l\u00f3gica con Prolog como aplicaci\u00f3n de la resoluci\u00f3n en la l\u00f3gica de primer orden.<\/p>\n<p>Se ha presentado el sistema deductivo de Prolog en tres fases: proposicional, relacional y funcional. En cada una se ha comentado c\u00f3mo representar el conocimiento, c\u00f3mo realizar consultas y c\u00f3mo es el razonamiento de Prolog para calcular las respuestas.<\/p>\n<p>Los apuntes de esta clase son <a href=\"http:\/\/www.cs.us.es\/~jalonso\/publicaciones\/2006-int_prolog.pdf\">Introducci\u00f3n a la programaci\u00f3n l\u00f3gica con Prolog<\/a> (p\u00e1ginas 1-26).<\/p>\n<p>Las transparencias de esta clase son las p\u00e1ginas 1 a 18 del <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/lmf-12\/temas\/tema-13.pdf\">tema 13<\/a><br \/>\n<!--more--><br \/>\n<div class=\"jetpack-video-wrapper\"><iframe src='https:\/\/www.slideshare.net\/slideshow\/embed_code\/10943558' width='1290' height='1057' sandbox=\"allow-popups allow-scripts allow-same-origin allow-presentation\" allowfullscreen webkitallowfullscreen mozallowfullscreen><\/iframe><\/div><\/p>\n<p>Como ejemplo de aplicaci\u00f3n de la programaci\u00f3n l\u00f3gica a la soluci\u00f3n de problemas l\u00f3gicos hemos comentado el rompecabeza de Lewis Carroll<\/p>\n<pre lang=\"prolog\">\r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n% En este ejercicio vamos a resolver el siguiente rompecabezas l\u00f3gico propuesto\r\n% por Lewis Carroll: \r\n%\r\n% Cinco hombres de distintas nacionalidades viven en las cinco primeras casa \r\n% de una calle. Cada uno tiene una profesi\u00f3n, un animal favorito y una bebida\r\n% favorita (todas distintas de la de los otros). Sabemos que\r\n%     1. El ingl\u00e9s vive en la casa roja.\r\n%     2. El espa\u00f1ol tiene un perro.\r\n%     3. El propietario de la casa verde bebe caf\u00e9.\r\n%     4. El italiano bebe t\u00e9.\r\n%     5. La casa verde est\u00e1 a la derecha de la blanca.\r\n%     6. El escultor cr\u00eda caracoles.\r\n%     7. El diplom\u00e1tico vive en la casa amarilla.\r\n%     8. En la casa central beben leche.\r\n%     9. El Noruego vive en la primera casa de la izquierda.\r\n%    10. El zorro est\u00e1 en la casa vecina de la del m\u00e9dico.\r\n%    11. El caballo est\u00e1 en la casa vecina de la del diplom\u00e1tico.\r\n%    12. El violinista bebe zumo de fruta.\r\n%    13. El japon\u00e9s es pintor.\r\n%    14. La casa del noruego est\u00e1 al lado de la casa azul.\r\n% Determinar d\u00f3nde est\u00e1 la cebra y qui\u00e9n bebe agua. \r\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r\n\r\n% presoluci\u00f3n(?L) \r\n%     se verifica si L es una presoluci\u00f3n; es decir, una lista de 5 elementos\r\n%     de la forma casa(E1,E2,E3,E4,E5) donde E1 es el color de la casa, E2 la\r\n%     nacionalidad del que vive en la casa, E3 el animal que hay en la casa, E4\r\n%     la bebida favorita del que vive en la casa y E5 la profesi\u00f3n del que vive\r\n%     en la casa.\r\npresoluci\u00f3n([casa(_,_,_,_,_),\r\n             casa(_,_,_,_,_),\r\n             casa(_,_,_,_,_),\r\n             casa(_,_,_,_,_),\r\n             casa(_,_,_,_,_)]).\r\n\r\n% vecina_derecha(A,B,L)\r\n%    se verifica si A est\u00e1 a la derecha de B en la lista L; es decir, B es el\r\n%    siguiente elemento de A en L. Por ejemplo,\r\n%        ?- vecina_derecha(X,Y,[a,b,c]).\r\n%        X = b     Y = a ;\r\n%        X = c     Y = b ;\r\n%        No\r\n%        ?- length(L,3), vecina_derecha(a,b,L).\r\n%        L = [b, a, _G384] ;\r\n%        L = [_G378, b, a] ;\r\n%        No\r\nvecina_derecha(A,B,[B,A|_]).\r\nvecina_derecha(A,B,[_|RL]) :-\r\n   vecina_derecha(A,B,RL).\r\n\r\n% vecina(A,B,L)\r\n%    se verifica si A y B son vecinas en L; es decir, son elementos\r\n%    consecutivos en L. Por ejemplo,\r\n%        ?- vecina(X,Y,[a,b,c]).\r\n%        X = a   Y = b ;\r\n%        X = b   Y = a ;\r\n%        X = b   Y = c ;\r\n%        X = c   Y = b ;\r\n%        No\r\n%        ?- length(L,3), vecina(a,b,L).\r\n%        L = [a, b, _G336] ;\r\n%        L = [b, a, _G336] ;\r\n%        L = [_G330, a, b] ;\r\n%        L = [_G330, b, a] ;\r\n%        No\r\n%\r\nvecina(A,B,[A,B|_]).\r\nvecina(A,B,[B,A|_]).\r\nvecina(A,B,[_|RL]) :-\r\n   vecina(A,B,RL).\r\n\r\n% soluci\u00f3n_carroll(L)\r\n%    se verifica si L es una soluci\u00f3n al rompecabezas; esto es, L debe ser una\r\n%    presoluci\u00f3n que verifique todas las condiciones del enunciado.\r\nsoluci\u00f3n_carroll(L) :-\r\n   presoluci\u00f3n(L),\r\n   % 1. El ingl\u00e9s vive en la casa roja:\r\n   member(casa(roja,ingl\u00e9s,_,_,_),L),\r\n   % 2. El espa\u00f1ol tiene un perro:\r\n   member(casa(_,espa\u00f1ol,perro,_,_),L),\r\n   % 3. El propietario de la casa verde bebe caf\u00e9:\r\n   member(casa(verde,_,_,caf\u00e9,_),L),\r\n   % 4. El italiano bebe t\u00e9:\r\n   member(casa(_,italiano,_,t\u00e9,_),L),\r\n   % 5. La casa verde est\u00e1 a la derecha de la blanca:\r\n   vecina_derecha(casa(verde,_,_,_,_),casa(blanca,_,_,_,_),L),\r\n   % 6. El escultor cr\u00eda caracoles:\r\n   member(casa(_,_,caracol,_,escultor),L),\r\n   % 7. El diplom\u00e1tico vive en la casa amarilla:\r\n   member(casa(amarilla,_,_,_,diplom\u00e1tico),L),\r\n   % 8. En la casa central beben leche:\r\n   L = [_,_,casa(_,_,_,leche,_),_,_],\r\n   % 9. El Noruego vive en la primera casa de la izquierda:\r\n   L = [casa(_,noruego,_,_,_)|_],\r\n   % 10. El zorro est\u00e1 en la casa vecina de la del m\u00e9dico:\r\n   vecina(casa(_,_,_,_,m\u00e9dico),casa(_,_,zorro,_,_),L),\r\n   % 11. El caballo est\u00e1 en la casa vecina de la del diplom\u00e1tico:\r\n   vecina(casa(_,_,_,_,diplom\u00e1tico),casa(_,_,caballo,_,_),L),\r\n   % 12. El violinista bebe zumo de fruta:\r\n   member(casa(_,_,_,zumo,m\u00fasico),L),\r\n   % 13. El japon\u00e9s es pintor:\r\n   member(casa(_,japon\u00e9s,_,_,pintor),L),\r\n   % 14. La casa del noruego est\u00e1 al lado de la casa azul:\r\n   vecina(casa(_,noruego,_,_,_),casa(azul,_,_,_,_),L),\r\n   % La cebra est\u00e1 en alguna casa:\r\n   member(casa(_,_,cebra,_,_),L),\r\n   % Alguien bebe agua:\r\n   member(casa(_,_,_,agua,_),L).\r\n\r\n\/* C\u00e1lculo de las soluciones del rompecabeza.\r\n ?- soluci\u00f3n_carroll(L).\r\n L = [casa(amarilla, noruego,  zorro,   agua,  diplom\u00e1tico),\r\n      casa(azul,     italiano, caballo, t\u00e9,    m\u00e9dico),\r\n      casa(roja,     ingl\u00e9s,   caracol, leche, escultor),\r\n      casa(blanca,   espa\u00f1ol,  perro,   zumo,  m\u00fasico),\r\n      casa(verde,    japon\u00e9s,  cebra,   caf\u00e9,  pintor)] ;\r\n No\r\n\r\n Por tanto, la cebra est\u00e1 en la casa verde y bebe agua el diplom\u00e1tico.\r\n*\/\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy del curso L\u00f3gica matem\u00e1tica y fundamentos se ha realizado una introducci\u00f3n a la programaci\u00f3n l\u00f3gica con Prolog como aplicaci\u00f3n de la resoluci\u00f3n en la l\u00f3gica de primer orden. Se ha presentado el sistema deductivo de Prolog en tres fases: proposicional, relacional y funcional. En cada una se ha comentado c\u00f3mo&#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":[1],"tags":[202,294],"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\/3379"}],"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=3379"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3379\/revisions"}],"predecessor-version":[{"id":3380,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3379\/revisions\/3380"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}