{"id":52640,"date":"2020-08-10T22:25:01","date_gmt":"2020-08-10T21:25:01","guid":{"rendered":"http:\/\/www.nerdilandia.com\/?p=52640"},"modified":"2020-08-10T22:25:01","modified_gmt":"2020-08-10T21:25:01","slug":"prolog-el-lenguaje-de-programacion-logica","status":"publish","type":"post","link":"https:\/\/nerdilandia.com\/prolog-el-lenguaje-de-programacion-logica\/","title":{"rendered":"Prolog, el lenguaje de programaci\u00f3n l\u00f3gica"},"content":{"rendered":"<div style=\"display: none;\"><\/div>\n<div style=\"display: none;\"><\/div>\n<p style=\"text-align: justify;\">La programaci\u00f3n l\u00f3gica es una variedad de lo que conocemos con\u00a0programaci\u00f3n declarativa,\u00a0un paradigma opuesto a pr\u00e1cticamente todos los lenguajes de programaci\u00f3n populares, desde ensamblador a <a href=\"https:\/\/nerdilandia.com\/3-cursos-gratis-para-aprender-phyton-estructura-de-dato-o-blockchain\/\">Python<\/a> pasando por BASIC, C o Java, a los que agrupamos en la\u00a0categor\u00eda de la programaci\u00f3n imperativa.<\/p>\n<p style=\"text-align: justify;\">En dichos lenguajes, la labor del programador es establecer c\u00f3mo se resuelve un problema mediante sentencias.\u00a0Sin embargo, la programaci\u00f3n l\u00f3gica no gira en torno al c\u00f3mo, sino al qu\u00e9: se trabaja de forma descriptiva, estableciendo relaciones entre entidades, lo que obliga a los que los lenguaje tengan\u00a0un alto nivel de abstracci\u00f3n.<\/p>\n<p style=\"text-align: justify;\">Este paradigma\u00a0se basa en la f\u00f3rmula \u00abalgoritmos = l\u00f3gica + control\u00bb\u00a0(la llamada Ecuaci\u00f3n Informal de Kowalski), lo que significa que un algoritmo se crea especificando conocimiento mediante axiomas (l\u00f3gica) y el problema se resuelve mediante un mecanismo de inferencia que act\u00faa sobre el mismo (control).<\/p>\n<p style=\"text-align: justify;\">Inicialmente se trataba de un lenguaje interpretado hasta que, una d\u00e9cada m\u00e1s tarde, se cre\u00f3 un compilador capaz de traducir Prolog en un conjunto de instrucciones de una m\u00e1quina abstracta denominada WAM (\u00abWarren Abstract Machine\u00bb), lo que lo convirti\u00f3\u00a0desde entonces en un lenguaje semi-interpretado.<\/p>\n<p style=\"text-align: justify;\">Su creador, Alain Colmerauer, explica que<\/p>\n<blockquote><p>\u00abProlog naci\u00f3 de un desaf\u00edo: crear un lenguaje de muy alto nivel, aun cuando fuera ineficiente para los inform\u00e1ticos de la \u00e9poca.<\/p>\n<p>La eficiencia consist\u00eda entonces en que una m\u00e1quina ejecutara muy r\u00e1pidamente programas laboriosamente escritos. El reto consist\u00eda en poder escribir r\u00e1pidamente los programas dejando a la m\u00e1quina su laboriosa ejecuci\u00f3n\u00bb.<\/p><\/blockquote>\n<p style=\"text-align: justify;\">Entre los lenguajes de programaci\u00f3n l\u00f3gica\u00a0podemos destacar Prolog, Lisp o Erlang. Utilizaremos el primero de ellos como ejemplo:<\/p>\n<h2 style=\"text-align: justify;\">\u00bfQu\u00e9 es Prolog?<\/h2>\n<p style=\"text-align: justify;\">Prolog (derivado de \u00abPROgrammation en LOGique\u00bb)\u00a0naci\u00f3 a comienzos de la d\u00e9cada de los 70, de la mano de un investigador de la Universidad de Marsella (Alain Colmerauer), mientras dirigi\u00eda en un proyecto de tratamiento algor\u00edtmico de lenguajes naturales.<\/p>\n<p style=\"text-align: justify;\">Los \u00e1mbitos de la computaci\u00f3n donde m\u00e1s se usa Prolog son los de la inteligencia artificial\u00a0y aspectos relacionados con la misma como el <a href=\"https:\/\/es.wikipedia.org\/wiki\/Aprendizaje_autom%C3%A1tico\">machine learning<\/a>, procesamiento de lenguaje natural, construcci\u00f3n de sistemas expertos, etc&#8230;<\/p>\n<h2 style=\"text-align: justify;\">Sintaxis de Prolog<\/h2>\n<p style=\"text-align: justify;\">Un programa Prolog se compone de un\u00a0conjunto de hechos\u00a0(afirmaciones simples) y de reglas (que sirven para afirmar la veracidad de un hecho en base a otros). El conjunto de hechos de un programa viene a ser el equivalente a contar con una base de datos, aunque\u00a0en este contexto se habla de &#8216;base de conocimientos&#8217;.<\/p>\n<p style=\"text-align: justify;\">Ejemplo de hechos<\/p>\n<blockquote><p>es_hijo(Juanito, Juan)<\/p>\n<p>suma(10,5,15)<\/p><\/blockquote>\n<p style=\"text-align: justify;\">Una vez definidos estos hechos\u00a0(el primero significa \u00abJuanito es hijo de Juan\u00bb y el segundo \u00ab15 es la suma de 10 y 5\u00bb),\u00a0se pueden realizar preguntas al programa, que terminar\u00e1n siempre en un punto, como el siguiente:<\/p>\n<blockquote><p>?es_hijo(x,Juan).<\/p><\/blockquote>\n<p style=\"text-align: justify;\">Dicha pregunta significa \u00ab\u00bfExiste un X que sea hijo de Juan?\u00bb; la respuesta del programa ser\u00eda positiva, y nos arrojar\u00eda todas las respuestas posibles (\u00abJuanito\u00bb&#8230; y el resto de sus hermanos, si los hubiera y los hubi\u00e9ramos definido como hechos).<\/p>\n<p style=\"text-align: justify;\">Igualmente, a partir de lo anterior,\u00a0podemos tambi\u00e9n establecer reglas, que definen nuevas relaciones\u00a0a partir de relaciones ya dadas. Por ejemplo:<\/p>\n<blockquote><p>es_padre(X,Y) :- es_hijo(Y,X), es_var\u00f3n(X).<\/p><\/blockquote>\n<p style=\"text-align: justify;\">Este c\u00f3digo Prolog se corresponder\u00eda con la f\u00f3rmula l\u00f3gica\u00a0<em>\u00ab\u2200x \u2200y ((es_hijo(y,x) \u2227 es_var\u00f3n(x)) \u2192 es_padre(x,y))\u00bb<\/em>.<\/p>\n<p style=\"text-align: justify;\">Prolog cuenta tambi\u00e9n con\u00a0objetos estructurados:<\/p>\n<blockquote><p>en_stock( libro(harry_potter_1, autor(j.k., rowling)) ).<\/p><\/blockquote>\n<p style=\"text-align: justify;\">Lo anterior nos permite preguntar al programa por varios elementos de la entidad: \u00ab<em>\u00bfTenemos &#8216;harry_potter_1&#8217; en stock?<\/em>\u00ab, \u00ab<em>\u00bfTenemos alg\u00fan libro de &#8216;j.k. rowling&#8217; en stock?<\/em>\u00ab, etc.<\/p>\n<p style=\"text-align: justify;\">No pretendemos con este art\u00edculo m\u00e1s que echar un leve vistazo a un enfoque minoritario de la programaci\u00f3n y a uno de sus principales ejemplos.\u00a0Prolog es mucho m\u00e1s complejo y potente que lo que dejamos entrever aqu\u00ed: si te pica la curiosidad est\u00e1s de enhorabuena, porque una visita r\u00e1pida a Google te revelar\u00e1 grandes cantidades de documentaci\u00f3n al respecto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La programaci\u00f3n l\u00f3gica es una variedad de lo que conocemos con\u00a0programaci\u00f3n declarativa,\u00a0un paradigma opuesto a pr\u00e1cticamente todos los lenguajes de programaci\u00f3n populares, desde ensamblador a Python pasando por BASIC, C o Java, a los que agrupamos en la\u00a0categor\u00eda de la programaci\u00f3n imperativa. En dichos lenguajes, la labor del programador es establecer c\u00f3mo se resuelve un &#8230; <a title=\"Prolog, el lenguaje de programaci\u00f3n l\u00f3gica\" class=\"read-more\" href=\"https:\/\/nerdilandia.com\/prolog-el-lenguaje-de-programacion-logica\/\" aria-label=\"Leer m\u00e1s sobre Prolog, el lenguaje de programaci\u00f3n l\u00f3gica\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":2,"featured_media":52641,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[64,45],"tags":[107],"class_list":["post-52640","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informacion","category-programacion","tag-internet"],"_links":{"self":[{"href":"https:\/\/nerdilandia.com\/wp-json\/wp\/v2\/posts\/52640","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nerdilandia.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nerdilandia.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nerdilandia.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nerdilandia.com\/wp-json\/wp\/v2\/comments?post=52640"}],"version-history":[{"count":0,"href":"https:\/\/nerdilandia.com\/wp-json\/wp\/v2\/posts\/52640\/revisions"}],"wp:attachment":[{"href":"https:\/\/nerdilandia.com\/wp-json\/wp\/v2\/media?parent=52640"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nerdilandia.com\/wp-json\/wp\/v2\/categories?post=52640"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nerdilandia.com\/wp-json\/wp\/v2\/tags?post=52640"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}