Logic Programming

Una introducción formal y practica: entendiendo Prolog

Martin Manriquez Leon
GDG IPN
8 min readJun 7, 2019

--

Dentro de los distintos paradigmas de programación podemos encontrarnos con “Logic Programming ” un paradigma sumamente interesante ya que nos fuerza a definir las reglas, estructuras y hechos lógicos lo mas precisas posibles. Este paradigma es muy utilizado en distintos campos de la inteligencia artificial, en especial en el procesamiento de lenguaje artificial y las areas con un enfoque principal en la IA simbólica , la cual trata de representar las cosas del mundo real mediante la abstracción a travez de la
computadora como “ símbolos “.

Una “cosa”, digamos un automóvil, podría representarse como un objeto de software o un registro de base de datos, y se describiría mediante un conjunto de atributos, como: fabricante, modelo, color, tipo de motor, peso, número de pasajeros, número de puertas, y así sucesivamente, definiendo cada uno de los atributos que definen dicho objeto. Todos estos valores diferentes que describen el automóvil se almacenarán dentro de la computadora como variables que tienen un valor: el símbolo (= propiedad) “fabricante”, por ejemplo, podría tener el valor “Toyota” o “BMW” o “Fiat . ” A partir del conjunto de atributos validan de que tipo o modelo es el objeto.

Contrasta esto por un momento con la forma en que funciona nuestro cerebro. Si abrimos una computadora, encontraremos una ubicación de memoria particular en la que se almacena el valor de la variable “fabricante”. La computadora almacena los símbolos, es decir, las variables y sus valores, directamente. Por otro lado, es poco probable que la apertura de un cerebro humano revele una ubicación particular donde, por ejemplo, se almacene el nombre “Toyota”. Debe estar almacenado en algún lugar , pero no parece que esté perfectamente escondido entre las neuronas 13776 y 13781 (aunque no sabemos cómo funciona el almacenamiento de datos en el cerebro, por lo que podemos estar equivocados al respecto). Por lo que sabemos, parece que la información en el cerebro no se almacena en forma de símbolos explícitos, sino en forma de símbolos. conexiones entre las células del cerebro (neuronas). Recordar el nombre “Toyota” significaría que dentro de un grupo de neuronas en algún lugar del cerebro, hay una conexión más fuerte entre recordar la letra “T” y, inmediatamente después, asociarlo con la letra “O” (y así sucesivamente). La palabra completa, a su vez, se recuerda cuando otro grupo de neuronas (responsables de la visión) reconoce una forma particular en el campo de visión de uno: la forma de un automóvil de ese tipo. Y así. Por lo tanto, el almacenamiento de la palabra “Toyota” no está aislado en el cerebro, como lo está en una computadora convencional. En su lugar, se distribuye ampliamente en múltiples neuronas y se conecta con varios subsistemas neuronales que son responsables del procesamiento de la visión, el recuerdo de letras y palabras, la memoria, incluso el olor: si, como niño, uno asoció el olor de un ambientador particular con el Toyota de la familia, luego ese olor probablemente causará un retiro de la memoria de “Toyota” más adelante en la vida. Y esto sucederá incluso si no hay ningún automóvil real presente cerca.

Podemos ver cómo a veces la cognición es independiente de los símbolos. Por ejemplo, podríamos reconocer el olor de un lugar. Podríamos referirnos a él cuando hablamos con otros como “ ese olor, ya sabes, de ese lugar en particular” (que en realidad no describe nada, ya que carecemos de un buen vocabulario para describir olores). Entonces, en este caso, podemos reconocer e identificar un olor de manera confiable, pero este procesamiento no es simbólico: el reconocimiento del olor no está mediado por palabras y etiquetas que adjuntamos a la impresión del olor. En cambio, procesamos el olor directamente, como un olor, y esto es presumiblemente lo que haría un perro cuando reconoce el olor de su dueño sin el uso de una descripción explícita en palabras.

Prólog

Volvamos ahora al procesamiento simbólico. Este es el tipo de procesamiento que asociamos con los lenguajes de programación tradicionales, como C o Pascal, pero también con la lógica formal, las matemáticas e incluso el lenguaje cotidiano: decir una palabra, por ejemplo “copa”, es un acto de procesamiento simbólico. En lugar de tratar realmente con una taza física, estoy procesando un símbolo para una taza en mi mente: la palabra “taza”. ( Lea más sobre los símbolos aquí ).

Prolog, un lenguaje de programación desarrollado a principios de la década de 1970, combina este enfoque simbólico con conceptos básicos de la lógica formal, para hacer posible la programación de computadoras “declarativamente”. La mayoría de los lenguajes de programación comunes son imperativos.Idiomas: le dicen a la computadora exactamente qué hacer y cómo hacerlo, paso a paso. Por ejemplo, para vender un producto en un sitio web de Internet, el proveedor debe (1) mostrar la imagen del producto y un botón para comprarlo; (2) si se presiona el botón, la identificación del producto debe transferirse a la estructura del carrito de compras; (3) cuando el cliente ha terminado de comprar, presiona otro botón para pagar; (4) si se presiona el botón de salida, el sitio web muestra el contenido del carrito de la compra con sus respectivos precios y un botón para completar la transacción; (5) cuando se presiona ese botón, la cantidad mostrada se deduce de la tarjeta de crédito del usuario; (6) si no tiene una tarjeta de crédito registrada, se debe mostrar el formulario para ingresar los detalles de la tarjeta de crédito; y así.

A la inversa, en un lenguaje declarativo, el programador “declara” qué relaciones existen entre los símbolos (que, a su vez, representan cosas en el mundo) y luego deja que el programa encuentre una solución al problema. Por ejemplo:

Después de ingresar estos “hechos” en el sistema Prolog, podríamos hacer una pregunta en forma de consulta:

El sistema Prolog intentaría entonces hacer coincidir la variable X (tenga en cuenta que es una letra mayúscula, ¡lo que le dice a Prolog que esta es una variable!) Con los nombres dados en la recopilación de datos. Entonces daría las respuestas:

Pero podemos hacer más con Prolog. Podríamos, por ejemplo, definir un predicado de dos puestos de TeacherOf (profesor, alumno), para registrar quién está enseñando a quién:

Esto funciona como cabría esperar: teacherOf (X, mary) devolvería X = john.

Pero podemos hacer más con eso. Ahora podemos definir un predicado “compañero de clase” que utiliza el predicado del maestro. La idea es que un compañero de clase es alguien con quien tienes el mismo maestro:

El “: -” significa que la expresión de la izquierda será verdadera si las expresiones de la derecha son verdaderas. Solo puedes leerlo como “si”. Las comas en el lado derecho (“,”) expresan un “y” lógico. Eso significa que todaslas expresiones de la derecha deben ser verdaderas para que el sistema considere que el compañero de clase predicado es verdadero.

Relacionados: ¿Las sillas piensan? Los tres tipos de equivalencia de AI

Ahora podemos preguntar:

Eso significa: ¿Quién (X) es compañero de clase de Pedro? El sistema responde:

Ups. Algo extraño sucede aquí. ¿Qué exactamente? Bueno, si miras al compañero de clase predicado, ¡nunca dice que uno no puede ser tu propiocompañero de clase! Ya que todos tienen el mismo maestro que uno mismo, lógicamente, ¡todos los que son estudiantes siempre son también sus propios compañeros!

Si quisiéramos cambiar eso, tendríamos que excluir el caso de que alguien sea nuestro propio compañero de clase, como este:

El operador “\ =” en Prolog significa “no igual”, de modo que en este caso se requiere además que X sea diferente de Y. Veamos:

Respuesta: X = maría, que es la respuesta esperada.

También podemos intentar:

lo que responde correctamente a falso, lo que significa que no se puede encontrar una solución, ya que Sandy no es un estudiante sino un maestro, y limitamos explícitamente el predicado del compañero de clase a los estudiantes.

Sintaxis y significado

Observe que el sistema no sabe nada acerca de los maestros, los alumnos o Peter, Sandy o Mary. Los símbolos “profesor”, “estudiante”, etc. son simplemente eso: símbolos, palabras que representan algo en la mente del observador del programa, pero que no significan nada para el programa en sí. ¡El programa simplemente utiliza los mismos símbolos que usó el operador humano, y depende completamente del operador proyectar una interpretaciónadecuada en esos símbolos!

Por ejemplo:

Aunque este intercambio no tiene sentido, porque “gugu” y “lala” no son palabras que tengan algún significado en nuestro idioma, Prolog las tratará como a cualquier otro símbolo, diga “gato” o “perro”. Porque, por supuesto, para Prolog “gato” y “perro” tampoco tienen ningún significado. Son exactamente tan significativos para el sistema como “gugu” y “lala”. Palabras como “gato” y “perro” solo tienen significado para el operador humano, no para el sistema.

Relacionado: Briefing: El argumento de la sala china.

Manipulación sintáctica

Esta es a la vez la característica principal y también el problema central de la IA simbólica de este tipo: que los símbolos que usa no tienen ningún significado dentro de la computadora. Su manipulación no se basa en ningún significado, sino en propiedades sintácticas, es decir, posicionales de un símbolo dentro de una expresión. “Gugu (X)” en Prolog le dará a X cualquier valor que aparezca en la base de datos de hechos entre corchetes para “gugu ()”, sin que le moleste la pregunta qué podría significar “gugu”.

Esto es, en cierto sentido, lo que sucede dentro de la Sala China . La persona que se encuentra dentro de la habitación manipulará los caracteres chinos de acuerdo con la apariencia y la forma en que coinciden con los personajes de su libro de reglas, sin considerar su significado (porque no habla chino). De hecho, el argumento de la Sala China se inspiró en los sistemas de inteligencia artificial simbólica de tipo Prolog, y se entiende directamente como una crítica de la idea de que tales sistemas podrían alcanzar una comprensión genuina.

Con esto, llegamos al supuesto central de la IA simbólica:

Si la manipulación del símbolo conserva las relaciones originales entre los símbolos, la asignación del símbolo al significado puede dejarse en la mente del operador.

O, como lo expresó John Haugeland : “Cuida la sintaxis, y la semántica se cuidará sola”.

Quizás debería mencionarse que no todas las IA simbólicas tienen este problema. SHRDLU es un ejemplo de un sistema de inteligencia artificial simbólica que no está afectada por las críticas del cuarto chino, ya que lo hace tener una especie de “comprensión” de lo que los símbolos que utiliza media. Los símbolos como “una caja azul” o “una pirámide roja” representan objetos particulares que el sistema puede reconocer y manipular, y por lo tanto no son simples símbolos sin significado, sino representaciones significativas de objetos reales que el sistema puede experimentar. En este caso, diríamos que los símbolos de SHRDLU están “conectados a tierra”, lo que significa que tienen objetos correspondientes en el “mundo real” del sistema (incluso si ese “mundo real” es en sí mismo una simulación).

No te pierdas las próximas entregas suscribiéndote 👻

Proxima entrega:
Usando logic Programming en Python3

Futura entrega:
Usando logic Programming en Lisp

Futura entrega:
Usando logic Programming en Haskell

Futura entrega:
Resolviendo casos de complejidad p:p con logic Programming en Haskell

Resources:

--

--

Martin Manriquez Leon
GDG IPN

GDG and Facebook Deveveloper Circle Lead 💙Passionate about M.L.🔬 DataSciences 🧮 & Astronomy 🛰