Showing posts with label inteligencia artificial. Show all posts
Showing posts with label inteligencia artificial. Show all posts

Friday, May 12, 2023

Los claroscuros de la Inteligencia Artificial


Hoy el tema de la Inteligencia artificial (IA) está en boca de todos. Hay un sinfín de tik-toks mostrando diversos sitios web que hacen algo relacionado con el tema. Unos sitios prometen generar avatares en 3D dando solamente la descripción, otros supuestamente muestran mejores sitios que ChatGPT, unos más hacen resúmenes de noticias, etcétera. 

Yo hace tiempo encontré un sitio, http://watermarkremover.io, capaz de quitar la marca de agua de las imágenes. Para quien nunca haya visto estas marcas, son las que tienen los billetes de diversas denominaciones para evitar la falsificación. En el caso de fotografías, se usan para proteger la imagen misma sin que por ello no se pueda ver la propia imagen. Las marcas de agua las usan los sitios de venta de fotografías profesionales. como StockPhoto, Getty Images, etcétera.

Sin embargo, el problema de quitar una marca de agua ha sido atacado por los científicos. Google tiene una investigación al respecto del 2017 De acuerdo con el artículo, se busca entender las vulnerabilidades para proteger de mejor manera los contenidos gráficos digitales.

Yo, en este blog, he escrito un par de artículos al respecto (véase aquí y aquí. En uno de estos artículos hablo de cómo quitar la marca de agua de unas postales que hizo un dibujante en Islandia en 1972, durante el Campeonato Mundial de Ajedrez entre Fischer y Spassky. Dichas postales las vendía alguien pero les había agregado una marca de agua (en un tono rojizo), aunque las caricaturas de esas imágenes eran en tonos de gris. Entonces, quitar la marca de agua parecía sencillo: había que identificar los pixeles con un tono rojo y ver cómo cambiarlos, mientras que los tonos en gris no tenían que siquiera tocarse.

Escribí un programa de computadora para resolver esto, pero desde luego, el mismo no podía quitar ninguna otra marca de agua de ninguna otra foto. Sin embargo, un programa comercial llamado InPaint prometía quitar las marcas de agua si se le indicaba al software dónde se encontraban estas. Las siguientes imágenes quieren mostrarnos cómo quita InPaint automáticamente las partes indeseables, pero la realidad es que en el mundo real falla casi siempre. 




(En la primera imagen aparece una persona a la izquierda de la foto, la cual es indeseable. En la segunda foto se marca a este personaje y en la última foto se ve la imagen sin el problema). Aquí la dificultad es ¿Cómo el software sabe que donde estaba el personaje debe poner ladrillos?

Pero llegaría la IA con su propia solución. El sistema que permite quitar las marcas de agua en línea, watermarkremover, asombra. La razón es que simplemente se le da la imagen a procesar. No se le tiene que indicar en donde está la marca y el software asume -de alguna manera- donde aparece la marca de agua, hace su magia y resuelve. Para la mayoría de las fotos con marca de agua parece funcionar muy bien, pero hay los claroscuros...

Para probar le puse esta foto:

Y este fue el resultado:


Parece genial ¿verdad? Pero está mal. El algoritmo asume que hay marcas de agua que en la imagen son inexistentes y borra algunos rasgos del dibujo ((que no debería borrar). ¿Pueden ver los errores?

Desde luego que esto no invalida lo que hace este programa inteligente. Vamos, siempre habrá excepciones inmanejables y en ese sentido es cada vez más humano, que en muchos casos también maneja excepciones a cada rato. Sólo quería dejar constancia de que incluso la nueva IA tiene sus bemoles.

Wednesday, December 21, 2022

ChatGPT: El nuevo oráculo



Internet es hoy en día una necesidad. No se puede entender el mundo moderno sin conexión a la red de redes. Sin embargo, la red está soportada finalmente por una serie de servicios que las hacen manejable. Google, por ejemplo, permite hacer búsquedas sobre prácticamente cualquier tema y nos entrega resultados, a nuestras búsquedas, en segundos. Es francamente formidable. 

Uno podría pensar que no hay mucho más que inventar en este sentido. Tal vez las búsquedas aún se pueden optimizar o quizás, hacerse aún más rápidas. Pero sea como sea, hoy los buscadores de Internet nos facilitan la búsqueda de información y nos han mostrado la importancia de tener acceso a datos, asunto que por muchos años estuvo limitado. Vamos, vivimos una época increíble.

Sin embargo, "hay vida después de Google". Hace apenas unos días me enteré de ChatGPT, un modelo de la Inteligencia Artificial que interactúa con los usuarios a manera de diálogo. Este sistema entonces puede responder a preguntas, admitir errors, poner en tela de juicio premisas incorrectas e incluso, rechazar peticiones inadecuadas. ChatGPT se basa en InstructGPT, el cual es un sistema entrenado para seguir instrucciones y dar detalladas respuestas.

Así, cuando uno entra al sistema, le puede hacer alguna pregunta, por ejemplo: ¿qué significa la palabra esteganografía? A esta pregunta responde: "La palabra que buscas es "esteganografía". La esteganografía es el arte y la técnica de ocultar información dentro de archivos de imagen, de tal forma que la información sea indetectable a simple vista y sólo pueda ser recuperada mediante el uso de técnicas especiales. La esteganografía se utiliza a menudo para ocultar mensajes secretos o datos confidenciales dentro de imágenes, audio o vídeo, y se puede utilizar tanto para fines legítimos como para actividades ilegales. La esteganografía es una técnica de ocultación de información que se utiliza en la criptografía y la seguridad de la información.

Cabe señalar que se puede preguntar en cualquier idioma (yo he probado español e inglés) y el sistema arma la respuesta de inmediato. Nótese que la definición de lo que buscamos lo hace respetando las reglas de la gramática española. 

Pero el sistema hace mucho más, por ejemplo, le he pedido que escriba un programa en prolog que resuelva la paradoja del barbero. Vean lo que me ha puesto:


% Define la relación barbero/1 que indica quién es el barbero

barbero(juan).


% Define la relación corta/1 que indica quién se corta el pelo

corta(X) :- barbero(X).

corta(X) :- barbero(Y), corta(Y), X \= Y.


% Consulta: ¿Se corta el pelo el barbero?

?- corta(juan).


% Consulta: ¿Se corta el pelo alguien más?

?- corta(X), X \= juan.


Y me explica: "La primera regla define que el barbero se corta el pelo a sí mismo. La segunda regla establece que si alguien más se corta el pelo, entonces el barbero también se corta el pelo (ya que es el único que corta el pelo en el pueblo).

La primera consulta pregunta si el barbero se corta el pelo, y la segunda pregunta si alguien más se corta el pelo. Esto resuelve la paradoja del barbero, ya que demuestra que el barbero no puede ser el único que se corta el pelo en el pueblo, ya que si lo hiciera, no podría cumplir con su trabajo de cortar el pelo a otras personas".

Es decir, ChatGPT me escribe el código en el lenguaje de programación pedido y además, me explica qué hace. Esto es francamente asombroso.

Desde luego, podemos hacer peticiones menos técnicas. Se me ocurrió que el sistema me dijera algunos consejos para mejorar en ajedrez. Vean su respuesta:

Aquí hay algunos consejos que pueden ayudarte a mejorar en ajedrez:

  1. Practica: El ajedrez es un juego que requiere mucha práctica para mejorar. Trata de jugar tanto como sea posible y analiza tus partidas para aprender de tus errores.
  2. Estudia tácticas: El ajedrez es un juego táctico, por lo que es importante que aprendas a reconocer patrones tácticos comunes y a cómo aplicarlos en tus partidas.
  3. Aprende a analizar posiciones: Es importante que aprendas a analizar las posiciones del tablero y a evaluar el valor relativo de las piezas.
  4. Estrategia: Aprende a desarrollar un plan a largo plazo para tu juego y a cómo ejecutarlo efectivamente.
  5. Endgames: Aprende a jugar los finales de partida de manera efectiva. Los finales de partida pueden ser muy técnicos y requieren práctica para dominarlos.
  6. Juega contra oponentes más fuertes: Jugar contra oponentes más fuertes te obligará a mejorar y a aprender más rápido.
  7. Analiza tus partidas: Una vez que hayas terminado una partida, analiza lo que hiciste bien y lo que hiciste mal. Esto te ayudará a aprender de tus errores y a mejorar en el futuro.
  8. Participa en torneos: Los torneos son una excelente manera de poner en práctica lo que has aprendido y de medir tu progreso contra otros jugadores.
  9. Estudia partidas de grandes maestros: Aprende de los mejores jugadores del mundo estudiando sus partidas y viendo cómo juegan en diferentes situaciones.

Puede observarse que ChatGPT arma las respuestas de muchos temas. Vamos, yo le hice peticiones sobre mis intereses y esto fue lo que dio como resultado. Me parece increíble.

Otra posibilidad es la de pedirle que escrba ensayos. Veamos un ejemplo: Escribe un ensayo de 300 palabras sobre la nada. Sé que es una pregunta extraña, pero me intrigaba qué podría contestar el ChatGPT. He aquí su respuesta: 

"La nada es algo que, aunque puede parecer un concepto abstracto y difícil de comprender, es fundamental para entender el mundo que nos rodea. Desde el punto de vista filosófico, la nada es la ausencia total de algo, el vacío absoluto sin presencia de materia, energía o cualquier otra cosa. Esta idea de la nada ha sido un tema de debate desde hace mucho tiempo, y ha sido abordada por filósofos de diferentes épocas y culturas.

Para algunos filósofos, como Parménides y Platón, la nada es algo que no puede existir, ya que consideran que todo lo que existe es necesariamente algo. Según esta visión, la nada es simplemente una carencia de ser, una ausencia de existencia. Otros filósofos, como Epicuro y Lucrecio, argumentan que la nada es una realidad, y que es la base de todo lo que existe. Según esta visión, la nada es el espacio vacío que rodea a las cosas, y es el lugar donde las cosas pueden existir y moverse.

Aunque la nada puede ser difícil de comprender, es importante recordar que no es algo que podamos experimentar directamente. La nada es simplemente la ausencia de algo, y no podemos experimentar la ausencia de algo de forma directa. En este sentido, la nada es un concepto abstracto y es difícil de definir o comprender plenamente.

A pesar de esto, la nada es un concepto fundamental en muchas áreas de la vida y del conocimiento. En la física, por ejemplo, la nada es el espacio vacío que rodea a las partículas subatómicas y es fundamental para entender cómo funciona el universo. En la filosofía, la nada es un concepto clave para entender el concepto de ser y la naturaleza del mundo. Y en la literatura y el arte, la nada es un tema recurrente que ha sido explorado de muchas maneras diferentes a lo largo de la historia.

En resumen, la nada es un concepto abstracto y difícil de comprender, pero es fundamental para entender muchos aspectos del mundo que nos rodea. Aunque no podemos experimentar la nada directamente, es un concepto que ha sido abordado por muchos filósofos y es un tema de gran importancia en muchas áreas del conocimiento." (Cabe señalar que son 365 palabras).

No me cabe duda que esto es un gran avance y que en un futuro relativamente cercano, los buscadores entrarán en este tipo de sistemas de diálogo con mucha más frecuencia. Y como toda tecnología tare cosas buenas y malas. Ahora en las escuelas y universidades no se podrá pedir un ensayo porque ChatGPT o cualquier otro esquma similar, podrá hacernos la tarea. Aquí los profesores y académicos tendrán que estar mucho más atentos en los trabajos que hacen los alumnos.

Puede accederse aChatGPT (hay que darse da alta con una cuenta de correo) en https://chat.openai.com/chat.

Monday, May 31, 2021

La versión final de mi artículo sobre corrección ortográfica



Ya hablé aquí de la aceptación de mi artículo para el Congreso Mexicano de Inteligencia Artificial, que se llevó a cabo de manera virtual a fines de mayo. El tema que traté fue un sistema experto para hacer corrección ortográfica a partir de reglas gramaticales, en lugar de usar un enorme diccionario de términos. 

Brevemente, la historia de este artículo viene desde 1988, cuando hice el posgrado en el Reino Unido, en Inteligencia Artificial, en la Universidad de Essex. Ahí aprendí a usar algunas herramientas y metodologías para trabajar con los problemas que bien podían ser parte de lo que hoy llamamos la Inteligencia Artificial. Así, aprendí Prolog y este nuevo paradigma de programación resultó la herramienta fundamental para el desarrollo de mi corrector ortográfico.

Cuando regresé a México, un par de años depués (1991), comencé a escribir el mencionado corrector, que bauticé como Lapsus. Usé Turbo Prolog 2.0, el cual era una de las versiones más sencillas y poderosas del momento, aún en MsDOS. Esta versión del lenguaje me permitió un desarrollo rápido y en un par de semanas tenía una primera versión, la cual tomaba como entrada un archivo de texto y hacía la corrección en modo batch, es decir, no en tiempo real sino una vez que el documento ya estaba todo escrito. Eran los tiempos en donde había limitaciones de hardware y software mucho más serias que ahora. De hecho, la versión en Prolog incluía un editor tipo WordStar, el estándar de facto de la época, en donde el usuario podía escribir su documento.

Pero pasaron los años y las interfaces gráficas hicieron su aparición. Entonces las suites de Office, como MsOffice, tendrían un desarrollo acelerado y se convertirían en parte de las herramientas de software que prácticamente todos los usuarios deben tener en una computadora moderna. Entonces pensé que Lapsus debía ser portado de manera que se comunicara con Word, que era el software que mucha gente usaba, y así hacer la corrección ortográfica vía reglas.

Primero usé Data Dynamic Exchange (DDE), de Microsoft, que resultó muy difícil de usar, con un sinfín de problemas. La solución llegó cuando la empresa de las ventanas sacó el protocolo OLE (Object Linking and Embedded), el cual permitía una comunicación entre programas de terceros y Office. Usando entonces Delphi, escribí la versión de Lapsus para Windows, la cual permite al usuario de MsOffice usar el corrector por reglas, pues éste se comunica con Word automáticamente y pasa cada palabra a Lapsus, la revisa y si halla problemas, regresa el resultado con los mensajes de error apropiados.

Una simpática anécdota fue cuando hablé con algunos amigos de Microsoft y les pedí que revisarán mi idea, a ver si la incorporaban eventualmente en Word. Se tomaron la molestia de hacerlo y concluyeron que la idea era simpática, pero que no veían en ella un gran futuro. 

Aún así, el trabajo estaba hecho y ahora con el Congreso de IA, decidí probar suerte para publicar formalmente el trabajo realizado. Fue aceptado y ya tengo la versión final. He aquí el borrador final para quién le interese. Se puede descargar de este enlace.


Wednesday, May 12, 2021

Aceptaron mi artículo para el XIII Congreso de Inteligencia Artificial


Hace unas semanas salió la convocatoria del Congreso Mexicano de Inteligencia Artificial (COMIA), el cual se llevará a cabo -de manera virtual- del 18 al 21 de mayo de este año 2021. Organiza la Sociedad Mexicana de Inteligencia Artificial (SMIA), que tiene sede en la Universidad de Sonora. 

Así que decidí mandar un artículo sobre una idea que tuve, que fue la motivación para hacer la maestría, y que consiste en hacer corrección ortográfica usando reglas. El español tiene una estructura muy interesante y muchas palabras caen en ciertas reglas. Por ejemplo, la palabra "enbiar" está mal escrita porque hay una regla que dice: "las palabras que contienen "nb" siempre se escriben con "v", es decir, "nv". Por tanto, "enviar" debe escribirse así.

En el manual de ortografía de Larousse, hay alrededor de 260 reglas de uso frecuente en el español. Así entonces, desde 1991 comencé a trabajar en esta idea. Primero hice una versión en Prolog, la cual es en realidad un sistema experto tradicional, con reglas IF THEN. Codifiqué las reglas ortográficas como predicados de Prolog e hice un sistema que permitía la corrección de textos a partir de las mismas. La virtud es que para esto no se necesita un diccionario enorme de palabras, como en el caso de correctores como Word, por ejemplo.

Desde luego que un buen corrector requiere de diversos tipos de técnicas para la corrección de las palabras. Nunca sobra un buen diccionario. Igualmente, se puede tener un diccionario de palabras de uso común, el cual nos permite incluso insertar términos que podrían estar mal escritos pero que por alguna razón se escriben de esta manera. Por ejemplo, la palabra "Volzas" la usan en una empresa que hace bolsas. Desde luego está mal escrita pero si yo tuviese esta palabra en mi diccionario personal, podría aceptar el término sin necesidad de indicar que formalmente está mal escrito. Igualmente, hay muchos términos que se usan en las profesiones que no ncesariamente se pueden encontrar en muchos diccionarios. Si se pudiesen alimentar estos términos en un diccionario del usuario, la corrección podría ser mucho más ágil.

Lapsus, como bauticé a mi software, tiene pues una larga historia... He aquí lo que publiqué en el blog hace tiempo:

Lapsus: anatomía de un corrector ortográfico I

Lapsus: anatomía de un corrector ortográfico II

Lapsus: anatomía de un corrector ortográfico III

Lapsus: anatomía de un corrector ortográfico IV

Lapsus: anatomía de un corrector ortográfico V

Lapsus: anatomía de un corrector ortográfico VI

Lapsus: anatomía de un corrector ortográfico VII

En fin, escribí mi artículo y me acaban de avisar que se publicará en un número especial de la revista Research in Computing Science, de publicación periódica con ISSN, indexada en Latinindex y DBLP.

Este sería mi segundo artículo publicado en revista arbitrada... 


Friday, March 17, 2017

La tecnología contra el fraude nigeriano



Hace unos pocos días me llegó el correo de una señora que no me conoce, que dice estar muy enferma, que se va a morir y que quiere donarme el 40% de su fortuna. El resto -me pide- lo done a un orfanato. Su carta está llena de bendiciones, de la palabra "Dios todopoderoso y misericordioso", y el tono beático de la misiva hace suponer que se trata de una persona caritativa y bondadosa. Aparentemente la señora me escribe desde Israel.

Por supuesto que esto no es otra cosa más que el fraude nigeriano, en donde un desconocido te ofrece millones de dólares para depositar en tu cuenta a cambio de nada. Claro que para que esto funcione, debes mantener la secrecía de la transacción porque si no, quién sabe qué podría ocurrirte. El trámite para dizque depositarte los millonarios fondos busca hacerse rápido y a final del día podemos concluir que la carta en cuestión cumple con todas las características de un posible fraude: debe hacerse a escondidas; es muy tentador y es a la "voz de ya".

La enferma señora, para probar que es una persona real, me manda una foto en donde está acostada y hay dos enfermeras a su alrededor. Es claro que hoy en día cualquiera puede sacar una foto de Internet y mandarla a quien quiera diciendo que es esa persona.

En todos los fraudes se ofrece algo muy atractivo, en este caso millones de dólares, los cuales uno podría obtener sin mover un dedo. Suena maravilloso pero es irreal. Y ¿por qué la gente cae en estos fraudes? Porque la ambición nubla el juicio. Eso lo saben todos los ladrones y defraudadores. Conocen la naturaleza humana. Es por eso que este "fraude nigeriano" sigue pululando en Internet.


Pero regresando a la carta que me mandó la desahuciada señora, ¿podría demostrar que esa foto que me mandó la sacó de Internet? (es la foto que pueden ver arriba). Recordé entonces que Google ha trabajado extensivamente en el tema. Hay por ahí la anécdota (que no sé si sea apócrifa) en donde Marvin Minsky, uno de los pioneros de la Inteligencia Artificial, le dijo a un alumno que para su proyecto de verano hiciese lo siguiente: tomase una fotografía cualquiera y que su programa le dijera qué hay en la imagen en cuestión. Parece ser que Minsky no tenía muy claro que cualquier problema en la IA no es difícil, sino mucho más difícil de lo que se pensaba. Así, este "proyecto de verano" ha llevado a la comunidad de la IA muchos años de trabajo y aún no está totalmente resuelto.

Aún así, Google ha puesto a disposición de sus usuarios una página para precisamente buscar imágenes para ver si ésta se encuentra dentro de alguno de los miles de millones de sitios que hay en la red de redes. Y prácticamente de forma instantánea el sistema encontró al foto en diferentes sitios que venden fotografías para portadas, revistas, anuncios, etcétera. La imagen en cuestión está en este enlace y la defraudadora pretendía demostrarme que es una anciana en el hospital con poco tiempo de vida.

Interesante es ver que el sistema halló como mejor búsqueda a través de las palabras "hospital" y "bed". Esto quiere decir que el sistema reconoció la imagen y entonces procedió a su búsqueda. Con esto debe quedar claro que toda esa carta es una farsa (y aunque no hubiese hallado la imagen, es evidente el potencial fraude). Vamos, para hacer énfasis en este asunto: ningún desconocido va a ofrecerte por tu linda cara millones de dólares. Eso es ridículo.

Pensando en esta interesante manera de buscar, me encontré que cuando entro a Facebook el sistema me indica sobre posibles amigos. Ahí está la foto de una mujer muy guapa (Didde Akhila). Ya puede uno ponerse a sospechar que probablemente es un usuario falso. ¿Cómo probarlo? No es difícil: primero, su perfil prácticamente está vacío o casi no dice nada. Por otra parte tiene muchos contactos, la mayoría hombres. No hay nada más en este perfil.


Pues bien, tomé la foto de su perfil y le pedí a Google Image Search que me buscara esta imagen... Y la halló en segundos: Es una imagen de "wallpaper" que se encuentra en el sitio: http://wallpaperswide.com/most_beautiful_woman-wallpapers.html. La encontró bajo las palabras " beauty girl in world". Y sí, podría pasar que ese perfil es de esa guapa joven aunque yo, francamente, lo dudo absolutamente.

La verdad es que este buscador por imágenes es una herramienta formidable.

Monday, November 24, 2014

La computadora creativa


Las computadoras saben hacer muchas tareas que asombran a los seres humanos. Por ejemplo, pueden hacer complejos cálculos o bien, manejar bases de datos con suma agilidad. Pueden jugar ajedrez como el Campeón Mundial y pueden incluso ganarle a los mejores seres de carne y huesos en el popular programa Jeopardy!, en los Estados Unidos. Sin duda la tecnología de hardware y software avanza a pasos agigantados y esto se refleja en programas más inteligentes, más versátiles, más poderosos.

No obstante esto, todavía no existe un programa que pase la Prueba de Turing, que es una idea diseñada por Alan Turing, en donde trata de demostrar que un programa puede considerarse inteligente si puede pasar esta “prueba”, que consiste en poner en una terminal a una persona y en otra a una máquina, y hacer que ambos platiquen a través del monitor. Si el ser humano no puede distinguir que está platicando con un programa, Turing indica que el programa entonces puede calificar como inteligente.

Searle, un filósofo y matemático norteamericano, indica que no necesariamente la idea de Turing prueba algo. Para ello, define el problema con un contraejemplo llamado “el cuarto chino”, en donde en un cuarto cerrado alguien se comunica en chino con quien esté adentro del mismo, a través de grandes cartulinas. El personaje adentro tiene libros en chino que le dicen qué símbolos poner a los símbolos que le llegan del exterior. La persona dentro del cuarto escribe estos resultados y los manda fuera del cuarto. Para el que está afuera, quien sea que esté adentro, es claro que entiende chino. Sin embargo, el personaje que está adentro solamente sigue instrucciones ciegamente y aunque manda respuestas coherentes, no entiende una palabra de chino. Searle se pregunta si la prueba de Turing siquiera tiene validez.

Tal vez entonces la solución al asunto de saber si una máquina califica como inteligente se base en la creatividad. Los seres humanos somos creativos ¿no? ¿Los son las máquinas? No es fácil saberlo. Pensemos por ejemplo en programas que componen música… ¿lo pueden hacer con creatividad? ¿los resultados que entreguen son interesantes en términos creativos o bien, se notan “automatizados”, como siguiendo un patrón específico invariante? De nuevo, difícil saberlo e incluso, muchas veces podría depender de quién escuche el resultado. Para el lego, tal vez música escrita por un programa automático le parezca compuesta por un ser humano pero para un experto, quizás note una peculiar diferencia que le haga pensar que esa música no está escrita por seres humanos como él.

Podemos quizás entonces hablar de poesía. ¿Puede realmente la máquina escribir poesía como Borges hacía? Hay programas que hacen esto, pero de nuevo, valorar si hay creatividad en ellos no parece algo sencillo. Bueno, entonces podríamos pensar en programas que hagan haikús, pero de todas maneras parece sr poco posible llegar a una conclusión sobre la creatividad de estos sistemas. Porque por ejemplo, en un haikú, las palabras se refieren a cosas, a sentimientos, a hechos, a acciones. ¿Sabe la máquina de ello? ¿Entiende el contexto? Probablemente no, y entonces “se nos cae el teatrito” porque si no entiende lo que está haciendo, entonces ¿cómo podemos considerar que algo es inteligente?

Pero a todo esto, uno de los sistemas don más éxito en términos de inteligencia ha sido el ajedrez. Hoy en día programas como Komodo o Houdini juegan notablemente bien y diría yo, compiten sin menoscabo con los mejores jugadores del planeta. Pero ¿son inteligentes? No sé decirlo, porque como alguien me comentaba alguna vez: “el programa no sabe siquiera que está jugando al ajedrez. Mueve las piezas y peones y da jaque mate incluso, pero en el fondo, en su memoria, solamente mueve de un lado a otro bytes. Entonces, para decirlo de una forma coloquial, ‘no hay nadie en casa’. Eso no parece ser la definición de inteligencia”.

Y si menciono todo esto es porque acabo de saber de un programa que hace problemas de ajedrez. En este mundo del juego ciencia, hay problemas compuestos, en donde el autor de los mismos plantea un enigma: “juegan blancas y ganan”, “juegan negras y empatan”, etcétera. Desde que el ajedrez existe, ha habido una buena cantidad de compositores de ajedrez, la mayoría rusos, como Troisky, Bron, Shinkman, Loyd, entre muchos otros. En estas composiciones muchas veces se ve la riqueza de recursos en ajedrez y la creatividad de los problemistas. Pero un programa compositor de problemas de ajedrez, suena extravagante, por decir lo menos.

El doctor Azlan Iqbal ha escrito un programa que hace esto. El “abstract” (resumen) de un artículo que escribió al respecto dice, en sus partes relevantes: “Los compositores automáticos de problemas de ajedrez son relativamente ratos comparados contra los programas que juegan al ajedrez. Esto es discutible porque ellos esperan demostrar más creatividad que la que se necesita para solamente jugar bien. La creatividad, como un proceso, se entiende muy pobremente de forma científica, a todo esto.  En una investigación previa, fue desarrollado un modelo sobre la estética del ajedrez e incorporado a un programa denominado Chesthetica, que puede ser usado para evaluar la belleza de miles de problemas de mate en tres en una manera similar que se correlaciona con las valoraciones que hacen los seres humanos. Si un embargo, esto no es suficiente para darle la capacidad al programa de componer problemas que de forma independiente la gente considere interesantes.  Por ello, un nuevo enfoque llamado DSNS (digital synaptic neural substrate) fue usado para desarrollar esta idea”.


 Así pues, se tiene un programa que compone problemas de ajedrez. Ahora habrá que valorar si los mismos tienen los conceptos que consideramos creativos, de belleza interior por sus jugadas sorprendentes o por las ideas profundas que las mismas tienen.
Vale la pena echarle un ojo.

Pero más allá del ajedrez, si el modelo teórico es funcional, se podría usar en cualquier otro tema donde existan conceptos de belleza, por ejemplo, como en el caso de la siguiente fotografía, la cual con el mismo modelos teórico se catalogó como hermosa. Parece ser que hay toda una nueva manera de analizar la creatividad. Seguiremos muy de cerca estos desarrollos.
















Referencias:

Ludwig, un programa musical (Se puede descargar gratuitamente)
Poesía computarizada
 Evaluating the Aesthetics of Endgame Studies: A Computational Model of Human Aesthetic Perception 

_____
(*) La imagen del tablero (que ilustra este artículo), presenta un problema compuesto por el programa mencionado en la tercera referencia. Juegan blancas y dan mate en tres jugadas. Esta es la solución: 1. Tg5 Rc6 2. d8=T! (2. ... d8=D ¡es tablas por ahogado!) R se mueve 3. Td6#

Thursday, May 08, 2014

Aceptado mi proyecto para "Toda la UNAM en línea"


Hace poco más de un mes salió la convocatoria para apoyar el proyecto "Toda la UNAM en línea", haciendo materiales interactivos, en línea, y no solamente para la Web sino para incluso dispositivos móviles, sobre los contenidos que la UNAM tiene de sobra.

Metí mi proyecto sobre la asignatura que doy este semestre: "Seminario de Inteligencia Artificial: Ajedrez por Computadora". Hubo que llenar montones de requisitos pero bueno, ya está. Fue aceptado y pronto tendré que trabajar más en este tema, lo cual -para quienes no lo crean aún- me hace harto feliz.

Fue, por lo que veo, el único proyecto aceptado de la Facultad de Ciencias, aunque no sé si hubo otros.

Thursday, April 04, 2013

Paradigmas en programación... ¿verdad o mentira?


Los lenguajes de programación se basan en diferentes paradigmas. Unos son imperativos. Otros usan la lógica de predicados para funcionar (como Prolog), otros más han definido la programación orientada a objetos, con los subsecuentes beneficios que esto tiene en general para los desarrolladores. Por ello, parece ser necesario saber de qué se trata esto para poder decidir -en algún momento- cuál es el lenguaje a usar.

Curiosamente, como veremos más adelante, hay algo perturbador en esta idea de los paradigmas en los lenguajes de programación y la conclusión a la que llegaremos resulta en alguna medida, inesperada. Entremos pues en materia:

Consideremos las redes semántica, las cuales se representan comúnmente como gráficas consistiendo de nodos que se conectan a través de líneas. Los nodos representan objetos y los enlaces entre nodos representan las relaciones entre esos objetos.

Una red semántica simple puede verse en la siguiente imagen:



Nótese que los enlaces son flechas, lo cual implica una dirección. Así, el perro persigue al gato pero éste no persigue al primero. Esto podría ocurrir pero la red semántica no lo plantea explícitamente.

Las redes semánticas plantean una manera muy intuitiva de representar conocimiento sobre objetos y las relaciones entre ellos. Los datos de una red así se basan en un dominio en particular. Esto hace que el esquema sea limitado. Por ejemplo, no podemos establecer la regla de que "el perro no es un gato".

Cabe decir que muchas de las relaciones son evidentes por sí mismas, pero hacen uso del conocimiento externo que tenemos del mundo. En principio, deberíamos definir dichas relaciones para evitar ambigüedades.

Herencia

Es una relación que puede ser particular útil. La idea de la herencia se entiende fácilmente de forma intuitiva. Por ejemplo, decimos que los mamíferos dan a luz bebes vivos y podemos decir también que todos los perros son mamíferos por lo que podemos concluir que un pero da a luz mamíferos vivos. Sin embargo, no estamos diciendo nada sobre el sexo del perro y por ello la relación no necesariamente sería cierta.

La herencia nos permite especificar propiedades de una superclase y así poder definir una subclase, la cual hereda las propiedades de la superclase. En nuestro ejemplo los mamíferos son una superclase y los perros una subclase.

Frames (marcos)

Los marcos son un desarrollo de las redes semánticas y permiten expresar la idea de herencia. Un sistema de marcos consiste en un conjunto de marcos (o nodos) quienes están conectados por una relación. Cada marco describe una instancia (un marco instancia) o clase (marco clase).

En este contexto, los objetos que se representan son objetos físicos pero no necesariamente tienen que serlo. Un objeto puede ser una propiedad (un color, una forma), un sentimiento, un lugar, una situación. La idea de los objetos en este sentido es idéntica a los que se ven en la Programación Orientada a Objetos (POO).

Cada marco tiene una o más ranuras, también podrían llamárseles "propiedades, a las que se le asignan valores. Esta es la manera en que una red de marcos se construye. En lugar de simplemente tener enlaces entre marcos, cada relación se expresa con un valor en una de las ranuras.

Por ejemplo, cuando decimos que "Fido es un perro" lo que queremos decir es que "Fido es una instancia de la clase perro"  o bien, que Fido es un miembro de la clase perro". Aquí la relación "es un" (is-a) es muy importante en una representación de marcos porque nos permite expresar que alguien es miembro de una clase. Esto se conoce como una generalización porque referirse a la clase de mamíferos es más general que referirse a la clase de perros y referirse a la clase de perros es más general que referirse a Fido.

Es también útil hablar de un objeto que es parte de otro objeto.  Por ejemplo Fido tiene cola, por lo que la cola es parte de Fido. Esto se llama agregación porque Fido puede ser un agregado de las partes de un perro.

Otra relación es la asociación. Un ejemplo es la relación de "perseguir" Esto explica cómo un perro y un gato están relacionados o asociados uno con el otro.

¿Por qué usar marcos?

La ventaja principal de usar sistemas de marcos es que la información de un objeto se encuentra toda en un solo lugar (esto es clásico en el paradigma de la POO). Además, la herencia puede extenderse de la siguiente manera. Por ejemplo:

Los perros persiguen a los gatos
Los gatos persiguen a los ratones

Para expresar este tipo de información, no necesitamos saber que el perro persigue al gato o que éste último persigue a los ratones. Podemos heredar la información porque un gato en particular podría ser una instancia de la clase gatos y en nuestro ejemplo, Fido es una instancia de la clase perro.

Podemos además añadir la siguiente información:

  • Los mamíferos respiran
  • Los perros son mamíferos
  • Los gatos son mamíferos

Y tenemos una superclase, mamíferos, en donde los perros y gatos son subclases. Así, no necesitamos expresar explícitamente que los perros y gatos respiran porque se puede heredar esta información.

Herencia múltiple

Es posible en un marco heredar propiedades de otro marco. En otras palabras, una clase puede ser una subclase de dos superclases y el objeto puede tener una instancia de más de una clase. Por ejemplo, podemos decir que el hombre es un constructor de casas, y que además, es un mamífero. Esto es la herencia múltiple, pero en mi opinión, es absurda si se tiene un sistema con una jerarquía bien armada. A la fecha, de hecho, no he hallado un ejemplo de la necesidad de herencia múltiple para representar conocimiento.

Procedimientos

En la POO las clases (y de hecho los objetos), tienen métodos asociados a ellos. Esto también ocurre con los marcos. Estos tienen métodos asociados a ellos llamados procedimientos.

Un procedimiento es un conjunto de instrucciones asociados al marco que puede ser ejecutado a petición. Por ejemplo, un procedimiento lector de las propiedades puede regresar un valor particular dentro del marco. Otro procedimiento puede insertar un valor en una propiedad. Un procedimiento importante es el constructor de una instancia, el cual crea la instancia de una clase.

Y si pensamos en esto, una red semántica dirigida (los marcos, pues), son un equivalente a la programación orientada a objetos, en donde se definen las propiedades de los mismos, los métodos que pueden usar y la herencia. Solamente quedaría duda de cómo usar el polimorfismo, es decir, cuándo se debe usar un procedimiento de un objeto u otro. Evidentemente esto se puede hacer y entonces, cualquier lenguaje basado en el paradigma de la POO puede ser usado para escribir programas " inteligentes". Es más, hay una clara equivalencia entre los marcos y la programación basada en la lógica de predicados y por ende, si podemos expresar un marco en la POO o bien, en la lógica de predicados, entonces en el fondo no hay un cambio de paradigma. Lo que parece ser que realmente tenemos es un esquema ded representación de conocimiento que no distingue entre paradigmas, porque en el fondo todos los lenguajes que expresan y representan conocimiento, hacen lo mismo.

Este resultado me parece asombroso en cierta medida. Así pues, no hay necesidad de elegir un lenguaje de programación que use un paradigma u otro, cualquiera puede usarse para representar conocimiento de la misma manera.

Tuesday, October 16, 2012

Premio Internacional de Divulgación de la Ciencia Ruy Pérez Tamayo


Hace aproximadamente 8 a 10 meses, salió la convocatoria -por parte del Fondo de Cultura Económica- del Premio Internacional de Divulgación de la Ciencia Ruy Pérez Tamayo, en el cual se pedían obras de corte científico para estudiantes de enseñanza media y superior. Participé con un libro que titulé ¿Pueden pensar las computadoras?

El primero de octubre de este año, se dio a conocer el ganador de dicho premio, correspondiente a Mario Jiménez Rivera, de 35 años, estudiante de posgrado de Cibnor, de La Paz, BCS. El jurado, integrado por Marcelino Cereijido, Javier Cruz Mena, Jorge Flores Valdés, Francisco Rebolledo y José Sarukhán Kermez, reconoció eb ese trabajo "erudición respecto al mundo de los tiburones, originalidad en el tema, un entusiasmo contagioso y un acertado tono divulgativo".

Y aunque no gané, aparece en las recomendaciones del jurado lo siguiente: "También se recomendó la publicación de El Higgs, el Universo líquido y el Gran Colisionador de Hadrones, presentado bajo el seudónimo Ades Campos F.T., y ¿Pueden pensar las computadoras?, presentado bajo el seudónimo La Morsa. Invitamos a ambos autores a contactar al FCE".

Así pues, me queda la satisfacción de que mi libro pudiese ser editado pronto por el FCE. La realidad es que esta noticia me ha hecho muy feliz, porque fue un trabajo que me llevó varios meses concretar en algo leíble y digerible. Así que hay una buena posibilidad de que finalmente salga un libro mío de ciencia.

Wednesday, November 30, 2011

Consciencia y prueba de Turing


En la inteligencia artificial (IA), desde el principio ha habido un gran debate sobre qué es la inteligencia. El primero en tratar de responder a esta pregunta fue realmente Alan Turing (que el año que viene se cumplen 100 años de su nacimiento). De ahí salió la ahora llamada "Prueba de Turing".

De acuerdo a wikipedia, el Test de Turing (o Prueba de Turing) es una prueba propuesta por Alan Turing para demostrar la existencia de inteligencia en una máquina. Fue expuesto en 1950 en un artículo (Computing machinery and intelligence) para la revista Mind, y sigue siendo uno de los mejores métodos para los defensores de la Inteligencia Artificial. Se fundamenta en la hipótesis positivista de que, si una máquina se comporta en todos los aspectos como inteligente, entonces debe ser inteligente.

La prueba consiste en un desafío. Se supone un juez situado en una habitación, y una máquina y un ser humano en otras. El juez debe descubrir cuál es el ser humano y cuál es la máquina, estándoles a los dos permitido mentir al contestar por escrito las preguntas que el juez les hiciera. La tesis de Turing es que si ambos jugadores eran suficientemente hábiles, el juez no podría distinguir quién era el ser humano y quién la máquina. Todavía ninguna máquina puede pasar este examen en una experiencia con método científico.

A todo esto, en 1990 se inició un concurso, el Premio Loebner, una competición de carácter anual entre programas de ordenador que sigue el estándar establecido en la prueba de Turing. Un juez humano se enfrenta a dos pantallas de ordenador, una de ellas que se encuentra bajo el control de un ordenador, y la otra bajo el control de un humano. El juez plantea preguntas a las dos pantallas y recibe respuestas. El premio está dotado con 100.000 dólares estadounidenses para el programa que pase el test, y un premio de consolación para el mejor programa anual. Todavía no ha sido otorgado el premio principal.

Pues bien, en contraposición a esta prueba esta la que planteara John Searle, la cual se describe así:

Supongamos que han pasado muchos años, y que el ser humano ha construido una máquina aparentemente capaz de entender el idioma chino, la cual recibe ciertos datos de entrada que le da un hablante natural de ese idioma, estas entradas serían los signos que se le introducen a la computadora, la cual más tarde proporciona una respuesta en su salida. Supóngase a su vez que esta computadora fácilmente supera la Prueba de Turing, ya que convence al hablante del idioma chino de que sí entiende completamente el idioma, y por ello el chino dirá que la computadora entiende su idioma.

Ahora Searle nos pide que supongamos que él está dentro de ese computador completamente aislado del exterior, salvo por algún tipo de dispositivo (una ranura para hojas de papel, por ejemplo) por el que pueden entrar y salir textos escritos en chino.

Supongamos también que fuera de la sala o computador está el mismo chino que creyó que la computador entendía su idioma y dentro de esta sala está Searle que no sabe ni una sola palabra en dicho idioma, pero está equipado con una serie de manuales y diccionarios que le indican las reglas que relacionan los caracteres chinos (algo parecido a "Si entran tal y tal caracteres, escribe tal y tal otros").

De este modo Searle, que manipula esos textos, es capaz de responder a cualquier texto en chino que se le introduzca, ya que tiene el manual con las reglas del idioma, y así hacer creer a un observador externo que él sí entiende chino, aunque nunca haya hablado o leído ese idioma.

Dada esta situación cabe preguntarse:

  • ¿Cómo puede Searle responder si no entiende el idioma chino?
  • ¿Acaso los manuales saben chino?
  • ¿Se puede considerar todo el sistema de la sala (diccionarios, Searle y sus respuestas) como, un sistema que entiende chino?

De acuerdo a los creadores del experimento, los defensores de la inteligencia artificial fuerte -los que afirman que programas de ordenador adecuados pueden comprender el lenguaje natural o poseer otras propiedades de la mente humana, no simplemente simularlas- deben admitir que, o bien la sala comprende el idioma chino, o bien el pasar el test de Turing no es prueba suficiente de inteligencia. Para los creadores del experimento ninguno de los componentes del experimento comprende el chino, y por tanto, aunque el conjunto de componentes supere el test, el test no confirma que en realidad la persona entienda chino, ya que como sabemos Searle no conoce ese idioma.

Entre estas dos "pruebas" se centra la discusión de la inteligencia y así mismo, de toda la ciencia de la inteligencia artificial. De hecho, en mi opinión la prueba de Searle exige que quien exhibe cierto tipo de inteligencia sea consciente de sí mismo, sino, todo parece reducirlo a un asunto mecánico.

Por ejemplo, hace mucho tiempo escribí un programa que conjuga los verbos regulares (en Prolog). ¿Conjugar un verbo exhibe inteligencia? La verdad es que no, porque es un asunto rutinariamente mecánico. Incluso, si se consideran todos los verbos, los irregulares, se puede escribir un programa que los conjugue todos sin el mayor asomo de error. ¿Eso sería inteligencia? No. Porque el sistema no sabe siquiera nada al respecto. Sigue, como en la idea de Searle, una serie de reglas que le da los resultados correctos. No tiene que saber nada más.

Pero pensemos en los programas que juegan al ajedrez. ¿No exhiben inteligencia? ¿No juegan mejor que los seres humanos en un 99.99%? Si esto es cierto, de acuerdo a la prueba de Turing, los programas de ajedrez SON INTELIGENTES, pero de nuevo, si consideramos el criterio de Searle, es claro que no lo son, porque los programas simplemente siguen mecánicamente una serie de criterios para establecer la mejor jugada en una posición dada. Si es así, como leí en algún artículo hace años, con respecto a los programas de ajedrez, "no hay nadie en casa". Vaya, no saben siquiera que están jugando ajedrez los programas.

¿Cuál será pues la condición necesaria y suficiente para que algo se considere inteligente? Pensemos en nuestra mascota. ¿Se da cuenta de sí misma? ¿Sabe de su propia existencia? Aparentemente sí. Cuando le hablaba a la Pupa (mi perrita snauzer que ya murió), estaba seguro que ella entendía en alguna medida lo que decía. Exhibía pues algún comportamiento inteligente. Si le decía, por ejemplo, "ve por tu pelota", la Pupa iba a buscarla y regresaba con ella en el hocico. Sin duda -considerando el hecho de que de entrada, la orden era verbal- la perrita sabía lo que hacía. ¿Tenía consciencia de sí misma? No lo sé. Asumo que sabía de su propia existencia, pero ¿cómo asegurarlo?

Y toda esta reflexión, de la cual probablemente ya he hablado antes aquí en este blog, surge de QBO, un robotito que entiende el lenguaje natural y que además, tiene un modo de reconocimiento visual. En el siguiente video, QBO es interrogado para reconocer ciertos objetos, por ejemplo, el dibujo del pingüino de Linux, el cual acierta. Pero entonces el robot enfrenta una imagen de sí mismo en un espejo. ¿Qué respuesta dará? ¿Podrá reconocerse a si mismo? A mí todo esto me parece fascinante. Vea el siguiente video para que observe como QBO responde a esta interesante interrogante.



Ahora bien, una vez que QBO se ha reconocido a sí mismo en un espejo, ¿significa que tiene consciencia de sí mismo? tengo mis dudas. El tema me parece abrumador.

Más información sobre cómo funciona este simpático robot QBO, aquí.

Sunday, November 20, 2011

Inteligencia artificial y sistemas expertos


La inteligencia artificial, término que acuñó John McCarthy me parece, se basa en la idea de hacer sistemas inteligentes, tan capaces como los que puede lograr el cerebro humano. Sin embargo, se halló, después de los primeros años frustrantes, que la inteligencia humano no sólo era complicada, sino mucho más complicada de lo que habíamos pensado. Por ello, hubo una división natural de tareas: visión por computadora; sistemas expertos; reconocimiento de patrones; entre otros.



Uno de los temas que por algunos años estuvieron en boga, pero que probablemente han caído en el desuso es el de los sistemas expertos, el cual se basa en escribir software que fuese tan bueno como un experto humano en un tema particular. En ese sentido por ejemplo, un programa de ajedrez como los actuales, que le ganan al 99.99% de los jugadores humanos,  es un sistema experto muy exitoso, pero las técnicas de programación para jugar tan bien están lejos de la teoría tradicional de los sistemas expertos. En este caso las cosas son así. Un sistema experto se basa en tres subtemas:

  • Interfaz con el usuario
  • Base de conocimientos (reglas de producción)
  • Motor de inferencias

En ese sentido, cuando se va a trabajar con un sistema experto hay que reconocer cómo se diseñará cada parte. En el caso de la interfaz del usuario, aunque hay muchas alternativas, la más común es responder "sí" o "no" a las preguntas que hace el sistema. esto -desde luego- no es tan poderoso como aquellos sistemas que además de responder a preguntas con "sí" o "no", también puedes darle un valor de confiabilidad a la respuesta. Por ejemplo,

Pregunta: "¿Te duele la cabeza"
Respuesta: "sí"
Pregunta: Del 1 al 10, ¿cuánto te duele? (donde 10 es el dolor más fuerte)

este tipo de sistemas usan probabilidad para decidir el margen de confiabilidad de las respuestas que entrega el sistema experto, basado en las confiabilidades que se dieron en las diferentes respuestas por parte del usuario. Para ello se usa el teorema de Bayes Sin embargo, para poner las cosas de la manera más simple, muchos sistemas expertos solamente permiten responder "sí" o "no".

Pues bien, una vez hecho esto, tenemos que describir la base de conocimientos, la cual es la que nos dará información sobre el tema que nos ocupa. Por ejemplo, en el programa muestra que te mando, la base de conocimientos es la información sobre los diferentes perros que existen. Así, un snauzer será un perro pequeño, con cola y orejas cortas, de buen talante, etc. En esta base se definen algunos perros y sus características. La idea del sistema experto es que el programa vaya pidiéndole información al usuario para que éste pueda concluir de qué perro se trata. Las bases de conocimiento están puestas en general como predicados "causa - efecto". Así, una regla en general podría ser: "si te duele la cabeza es que tienes gripe". La causa: el tener gripe; el efecto: el dolor de cabeza.

El motor de inferencias es quien pregunta al usuario basándose en esas cláusulas causa - efecto. Los sistemas expertos usan tres posibles motores de inferencia:

  • encadenamiento hacia atrás (backward chaining)
  • encadenamiento hacia adelante (forward chaining)
  • sistema de borrador (blackboard system)

El primer caso funciona así: Imagina que vas con el médico porque te sientes mal. Él te ve y te empieza a preguntar cosas sobre tus malestares. Sin embargo, antes de empezar las preguntas, las dirige asumiendo que tienes gripe, por ejemplo. Entonces te preguntará síntomas asociados de la gripe. Si le das más de una respuesta que no es presumiblemente de la gripe, se formulará mentalmente otra hipótesis y de nuevo empezará el interrogatorio.

El segundo caso es el encadenamiento hacia adelante. Siguiendo el ejemplo anterior, vas al médico y éste comienza a preguntarte qué te duele, pero no asume que tiene gripe o cualquier otra enfermedad. Lo que hace es acumular datos (respuestas) y entonces busca en su base de conocimientos qué es lo que más se parece a lo que puedes tener.

El sistema de borrador ya es obsoleto. Imagina un salón de clases lleno de expertos humanos en alguna materia. Entonces se plantea un problema y cada experto tiene un pedazo del borrador en la pared para poner su solución. Después de que todos hayan puesto su posible solución, un supervisor lee todas las respuestas y arma la respuesta final. Así funcionaba HearSay, un sistema de reconocimiento de voz de los años ochentas, actualmente en desuso.

Cabe señalar que los sistemas expertos deben estar construídos para no repetir hasta el hartazgo la misma pregunta. Por ejemplo, imagina que un sistema de encadenamiento hacia atrás te pregunta si te duele la cabeza y le contestas que no. Si es así, probablemente la primera hipótesis, la de tener gripe, no funcione. Entonces el sistema crea a través de la siguiente regla la nueva hipótesis. Si en esta nueva regla hay que preguntar de nuevo si te duele la cabeza, sería poco inteligente y serio de un sistema que te volviese a preguntar lo mismo. Así, el sistema experto (como el que te mando), guarda las respuestas del usuario y checa antes si ya respondiste a la pregunta para no volverla a preguntar.

Otra cuestión, que no está considerada en el sistema experto es la de explicar su funcionamiento. Es decir, ¿por qué el sistema experto llegó a las conclusiones y diagnósticos a los que llegó? Hay muchas maneras de hacer esto pero una de ellas es simplemente avisarle al programador, vía mensajes a la pantalla, en qué regla está trabajando. Otrso sistemas expertos pueden trazar la ruta de desarrollo. Por ejemplo, pueden decirte: "primero usé la regla 4, la cual me remitió a la regla 92 y por las respuestas del usuario tuve que probar las reglas 153 y 25", etc. Pero esto es mucho más sofisticado y difícil de programar.



/*      Program: Dog Expert        */
/* Purpose: To show the working of */
/* an expert system. It is a pro-  */
/* duction rule-based system.      */
/*                                 */
/* Remarks: This is a dog classi-  */
/* cation expert system. It uses a */
/* set of production rules for the */
/* purpose of inferring.           */

domains

database

   xpositive(symbol,symbol)
   xnegative(symbol,symbol)


predicates

   do_expert_job
   do_consulting
   ask(symbol,symbol)
   dog_is(symbol)
   it_is(symbol)
   positive(symbol,symbol)
   negative(symbol,symbol)
   remember(symbol,symbol,symbol)
   clear_facts

goal

   do_expert_job.


clauses

/*  User Interface System (UIS) */

do_expert_job :-
     makewindow(1,7,7,"An Expert System",1,16,22,58),
     nl, write(" ************************************"),
     nl, write("    Welcome to a Dog Expert System"),
     nl, write("                                 "),
     nl, write(" This is a dog identification system"),
     nl, write(" Please, respond by typing in 'yes'"),
     nl, write(" or 'no'.            Thank you.    "),
     nl,nl,
     do_consulting,
     write("Press space bar..."), nl,
     readchar(_),
     clearwindow,
     exit.

do_consulting :-
     dog_is(X), !,
     nl, write(" Your dog may be a(n) ",X,"."),
     clear_facts.

do_consulting :-
     nl, write("Sorry, unable to determine the dog."),nl,
     clear_facts.

ask(X,Y) :-
     write("   Question :- ",X," it, ",Y," ? "),
     readln(Reply),
     remember(X,Y,Reply).


/* Inference Engine (INE) */

positive(X,Y) :-
     xpositive(X,Y),!.

positive(X,Y) :-
     not(negative(X,Y)),!,
     ask(X,Y).

negative(X,Y) :-
     xnegative(X,Y),!.

remember(X,Y,yes) :-
     asserta(xpositive(X,Y)).

remember(X,Y,no) :-
     asserta(xnegative(X,Y)),
     fail.

clear_facts :-
     retract(xpositive(_,_)),
     fail.

clear_facts :-
     retract(xnegative(_,_)),
     fail.


/* Production Rules */


dog_is("English Bulldog") :-
     it_is("short-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("Beagle") :-
     it_is("short-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"long ears"),
     positive(has,"good natured personality"),!.

dog_is("Great Dane") :-
     it_is("short-haired dog"),
     positive(has,"low-set tail"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),
     positive(has,"weight over 100 lb"),!.

dog_is("American Foxhound") :-
     it_is("short-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),!.
    
dog_is("Cocker Spaniel") :-
     it_is("long-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"low-set tail"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),!.

dog_is("Irish Setter") :-
     it_is("long-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("Collie") :-
     it_is("long-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("St. Bernard") :-
     it_is("long-haired dog"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),
     positive(has,"weight over 100 lb"),!.
    
it_is("short-haired dog") :-
     positive(has,"short-haired"),!.
    
it_is("long-haired dog") :-         
     positive(has,"long-haired"),!.

Este sistema experto está escrito para turbo prolog, que funciona bajo MsDOS y está sacado del libro -si mal no recuerdo- Exploring Artificial Intelligence With Turbo PROLOG por Keith Weiskamp, el cual no sé dónde está. No lo halló más.

Monday, October 24, 2011

Muere el padre de Lisp, a los 84 años

La inteligencia artificial está de luto. Uno de los pioneros de esta interesante rama de la ciencia de la computación, John McCarthy, murió a los 84 años de edad. McCarthy fue el creador de, probablemente, el primer lenguaje formal de la llamada Inteligencia Artificial, Lisp (por aquello de LISt Processing), el cual cobró importancia en la década de los setentas y en donde probablemente la mejor referencia del lenguaje sea la de Guy Steele, que documentó Lisp prácticamente en toda su extensión.

McCarthy fue considerado por muchos el padre de la inteligencia artificial moderna. Estudió matemáticas con nada más y nada menos que John Nash en Princeton y fue quien organizó el primer encuentro de computadoras de ajedrez entre científicos de los Estados Unidos contra la ahora exUnión Soviética. Las jugadas en ese entonces, entre ambas máquinas, se enviaban por telégrafo.

Para McCarthy, la Inteligencia Artificial debería ser más interactiva y trabajó extensivamente sobre simuladores de la IA como Eliza. Hoy en día Siri podría ser un ejemplo de lo que John McCarthy pensaba debía ser la inteligencia artificial. En sus últimos años mantuvo un laboratorio propio, con criterios de investigación muy abiertos, en donde se apoyaba la exploración e investigación básica en cómputo. McCarthy recibió el premio Turing, de la ACM (Association for Computing Machinery) en 1972 (algo así como el premio Nobel de cómputo) y la Medalla Nacional de Ciencia en 1991.

John McCarthy nació en 1927,  en Boston, y aprendió por sí mismo matemáticas a nivel universitario a partir de los libros de texto de Caltech, logrando inscribirse en las clases avanzadas (a pesar de ser apenas un quinceañero), cuando su familia se mudó a esa área. Recibió el título de doctorado en 1951, a los 24 años apenas.

Con respecto a Lisp, McCarthy mismo en sus artículos, dice que creó Lisp para así crear las máquinas de Turing, en el medio ambiente limitado del cómputo de ese momento. Quizás la peor crítica a Lisp sea su deficiente notación, basada en paréntesis, los cuales pueden llegar a ser una pesadilla para el programador. Sin embargo, esto puede ser paliado hoy día con los poderosos editores para programar, que llevan cuenta de los parentesis entre otras cosas.

Tal vez el más importante de sus trabajos sea Lisp, porque fue el primero en cambiar la tendencia de los lenguajes de programación y añadir el cálculo lambda como un nuevo paradigma. Descanse en paz.

Friday, September 09, 2011

Usando Prolog para resolver sudokus


Hace tiempo ya, empecé con este asunto de los sudokus y la programación. La realidad es que este pasatiempo mental da muchas posibilidades para la ciencia de la computación. Por ejemplo, aquí esbozamos un sistema en Prolog para generar sudokus legales. El problema realmente es que puede llevar muchísimo tiempo que el sistema dé con una solución, pues Prolog está pensado para ser exhaustivo, para hallar todas las posibles soluciones. Si tomamos en cuenta que cada línea, columna y caja (3x3) debe tener 9 números diferentes, podemos usar un algoritmo primero para poner las 9 cifras diferentes en los casilleros y entonces hacer los cálculos que se necesitan. Sin embargo, para un sudoku real, de 9x9, es decir, 81 casillas, tenemos que calcular las permutaciones de 9 objetos, en 9 columnas. Ya escribí al respecto aquí.

Hoy me di a la tarea de escribir un programa en Prolog que resolviese sudokus. Se le da al sistema el sudoku con los números que son interrogantes y el sistema empieza a buscar todas las posibles soluciones. Por ejemplo, tomé este primer sudoku, uno muy sencillo:


Generé entonces mi programa en Prolog para resolver este sudoku en particular:

predicates

   sudoku
   suma(integer, integer, integer, integer, integer, 

        integer, integer, integer, integer, integer)
   num(integer)
  
clauses
  
   num(1).
   num(2).
   num(3).
   num(4).
   num(5).
   num(6).
   num(7).
   num(8).
   num(9).
  
   suma(A,B,C,D,E,F,G,H,I,R) :-
                                A+B+C+D+E+F+G+H+I = R.  

   sudoku :- num(A1), num(B1), num(C1), num(D1),
             num(A2), num(B2), num(C2), num(D2), 

             num(E2), num(F2), num(G2), num(H2),
             num(A3), num(B3), num(C3), num(D3), 

             num(E3),
             num(A4), num(B4), num(C4), num(D4),
             num(A5), num(B5), num(C5), num(D5),
             num(A6), num(B6), num(C6), num(D6),
             num(A7), num(B7), num(C7), num(D7), 

             num(E7),
             num(A8), num(B8), num(C8), num(D8), 

             num(E8),        
             num(F8), num(G8), num(H8),
             num(A9), num(B9), num(C9), num(D9),
            
             /* horizontales */
            
             suma(5,A1,4,3,B1,6,C1,7,D1,45),
             suma(A2,B2,1,C2,D2,E2,F2,G2,H2,45),
             suma(A3,7,6,B3,C3,2,9,D3,E3,45),
             suma(A4,8,B4,7,C4,5,6,D4,1,45),
             suma(7,6,A5,B5,3,C5,D5,8,9,45),
             suma(9,A6,3,8,B6,4,C6,2,D6,45),
             suma(A7,B7,8,1,C7,D7,2,9,E7,45),
             suma(A8,B8,C8,D8,E8,F8,3,G8,H8,45),
             suma(A9,3,B9,4,C9,7,1,D9,6,45),
            
             /* verticales */
            
             suma(5,A2,A3,A4,7,9,A7,A8,A9,45),
             suma(A1,B2,7,8,6,A6,B7,B8,3,45),
             suma(4,1,6,B4,A5,3,8,C8,B9,45),
             suma(3,C2,B3,7,B5,8,1,D8,4,45),
             suma(B1,D2,C3,C4,3,B6,C7,E8,C9,45),
             suma(6,E2,2,5,C5,4,D7,F8,7,45),
             suma(C1,F2,9,6,D5,C6,2,3,1,45),
             suma(7,G2,D3,D4,8,2,9,G8,D9,45),
             suma(D1,H2,E3,1,9,D6,E7,H8,6,45),
            
            
             /* cajas */
            
             suma(5,A1,4,A2,B2,1,A3,7,6,45),
             suma(3,B1,6,C2,D2,E2,B3,C3,2,45),
             suma(C1,7,D1,F2,G2,H2,9,D3,E3,45),
             suma(A4,8,B4,7,6,A5,9,A6,3,45),
             suma(7,C4,5,B5,3,C5,8,B6,4,45),
             suma(6,D4,1,D5,8,9,C6,2,D6,45),
             suma(A7,B7,8,A8,B8,C8,A9,3,B9,45),
             suma(1,C7,D7,D8,E8,F8,4,C9,7,45),
             suma(2,9,E7,3,G8,H8,1,D9,6,45).

            
Evidentemente éste es el enfoque de "fuerza bruta", el cual es clásico en Prolog. Los sudokus son un ejemplo de programa que en Prolog se vuelven no deterministico, es decir, no podemos saber a priori si existe una solución al problema hasta que Prolog no busque todas las soluciones posibles.

Curiosamente, aunque Prolog se usa como un enfoque de la Inteligencia Artificial (IA) para resolver problemas de forma inteligente, valga la redundancia, el programa que presentamos aquí no exhibe ninguna inteligencia, a lo más una terquedad del algoritmo de Robinsson, para poner todos las posibles valores en las incógnitas y así poderlo resolver.

¿Podrá mi programa resolver el sudoku planteado? ¿Cuánto tiempo le llevará? No voy a contestar por el momento a esto (se analizará en el siguiente artículo). En el mientras, ¿qué cree estimado lector/a que pase? ¿Cuánto tiempo sería el estimado para resolver este sudoku al cual le faltan 44 números? Será poco tiempo? ¿será mucho tiempo?  ¿Qué mejoras podrían hacerse al programa? ¿Esta técnica exhaustiva es lo correcto en este problema en particular?