{"id":36,"date":"2008-02-22T20:31:49","date_gmt":"2008-02-22T20:31:49","guid":{"rendered":"http:\/\/cibernetica.wordpress.com\/2008\/02\/22\/programacion-logica\/"},"modified":"2008-02-22T20:31:49","modified_gmt":"2008-02-22T20:31:49","slug":"programacion-logica","status":"publish","type":"post","link":"https:\/\/blogs.sld.cu\/cibernetica\/2008\/02\/22\/programacion-logica\/","title":{"rendered":"\u00bfQue es la programaci\u00f3n l\u00f3gica?"},"content":{"rendered":"<p>En sus inicios la actividad de la computadora estuvo limitada exclusivamente al c\u00e1lculo num\u00e9rico. Si bien es cierto que las<br \/>\nm\u00e1quinas fueron construidas principalmente para realizar operaciones aritm\u00e9ticas, ellas son capaces de ejecutar tareas no num\u00e9ricas, como resolver problemas \u201cl\u00f3gicos\u201d.<\/p>\n<p>En realidad la computadora est\u00e1 dotada para procesar \u201cs\u00edmbolos\u201d, el que estos fuesen utilizados como num\u00e9ricos no fue mas que un hecho circunstancial.<\/p>\n<p>Los primeros en comprender esta idea fueron los investigadores de la Inteligencia Artificial, especialmente el tr\u00edo NeweLL, Show y Simon con su \u201clogic theorist\u201d. Este programa pod\u00eda demostrar teoremas del c\u00e1lculo proposicional y sent\u00f3 las bases sobre las posibilidades de las computadoras para la manipulaci\u00f3n de s\u00edmbolos (no num\u00e9ricos) y el tratamiento de estructuras de datos en forma de &lt;&gt;.<\/p>\n<p>Siguiendo estas ideas John Mac Carthy a principio de los a\u00f1os 60 desarrollo el lenguaje LISP, primer lenguaje que rompi\u00f3 con los esquemas convencionales de programaci\u00f3n. El LISP utiliza el tratamiento simb\u00f3lico de la informaci\u00f3n representadas por listas, es el primer lenguaje que no hace diferenciaci\u00f3n entre datos e instrucciones y se le considera el pionero de los lenguajes funcionales por su m\u00e9todo de trabajo, similar a la resoluci\u00f3n de funciones matem\u00e1ticas.<\/p>\n<p>El LISP por sus caracter\u00edsticas de procesar s\u00edmbolos ha sido utilizado durante muchos a\u00f1os como el lenguaje exclusivo de la Inteligencia Artificial.<\/p>\n<p>Aunque la m\u00e1quina est\u00e1 capacitada para manipular s\u00edmbolos, esto no lo realiza de forma eficiente, de ah\u00ed que el LISP tenga que ser un lenguaje con interprete y surgiera la necesidad de m\u00e1quinas LISP. Sin embargo no toda la responsabilidad la tiene la m\u00e1quina, la preparaci\u00f3n de las estructuras de datos para los c\u00e1lculos no num\u00e9ricos, se hace muy engorrosa y compleja.<\/p>\n<p>Para los problemas no num\u00e9ricos tales como; el ajedrez, la soluci\u00f3n de teoremas, el diagnostico m\u00e9dico, los juegos, etc. La representaci\u00f3n de la entrada, enti\u00e9ndase las condiciones iniciales, requieren m\u00e1s que de datos, de una descripci\u00f3n del problema en si al igual que su programaci\u00f3n, la cual carece de un algoritmo definido y se necesita la utilizaci\u00f3n de m\u00e9todos de b\u00fasqueda heur\u00edsticos, o lo que es lo mismo una estrategia a seguir ante las posibles bifurcaciones que se ir\u00e1n presentando, o sea despreciar los caminos pocos f\u00e9rtiles.<\/p>\n<p>Para muchos investigadores la soluci\u00f3n de los problemas no num\u00e9ricos consist&#8217;,ia en encontrar una heur\u00edstica eficiente. Lo cual d\u00edo lugar a una gran diversidad de m\u00e9todos heur\u00edsticos.<\/p>\n<p>No fue hasta el surgimiento de los Sistemas Expertos que la representaci\u00f3n del conocimiento, adquiri\u00f3 la importancia que merec\u00eda. Los Sistemas Expertos tienen como caracter\u00edstica fundamental la separaci\u00f3n de los conocimientos que le son necesarios (Base de Conocimiento) y el programa que permite manipular estos conocimientos (M\u00e1quina de Inferencia). Adem\u00e1s de contar con los datos de partida que permiten la soluci\u00f3n del problema planteado (Memoria de Trabajo).<\/p>\n<p>En las aplicaciones convencionales desarrolladas en lenguajes imperativos de tipo FORTRAN, BASIC, PASCAL, etc. Los conocimientos est\u00e1n mezclados en el programa, donde los datos y las instrucciones reciben un tratamiento separado, lo cual obliga a procesar un orden de ejecuci\u00f3n detallado de las acciones, este m\u00e9todo recibe el nombre de procedural. En las aplicaciones no convencionales, tales como los Sistemas Expertos, (los cuales se desarrollan fundamentalmente, en lenguajes funcionales como LISP o en Programaci\u00f3n L\u00f3gica como PROLOG).<\/p>\n<p>Los conocimientos se dan en forma declarativa, sin indicar el modo de empleo, ni donde, ni cuando utilizarlos.<\/p>\n<p>Los conocimientos son representados en forma de regla del tipo antecedente consecuente. donde en el antecedente viene la descripci\u00f3n de un hecho y en el consecuente la acci\u00f3n a ejecutar la cual produce nuevos hechos (cambios en la memoria de trabajo). Por su puesto que es m\u00e1s c\u00f3modo proporcionar a un sistema conocimientos en forma declarativa, ya que podemos d\u00e1rselo en cualquier momento, suprimirlos o modificarlos con facilidad.<\/p>\n<p>En los comienzos de los a\u00f1os 70 el franc\u00e9s Alain Colmenuer desarroll\u00f3 el lenguaje PROLOG que tambi\u00e9n permite el desarrollo de aplicaciones en forma declarativa.<\/p>\n<p>En general el PROLOG es un demostrador autom\u00e1tico de problema, el cual utiliza una Base de Conocimientos en forma de reglas de inferencia deductivas (cl\u00e1usulas de Horn), es decir sus reglas tienen como consecuente una \u00fanica acci\u00f3n y la inferencias obte\u00acnidas son estrictamente l\u00f3gicas (verdaderas o falsas), aunque puede parecer una limitaci\u00f3n, esto no es totalmente justo, ya que PROLOG permite programar mecanismos inferenciales con l\u00f3gica probabil\u00edsticas, dado que se trata de b\u00fasquedas en \u00e1rboles con acumulaci\u00f3n de evidencias.<\/p>\n<p>El PROLOG como lenguaje surgido del c\u00e1lculo de predicados, tom\u00f3 las siguientes ideas de la l\u00f3gica para su ejecuci\u00f3n.<br \/>\n1) Un conjunto de axiomas o hechos.<br \/>\n2) Reglas de inferencias las cuales se resuelven por resoluci\u00f3n y unificaci\u00f3n.<br \/>\n3) El objetivo a demostrar, que ser\u00e1n las condiciones a unificar con las reglas.<\/p>\n<p>Tambi\u00e9n tom\u00f3 del LISP el tratamiento de las listas para la repre\u00acsentaci\u00f3n de estructuras complejas. Aunque el PROLOG tuvo su ori\u00acgen en la l\u00f3gica matem\u00e1tica no fue una transposici\u00f3n exacta, y esta ligada a las discusiones que sostienen desde hace a\u00f1os los principales investigadores de la Inteligencia Artificial, los cuales est\u00e1n divididos en dos grandes grupos, de una parte Minsky quien propone estudiar los mecanismos del pensamiento humano y luego simularlo en la computadora.<\/p>\n<p>Lo m\u00e1s importante para Minsky son los conceptos, o sea la inter\u00acpretaci\u00f3n que se le puede dar a cada palabra en dependencia de un contexto dado.<\/p>\n<p>El otro grupo encabezado por Mac Carthy (autor del LISP), afirman que la l\u00f3gica matem\u00e1tica es el elemento caracter\u00edstico para la representaci\u00f3n del razonamiento y su implantaci\u00f3n en la computadora, este grupo centra su atenci\u00f3n en la formalizaci\u00f3n y en la estructura de los conocimientos m\u00e1s que en el sentido de los mismos.<\/p>\n<p>La l\u00f3gica desde la antig\u00fcedad se concibi\u00f3 como el m\u00e9todo de descubrir las leyes del pensamiento, pero estas leyes siempre han estado restringidas al pensamiento cient\u00edfico y muy especialmente el matem\u00e1tico, quedando fuera el sentido com\u00fan. Esta deficiencia es admitida por los defensores de la l\u00f3gica, pero ellos consideran que la l\u00f3gica es la \u00fanica senda posible para desarrollar programas capaces de mostrar inteligencia.<\/p>\n<p>Siguiendo los principios de la l\u00f3gica de predicados, como ya se dijo, la programaci\u00f3n l\u00f3gica se construye sobre reglas de inferencia del tipo conclusi\u00f3n condiciones, algunas utilizadas como axiomas, hechos que no requieren demostraci\u00f3n y otros como teoremas, hechos o conclusi\u00f3n que necesitan de condiciones a cumplirse, adem\u00e1s del objetivo a demostrar que es qui\u00e9n representa el problema a resolver y desencadena la ejecuci\u00f3n de las reglas, para su ejecuci\u00f3n utiliza el modus ponens [(A =&gt; B),A] =&gt; B.<\/p>\n<p>Analicemos el cl\u00e1sico ejemplo sobre S\u00f3crates.<\/p>\n<p>Todos los hombres son mortales<br \/>\nS\u00f3crates es hombre<\/p>\n<p>S\u00f3crates es mortal<\/p>\n<p>Su representaci\u00f3n l\u00f3gica ser\u00e1<\/p>\n<p>Para todo X hombre(X) =&gt; mortal(X)<br \/>\nExiste S\u00f3crates y hombre(S\u00f3crates)<\/p>\n<p>entonces mortal(S\u00f3crates)<\/p>\n<p>En PROLOG ser\u00eda.<\/p>\n<p>hombre(S\u00f3crates) &lt; &#8212;<br \/>\nmortal(x) &lt; &#8212; hombre(x)<br \/>\n? &lt;&#8211; mortal(S\u00f3crates)<\/p>\n<p>Donde hombre(S\u00f3crates) es un axioma, regla que carece de condiciones, mortal(x) es un teorema, regla con la condici\u00f3n hombre (x) y mortal (S\u00f3crates) es el objetivo a demostrar.<\/p>\n<p>Ante la pregunta mortal (S\u00f3crates) se buscar\u00e1 una regla que cumpla con la conclusi\u00f3n mortal, PROLOG tomar\u00e1 la primera regla, si esta no se cumple tomar\u00e1 otra regla. Cuando la regla se cumpla se unifica con el objetivo a demostrar (mortal) y se sustituye la variable &#8220;x&#8221; por S\u00f3crates y se pasa a ejecutar las condiciones, en caso que alguna de las condiciones no se cumpla se da marcha atr\u00e1s y se selecciona una nueva regla que unifique con hombre. En nuestro ejemplo la regla mortal est\u00e1 compuesta por una sola condici\u00f3n hombre (x) y para que se cumpla basta que exista una regla que tenga como conclusi\u00f3n a hombre (S\u00f3crates),o sea &#8220;x&#8221; igual a S\u00f3crates, si la encuentra se unifica con ella.<\/p>\n<p>Como hombre (S\u00f3crates) no tiene condiciones, es un axioma, cumple la condici\u00f3n hombre y como no existen m\u00e1s condiciones a cumplir, entonces se cumple la regla mortal (S\u00f3crates), con lo que, se demostr\u00f3 el objetivo: S\u00f3crates es mortal.<\/p>\n<p>Una de las grandes ventajas del PROLOG es su potencia para con pocas reglas obtenerse variadas interpretaciones, a diferencia de los lenguajes imperativos donde cada hecho requiere de un procedimiento o lo que es lo mismo secuencias r\u00edgidas de pasos para su ejecuci\u00f3n.<\/p>\n<p>En PROLOG basta declarar algunas reglas que representen a los hechos.<\/p>\n<p>Por ejemplo si tenemos las reglas:<\/p>\n<p>Padre (Juan, Luis) &lt;&#8211;<\/p>\n<p>Padre (Luis, Jose) &lt;&#8211;<\/p>\n<p>Padre (Pedro, Luis) &lt;&#8211;<\/p>\n<p>Notar que todas las reglas carecen de condiciones (son axiomas).<\/p>\n<p>Con estas tres reglas se puede buscar un abuelo o un hermano o un t\u00edo basta plantear como objetivos a demostrar<\/p>\n<p>? &lt;&#8211; Padre (x,y) Padre (y,z)<\/p>\n<p>y encontraremos un abuelo en &#8220;x&#8221;<\/p>\n<p>o ? &lt;&#8211; Padre (x,y) Padre (x,z)<\/p>\n<p>Donde &#8220;y&#8221; y &#8220;z&#8221; ser\u00e1n hermanos<\/p>\n<p>o tambi\u00e9n ? &lt;&#8211; Padre (x,y) Padre (x,z) Padre (y,s)<\/p>\n<p>y obtendremos en &#8220;z&#8221; un t\u00edo<\/p>\n<p>Observen que el objetivo puede ser una condici\u00f3n como en el caso de mortal (S\u00f3crates) o varias condiciones.<\/p>\n<p>Analicemos el objetivo abuelo. Para solucionarlo la m\u00e1quina de inferencia tendr\u00e1 que localizar un padre (x,y) entre las reglas padres y a su vez encontrar otra regla que tenga como padre a &#8220;y&#8221; de &#8220;z&#8221;. Las cuales ser\u00edan padre Juan de Luis y padre Luis de Jos\u00e9, lo cual implica que Juan es el abuelo de Jos\u00e9.<\/p>\n<p>Tambi\u00e9n es posible definir una regla abuelo como sigue:<\/p>\n<p>Abuelo (x,y) &lt; &#8212; Padre (x,z) Padre (y,z)<\/p>\n<p>y entonces la pregunta se reducir\u00eda a<\/p>\n<p>? &lt;&#8211; Abuelo (x,y)<\/p>\n<p>El resultado a imprimir ser\u00eda Juan, Jos\u00e9.<\/p>\n<p>Otra posibilidad ser\u00eda saber de qui\u00e9n es abuelo Juan.<\/p>\n<p>? &lt;&#8211; Abuelo (Juan,x)<\/p>\n<p>La regla anterior &#8220;Abuelo&#8221; est\u00e1 limitada a Abuelo por parte de padre, en PROLOG basta modificar la regla Abuelo y agregarlas reglas progenitor como sigue:<\/p>\n<p>Abuelo (x,y) &lt; &#8212; Padre (x,z) Progenitor (y,z)<\/p>\n<p>Progenitor (x,y) &lt;&#8211; Padre (x,y)<\/p>\n<p>Progenitor (x,y) &lt;&#8211; Madre (x,y)<\/p>\n<p>De igual forma se puede agregar las reglas T\u00edo, Hermano, Sobrino, Hijo etc., sin necesidad de alterar el programa.<\/p>\n<p>Si quisi\u00e9ramos saber donde trabaja Juan y quienes trabajan en computaci\u00f3n, en lenguajes de tipo Pascal, cada caso ser\u00eda independiente. En PROLOG basta definir las reglas trabaja (x,y), donde &#8220;x&#8221; es el nombre (Juan) y &#8220;y&#8221; el lugar (computaci\u00f3n), solo se necesitar\u00e1n dos preguntas trabaja (Juan,x) para el primer caso o trabaja (x, computaci\u00f3n) para el segundo caso.<\/p>\n<p>PROLOG es un lenguaje que se encuentra en sus inicios, para muchos su desarrollo es equivalente a las primeras versiones de FORTRAN. Como lenguaje de programaci\u00f3n l\u00f3gica debe a\u00fan recorrer un largo camino evolutivo, pero lo que nadie duda es que PROLOG, hasta la fecha actual, es el lenguaje que m\u00e1s se acerca a la forma de pensar del hombre y no es por gusto que los japoneses lo escogieron como lenguaje n\u00facleo para su proyecto de la quinta generaci\u00f3n de computadoras.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En sus inicios la actividad de la computadora estuvo limitada exclusivamente al c\u00e1lculo num\u00e9rico. Si bien es cierto que las m\u00e1quinas fueron construidas principalmente para realizar operaciones aritm\u00e9ticas, ellas son capaces de ejecutar tareas no num\u00e9ricas, como resolver problemas \u201cl\u00f3gicos\u201d. En realidad la computadora est\u00e1 dotada para procesar \u201cs\u00edmbolos\u201d, el que estos fuesen utilizados como [&hellip;]<\/p>\n","protected":false},"author":109,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[9],"tags":[],"_links":{"self":[{"href":"https:\/\/blogs.sld.cu\/cibernetica\/wp-json\/wp\/v2\/posts\/36"}],"collection":[{"href":"https:\/\/blogs.sld.cu\/cibernetica\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.sld.cu\/cibernetica\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.sld.cu\/cibernetica\/wp-json\/wp\/v2\/users\/109"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.sld.cu\/cibernetica\/wp-json\/wp\/v2\/comments?post=36"}],"version-history":[{"count":0,"href":"https:\/\/blogs.sld.cu\/cibernetica\/wp-json\/wp\/v2\/posts\/36\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.sld.cu\/cibernetica\/wp-json\/wp\/v2\/media?parent=36"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.sld.cu\/cibernetica\/wp-json\/wp\/v2\/categories?post=36"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.sld.cu\/cibernetica\/wp-json\/wp\/v2\/tags?post=36"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}