casa abierta ai tiempo unlversld ad autonoma …

72
Casa abierta ai tiempo UNlVERSlD AD AUTONOMA METROPOLITANA Unidad: Iztapalapa División: Ciencias Básicas e Ingeniería Carrera: Lic. Computación Título: Diseño e implementación de una interfazpara una computadora con lenguaje natural Alumno: Ricardo Aníbal Cabrera Zavaleta Matrícula: 87329268 Asesor: Dr. John Goddard Close Noviembre 3, 1997

Upload: others

Post on 16-Jul-2022

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

Casa abierta ai tiempo

UNlVERSlD AD AUTONOMA METROPOLITANA

Unidad: Iztapalapa

División: Ciencias Básicas e Ingeniería

Carrera: Lic. Computación

Título: Diseño e implementación de una interfaz para una computadora con lenguaje natural

Alumno: Ricardo Aníbal Cabrera Zavaleta

Matrícula: 87329268

Asesor: Dr. John Goddard Close

Noviembre 3, 1997

Page 2: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

Universidad Autónoma Me fro p olifana

Inferfaz con Lenguaje Natural

Autor: Ricardo Aníbal Cabrera Zavalefa Asesor: Dr. John Goddard

Page 3: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

lnterfaz de lenguaje natural

PARTE I

1. Antecedentes

2. Aplicaciones actuales de la inteligencia artificial: programas para lenguaje natural y sistemas expertos

2.1 Introducción 2.2 Programas de lenguaje natural 2.3 Uso de programas de interfaz con lenguaje natural -Ejemplos-

3. Lenguaje de programación LISP 3.1 Qué es LISP 3.2 Características 3.3 Comparación de LISP con otros lenguajes de programación

4. Uso de redes aumentadas de transición 4.1 Concepto 4.2 Ca racteríst ¡cas

PARTE II

1. Introducción

2. Caso de estudio -Programa de interfaz con un micromundo- 2.1 Descripción del sistema 2.2 Descripción de la red 2.3 Implementación

3. Transformación del programa utilizando una gramática en español 3.1 Diseño de la red 3.2 Cambios en la implementación

4. Modificación del programa

Page 4: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

Parte I

I Antecedentes

1 .I Lenguaje natural Se denominan lenguajes naturales aquellos que sirven a las personas para comunicarse tanto de forma oral como por escrito. Ejemplos de estos lenguajes son el inglés, el francés, el español, etc. Por el contrario, el lenguaje de las computadoras puede parecer difícil de entender y manejar por los humanos, esto es debido a que estos lenguajes artificiales están diseñados como sentencias con un formato rígido que facilitan a los compiladores la comprensión de los programas y los convierten en secuencias de instrucciones para la computadora. Además, por el hecho de ser estructuralmente más simples, los lenguajes de programación únicamente pueden expresar los conceptos importantes de programación del tipo "si ocurre A entonces haz B". Un ejemplo de esta rigidez se muestra a continuación:

Si llueve me mojo

Cuando llueve, me mojo

La lluvia hace que me moje

Me mojo cuando llueve

Si llueve entonces termino mojado J > IF llueve THEN me mojo

E n este ejemplo se muestra como una sola instrucción de un lenguaje de programación, (Pascal para este caso), se puede corresponder a más de una sentencia de lenguaje natural.

Página 1-1

Page 5: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

ANTECEDENTES

Si se consiguiera que una computadora comprendiera a una persona que escribe o dicta las instrucciones para ejecutar un programa en lenguaje natural sería más sencillo de usar y se adaptaría mejor al entorno de las personas. Además, los investigadores sobre inteligencia artificial esperan que construyendo e implementando computadoras con las anteriores características, es decir, que puedan comunicarse con las personas, serán capaces de entender nuestro conocimiento del lenguaje natural y nuestros esquemas mentales.

Hasta ahora los programas se escriben para procesar datos. El usuario está limitado cuando debe modificar estructuralmente sentencias del programa, ya que la sintaxis está fijada por una gramática artificial o cuando desea extender el dominio de trabajo, debido a una semántica impuesta por el dominio (entendiendo por semántica los objetos a los que se puede referir o de los que puede tratar un lenguaje).

El uso fluido del lenguaje típicamente humano es todavía dificil de tratar por una computadora, por lo que la comprensión de lenguaje natural por una computadora es un área de investigación actual en la inteligencia artificial.

Un factor que está muy relacionado, no sólo con el lenguaje natural, sino con cualquier área de cualquier tipo de lenguaje, es la representación del conocimiento, (de este tema se hablará con mas detalle posteriormente), Un ejemplo de la representación del lenguaje natural está en la siguiente figura:

Representación del conocimiento para el concepto "mesa"

I ll I \

Objeto normalmente

con 4 patas, que

puede ser de varios

materiales

M E S A 1 - Nombre

- Femenino

Objeto real Representación del objeto Clasificación del

objeto por medio

de conceptos

Página 1-2

Page 6: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

ANTECEDENTES

Breve historia de la investigación sobre lenguaje natural La investigación de la lingüística computacional, es decir, la utilización de las computadoras en el estudio del lenguaje, comenzó poco después de que las computadoras surgieran como máquinas reales que resolvían problemas fácilmente, esto sucedía alrededor de 1940. La capacidad de una computadora para usar y manipular todo tipo de símbolos fue rápidamente aplicada en los textos escritos para recopilar índices de palabras: básicamente estadísticas de aparición de palabras en un texto, frecuencia de las letras, utilización de los signos de puntuación, etc.

Cada uno de los niveles de procesamiento de textos dentro de una máquina fue de algún valor en la investigación lingüística. Sin embargo, pronto resultó evidente para los analistas y los programadores que una computadora podría utilizar sus recursos de una forma más potente para realizar funciones lingüísticas más avanzadas que meras cuentas y ordenaciones basadas en datos.

En 1949, Warren Weave propuso utilizar las computadoras para resolver problemas de traducción entre lenguajes naturales (pasar de inglés a español, por ejemplo, tal como lo haría un interprete). El resultado de esta investigación, que se denominó traducción automática, intentaba simular las funciones que realizaría el traductor humano mencionado anteriormente: consultar cada palabra en un diccionario bilingüe, elegir la palabra adecuada para el lenguaje de salida y, realizando esto para todas y cada una de las palabras de una frase, colocarlas en un orden adecuado para su comprensión.

Surgen proyectos que puedan traducir textos de inglés a ruso y viceversa. Al mismo tiempo que esos sistemas obtienen algunos éxitos, las investigaciones muestran que es difícil obtener que las computadoras hagan traducciones de alta calidad. Los sistemas hechos en los 60's trabajaron principalmente mediante el uso de diccionarios y mecanismos sintácticos.

Un muy conocido ejemplo que muestra las limitaciones de la traducción automática de los 60's es el siguiente: al introducir el texto "the spirit is willing but the flesh is weak.", después de haberlo traducido al ruso y vuelto a traducir al inglés se obtuvo el siguiente enunciado, "The vodka is good but the meat is rotten".

La conclusión de los estudios iniciales en la traducción vía una máquina fue que los métodos puramente sintácticos sólo producen traducciones toscas.

Aunque en un principio puede parecer una idea sencilla, aparecen, si se trata en profundidad, problemas imprevistos, los problemas que se pueden dar más normalmente son:

O ¿Qué palabra del lenguaje de salida, de todas las posibles a escoger como traducción, es la correcta

¿Cuál es el orden que debe ocupar dentro de una frase una palabra determinada?

O

Las reglas sintácticas varían de uno a otro y no de una manera biunívoca.

Página 1-3

Page 7: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

ANTECEDENTES

Estos fueron los motivos fundamentales por los que se abandonó este enfoque.

Surge en ese momento, un nuevo foco de investigación de la inteligencia artificial: la pretensión de que si la máquina pudiera comprender el sentido de una frase, sería capaz, posiblemente, de contestar preguntas que cuestionarían esa frase. Sin embargo, este enfoque no queda libre de problemas; la naturaleza de lo que es la comprensión en sí misma, es un problema muy difícil.

Hacia 1960, el procesamiento del lenguaje natural es influido por los múltiples desarrollos científicos de estos años, incluidos los lenguajes de programación de alto nivel. En esa época, los investigadores de inteligencia artificial desarrollaron un nuevo grupo de programas, procurando dar con las causas que impiden la traducción automática. Estos investigadores comienzan a tratar el lenguaje natural como una compleja habilidad del conocimiento, el cual se estructura en diferentes partes:

o Por un lado se trata la estructura de las frases en el lenguaje (que parte debe ocupar cada palabra, qué parte debe tener una frase, el sentido de las palabras, qué concepto describe una palabra, qué función cumplen en una frase)

o Un modelo del oyente (qué acciones debe seguir la persona que recoge las frases del lenguaje natural)

Las reglas de una conversación (no hablar cuando se escucha, ser claro en el mensaje a transmitir)

Y por último, información adicional sobre cada palabra, formando una estructura.

La aproximación general de la inteligencia artificial ha sido para modelar el lenguaje humano como un sistema basado en el conocimiento para procesar la comunicación (función básica de cualquier tipo de lenguaje) y para crear programas que sirvan como instanciaciones de trabajo de los modelos que se usan como patrones; estos programas serán una base a partir de la cual podremos modelar el conocimiento.

Las personas que se dedican al procesamiento del lenguaje natural, esperan que su trabajo sirva tanto par el desarrollo del sistema de comprensión de los lenguajes usuales y prácticos, como para la mejor comprensión y entendimiento de la computadora. La computadora, al igual que la mente humana, tiene la capacidad de manipular símbolos, en procesos complejos (la computadora es capaz de operar con números y caracteres) incluyendo procesos que involucran decisión, basada ésta en lenguajes almacenados internamente.

17

o

Página 1-4

Page 8: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

2. Aplicaciones actuales de la inteligencia artificial: programas para lenguaje natural

2.1 Introducción El lenguaje natural ha evolucionado, siempre tratando de que la comunicación de los seres humanos sea más rápida y sencilla, estableciéndose algunos problemas a ambos lados del canal de comunicación. El que habla (transmisor) debe determinar que piezas de información utilizar para que el oyente entienda. De la misma manera el oyente (receptor), debe combinar esta información con su propia información almacenada (background) y hacer las inferencias apropiadas.

El estudio del lenguaje natural es por lo tanto concerniente con:

a. Los significados típicos transmitidos a través del lenguaje y la forma de representar esto

b. La forma de frases y oraciones (sintaxis), y la manera en que el forzamiento de esto, puede ser explotado para forzar nuevos significados

El proceso que puede ser usado para derivar interpretaciones del lenguaje natural manipulando la representación del conocimiento almacenado y no almacenado

Una de las aplicaciones mas obvias para el entendimiento del lenguaje natural por las máquinas es la interface hombre-máquina, esto es hacer todavía más fácil la comunicación de las personas con la computadora, desde poder llegar a darle ordenes verbalmente, hasta utilizar como lenguaje de interacción el idioma propio de la persona y no un lenguaje de programación, comandos, etc.

c.

2.2 Sistemas de entendimiento También se puede contemplar la posibilidad de tener la tecnología que permita a las computadoras leer y entender. Si las computadoras pueden leer y entender, se tendrá un gran adelanto en la solución al problema de adquisición de conocimientos.

Para describir o construir sistemas que entiendan lenguaje natural, es importante ser claros cuando nos referimos a "entender1'. Un sistema entiende cuando realiza las acciones que el usuario desea o pensaba. Esta definición es

Página 2-1

Page 9: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

APLlCAClONES ACT~JALES DE LA INTELIGENCIA ARTIFICIAL: PROGRAMAS PARA LENGUAJE NATURAL

"operacional". Puede ser que el sistema haga esto por accidente; quizá el usuario habló o escribió incorrectamente, y posteriormente el sistema ya no sepa que es lo que el usuario desea. Para esta definición, el sistema está entendiendo. Podemos reforzar esto pensando que el sistema entendió cuando la acción correcta es parte de un modelo general de acciones correctas, en respuesta a la instrucción correcta dada por el usuario. Siempre que suceda esto puede no responder de una manera que pueda reflejar si o no ha entendido.

Un sistema que acumula conocimientos sin tener oportunidad de para aplicarlos puede o no estar entendiendo (en el sentido no operacional). Esto puede ser Útil para algunas situaciones, para tener una definición de entendimiento en términos de comportamiento interno del sistema, mas que de comportamiento externo. Un sistema entiende algunas entradas cuando este crea una apropiada estructura conceptual, hace cambios apropiados a esta estructura conceptual o hace modificaciones apropiadas a su base de conocimientos.

Hay que notar que el entendimiento puede también ser visto como un aprendimiento temporal, una asimilación de las nuevas entradas, y creación de un conjunto de unidades sintácticas "válidas " con conceptos (definición particular de palabras) en el conocimiento base (diccionario extendido).

El proceso de entendimiento de una oración consiste primeramente de encontrar la clase de evento que está siendo descrito, encontrando los participantes en el evento, determinando los roles que juegan en el evento, y añadiendo cualquier información adicional acerca de los participantes o de las circunstancias bajo las cuales los eventos toman lugar. El indicio mas importante ha seguir para establecer el tipo de evento es el verbo, no sólo establece los posibles roles que pueden ser tomados en el evento, su posición en la oración ayuda a determinar cuales roles son hechos por que participantes. El verbo principal de una oración puede ser considerado como un punto conocido.

Componentes de un sistema de entendimiento El proceso de entendimiento del lenguaje natural puede ser dividido en un número de niveles. Estos niveles pueden no presentarse en cualquier sistema para el entendimiento del lenguaje natural, y puede no ser siempre posible o apropiado para distinguir los niveles. Sin embargo, es completamente útil como una manera de estudio del sujeto. Los niveles son los siguientes:

1 . Señal (nivel acústico). Esto es la forma de entrada para un sistema de entendimiento de lenguaje. Una significante cantidad de procesamiento puede ser perdido a este nivel. Análisis a este nivel generalmente incluyen la extracción de unidades de sonido llamadas "fons."

2. Nivel fonético. Nueva información fonética debe ser agregada en unidades fonológicas o fonemas. Los fonemas pueden ser mapeados en las sílabas de las palabras.

3 . Nivel léxico (palabra). A este nivel, las palabras y sus componentes son examinados, incluyendo prefijos, sufijos y otras formas morfológicas y conjugaciones.

Página 2-2

Page 10: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

APLICACIONES ACTUALES DE LA INTELIGENCIA ARTIFICIAL: PROGRAMAS PARA LENGUAJE NATURAL

4. Nivel sintáctico. Las palabras sólo forman oraciones significantes si son agrupadas de acuerdo a reglas gramaticales. Para preparar la interpretación de las oraciones, la estructura gramatical de una oración particular debe ser determinada por el análisis (parsing).

5. Nivel semántico. Asignando significados a cada palabra, frase y a la oración completa es usualmente la parte más difícil para los diseñadores de máquinas o programas que entiendan. Excepto para sistemas con limitación regular de capacidades, un sistema puede tener y utilizar un extenso cuerpo de conocimientos acerca del sujeto ("dominio") en discusión.

6. Nivel pragmático. En adición a la asignación a palabras, frases y oraciones, existe algunas veces la necesidad de un control de alto-nivel de conversación; el sistema necesita determinar si o no el usuario entiende algo, monitorear si se tiene interés o aburrimiento por parte del usuario, y continuamente notar las emociones del usuario. Este nivel es concerniente con todo lo referente al planeamiento y mantenimiento del proceso de comunicación

Sintaxis

Para interpretar una oración es necesario determinar las frases que juegan ciertos roles estándares en la oración y para formar una representación explícita de su estructura. La sintaxis es la estructura gramatical de las oraciones. El parsing recupera la sintaxis de una oración.

2.3 Lenguajes formales El estudio de lenguajes formales tiene también permitido un desarrollo sistemático de técnicas de análisis y un entendimiento del tiempo de computación y espacio requerido para el análisis.

Un lenguaje formal es definido en términos de un alfabeto y una gramática que determinan la forma en la cual los símbolos del alfabeto pueden ser combinados en oraciones.

Un alfabeto es un conjunto finito de símbolos. Por ejemplo, el conjunto {0,1} es un alfabeto.

Sea S un alfabeto dado, una cadena sobre S es una secuencia de cero o m símbolos, cada uno de los cuales es un miembro de S.

Por ejemplo, las siguientes son cadenas sobre {O,l}:

101

0000000000

1

O101

Página 2-3

Page 11: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

APLICACIONES ACTLJALES DE LA INTELIGENCIA ARTIFICIAL: PROGRAMAS PARA LENGUAJE NATURAL

Hay que notar que la cadena vacía (la secuencia de longitud cero) es una cadena sobre este y cualquier alfabeto. En un lenguaje formal, una oración es alguna cadena de símbolos bien-construída de acuerdo a las reglas para este lenguaje.

Una gramática es un esquema para la generación de oraciones con elementos del alfabeto, una gramática particular es especificada describiendo los siguientes cuatro componentes:

1. Un alfabeto de símbolos que pueden aparecer en las oraciones del lenguaje (llamados símbolos terminales)

2. Un alfabeto de símbolos no terminales que pueden aparecer en oraciones parcialmente derivadas pero no aparecer en las oraciones finales del lenguaje

3. Un símbolo de inicio, un miembro específico del conjunto de símbolos terminales, y

4. Un conjunto finito de producciones, cada una de las cuales consiste de una cadena de símbolos del lado izquierdo y una cadena de símbolos del lado derecho

Un ejemplo de una gramática de este tipo es la siguiente:

Llamémosle G1

Símbolo inicial: S

Símbolos terminales: {a, b)

Símbolos no terminales: {S , A, B)

Conjunto de producciones: P

Donde P tiene las producciones:

S + A

S + B

A --+ aa

A -+ asa

B + b

B -+ bBb

Las producciones pueden ser usadas para reescribir una cadena reemplazando una ocurrencia de una cadena en lado izquierdo de la producción por su correspondiente en el lado derecho.

Página 2-4

Page 12: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

APLICACIONES ACTUALES DE LA INTELIGENCIA ARTIFICIAL: PROGRAMAS PARA LENGUAJE NATURAL

Para determinar si una oración particular como "aabbbaa" puede ser generada por esta gramática, empezaríamos por colocar el símbolo de inicio (en este caso S), y aplicar producciones hasta llegar a producir la cadena deseada. Cada cadena derivada por la aplicación de una secuencia de producciones iniciando con el símbolo de inicio es llamada una forma sentencial.

Dando algunas restricciones en las formas que las producciones pueden tener, se pueden definir diferentes clases de lenguajes. Chomsky define cuatro importantes clases:

Lenguajes tipo 3 (también llamados "lenguajes regulares"). Cada producción tiene sólo un simple símbolo no terminal en su lado izquierdo, y en su lado derecho puede tener tanto un símbolo terminal como un terminal seguido de un no terminal.

Lenguajes tipo 2 (llamados también "lenguajes libres al contexto"). El lado izquierdo de cada producción consiste siempre exactamente de un sólo símbolo no terminal. La gramática vista anteriormente es libre al contexto, y genera un lenguaje libre al contexto.

Lenguaje tipo 1 (llamados "lenguajes sensibles al contexto"). El lado izquierdo de cada producción puede no tener una longitud mayor que el lado derecho.

Lenguaje tipo O (también llamado "lenguaje recursivamente numerable"). No existen restricciones en las producciones.

De estas cuatro clases la más general es la Tipo O. Los lenguajes sensitivos al contexto también forman una clase general. Sin embargo, los problemas computacionales con estas dos clases de lenguajes, han recibido relativamente poco estudio por parte de los expertos.

La clase más estructurada es la Tipo 3 o lenguaje regular. Para cualquier lenguaje regular es posible diseñar un estado máquina finito que pueda procesar secuencialmente una cadena de símbolos y determinar si pertenece al lenguaje. Sin embargo, los lenguajes regulares pueden ser sólo adecuados para algunos lenguajes naturales simples como comandos del sistema operativo. El lenguaje que corresponde más para el diseño de sistemas de entendimiento de lenguaje natural son los Tipo 2, o libres al contexto.

Gramáticas libres al contexto y lenguajes

Una ventaja mayor de los lenguajes libres al contexto sobre los lenguajes regulares es que tienen una estructura recursiva. Por ejemplo, es posible, en un lenguaje libre al contexto, definir una frase preposicional como una preposición seguida de un sustantivo, donde el sustantivo puede incluir una frase preposicional.

Los lenguajes libres al contexto son responsables de la eficiencia relativa del analizador sintáctico (parsing)

Página 2-5

Page 13: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

APLICACIONES ACTIJALES DE LA INTELIGENCIA ARTIFICIAL: PROGRAMAS PARA LENGUAJE NATURAL

2.4

Los métodos de análisis sintáctico de oraciones en lenguajes libres al contexto han sido estudiados, siendo clasificados generalmente como "arriba-abajo" o "abajo-arriba". Un método de análisis arriba-abajo comienza con el símbolo de inicio dado por la gramática y aplica sucesivamente producciones, tratando de derivar la cadena de entrada dada. Si una secuencia de producciones encuentra que el símbolo de inicio se transforma en la cadena dada, entonces esa secuencia, junto con la información dada donde cada producción es aplicada en la forma sentencial, constituye un análisis de la oración. Este análisis puede ser representado por un árbol de análisis (árbol de parse) donde cada nodo corresponde a una forma sentencial, cada raíz a un símbolo de arranque y las hojas corresponden a un no terminal, es decir, se tiene que N es hijo de M si y sólo si la forma sentencial para M puede ser obtenida a partir de N mediante la aplicación de una o más producciones.

Un método de análisis abajo-arriba comienza con una cadena de entrada y trata de derivar el símbolo de inicio de la gramática aplicando producciones de "retroceso." Si una gramática libre al contexto permite a una oración de su lenguaje ser derivada de dos o mas formas distintas, se dice que la gramática es ambigua, y se dice que una oración puede ser ambigua con respecto a su gramática.

Programas para lenguaje natural Una interfaz mediante programas para lenguaje natural puede, por ejemplo, permitir a usuarios sustituir los complicados comandos de programa en la jerga de las coinputadoras por órdenes en español común (o francés, inglés u otro lenguaje natural). Otro ejemplo sería la consulta a sistemas de bases de datos, enterarse de cuál es la información almacenada y hacer preguntas específicas tendientes a juntar y recuperar la información que necesitan para apoyar sus decisiones.

Los programas de lenguaje natural son de dos tipos: aquellos que permiten a los usuarios escoger palabras que aparecen en menús sucesivos hasta formar un comando que puede entender el programa, y aquellos que permiten a los usuarios teclear preguntas y comandos directamente con sus propias palabras.

En ambos casos, los programas de lenguaje natural interpretan las partes del lenguaje y el significado de un enunciado para después traducir éste a comandos de aplicación que la computadora puede aceptar y procesar.

Los programas de lenguaje natural incluyen tres elementos:

1. Un analizador sintáctico (parser), que es el componente del programa que determina cómo está formado un enunciado a partir de sustantivos, verbos y otros fragmentos. La salida del analizador sintáctico, el árbol de sintaxis, es similar a los diagramas de enunciados que se hacían en la escuela.

2. Un analizador semántico, que utiliza un diccionario integrado para interpretar el significado de las palabras del enunciado. Casi siempre se realizan al mismo tiempo el análisis sintáctico y el semántico.

Página 2-6

Page 14: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

APLICACIONES ACTUALES DE LA INTELIGENCIA ARTIFICIAL: PROGRAMAS PARA LENGUAJE NATURAL

3 . Un generador de código, que traduce el enunciado del usuario a código en lenguajes de máquina aceptables para la computadora.

Es probable que estos tres componentes se incluyan tarde o temprano en casi todos los tipos de programas con el fin de que los usuarios puedan dialogar con las máquinas en lenguaje ordinario.

Ejemplos de programas de lenguaje natural Podríamos decir que uno de los primeros programas de lenguaje natural (aunque su fin es otro) fue el juego propuesto por Alan Turing, matemático británico, que se convirtió en una prueba para averiguar s i puede considerarse que una computadora posee inteligencia y la capacidad de pensar. El juego requiere de dos participantes que contesten, un humano y una máquina, además de un inquisidor humano que trate de determinar cuál de los dos participantes que le contestan (a los cuales no puede ver) es el humano. Se utilizan terminales de comunicaciones para responder a las preguntas que hace el inquisidor. La máquina trata de engañar al inquisidor con respecto a su entidad verdadera mientras que el humano trata de convencerlo. La inteligencia y la capacidad de pensar quedarán demostradas, según la prueba de Turing, si la máquina logra engañar al inquisidor.

SAD-S AM

SAD-SAM (Syntactic Appraiser and Diagrammer-Semantic Analyzing Machine) fue programado por Robert Lindsay (1963) en el Instituto Carnegie de Tecnología realizado en el lenguaje de procesamiento de listas IPL-V. El programa acepta sentencias en Inglés con relaciones semejantes, construyendo una base de datos y resolviendo preguntas acerca de lo que se ha almacenado.

Acepta un vocabulario de Inglés básico (cerca de 1700 palabras) y sigue una gramática libre al contexto simple. El módulo SAD analiza la entrada de izquierda a derecha, construyendo un árbol de derivación y pasa esta estructura a SAM, el cual extrae la información semánticamente relevante (relaciones semejantes) para construir un árbol familiar y resolver las preguntas.

Esta estructura permite almacenar relaciones definidas, pero no es posible hacer inferencias.

STUDENT

Este es otro programa de modelo-comparación de lenguaje natural, escrito por Daniel Bobrow (1968). STUDENT puede leer y resolver problemas de álgebra elementales como el siguiente:

Si el número de clientes que Tom obtiene es dos veces el cuadrado del 20 por ciento de anuncios que hace, y el número de anuncios que hace es 45, ¿cuál es el número de clientes que obtiene?

Página 2-7

Page 15: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

APLICACIONES ACTUALES DE LA INTELIGENCIA ARTIFICIAL: PROGRAMAS PARA LENGUAJE NATURAL

ELIZA

Quizá el más famoso de estos programas fue ELIZA, escrito por Joseph Weizenbaum (1966) del M.I.T. Este programa asume el papel de un psicoterapeuta que entrevista a un paciente. Aunque el diálogo entre el usuario y el programa es muy real, se usan mecanismo no más inteligentes que los descritos en los programas anteriores.

Lo siguiente podría ser una conversación entre el paciente y su "doctor" (los enunciados de la computadora están en mayúsculas)

Men are all alike.

IN WHAT WAYS

They're always buggin us about something or other.

CAN YOU THINK A SPECIFIC EXAMPLE

Well, my boygriend made me come here.

YOUR BOYFRIEND MADE YOU COME HERE

He say's I'm depressed much of the time

I AM SORRY TO HEAR THAT YOU ARE DEPRESSED

It's true. I'm unhappy.

DO YOU THINK COMING HERE WILL HELP YOU NOT TO BE UNHAPPY

I need some help, that much seems certain.

WHAT WOULD IT MEAN TO YOU IF YOU GOT SOME HELP

Eliza fue programada en SLIP (Symmetric List Processor) desarrollado por Weizenbauin (1963). Un script fuera de línea compuesto de listas de claves, especifica la naturaleza del lenguaje de entrada especificando para cada palabra llave un conjunto de modelos para observar la posible transformación asociada con cada modelo. Por ejemplo asumiendo que la palabra llave es me, el modelo usado para comprobar esto podría ser:

(O YOU O ME)

y un de las reglas de traiisformación asociadas con este modelo, podría ser

(WHAT MAKES YOU THINK I 3 YOU)

Donde O en el modelo casa con cualquier string de palabras, y 3 en las reglas de transformación designa al tercer elemento comparado (en este caso, cualquiera entre YOU y ME). La entrada es recorrida de izquierda a derecha para una palabra clave; un sistema de hashing elimina rápidamente a las palabras que no pueden ser claves. ELIZA elimina la parte del texto precedente a un punto si es que una palabra clave no ha sido encontrada, en otro caso, la parte que sigue (asegurando entonces que la transformación sea aplicada a una simple frase o sentencia). Si varias palabras clave son encontradas, son almacenadas en una "pila de claves" de acuerdo al nivel de precedencia asociada con cada una de ellas; entonces la entrada es comparada nuevamente con cada regla de

Página 2-8

Page 16: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

APLICACIONES ACTlJALES DE LA INTELIGENCIA ARTIFICIAL: PROGRAMAS PARA LENGUAJE NATURAL

descomposición en turno. Estos modelos pueden ser ordenados en la lista de claves de manera que los más complejos son tratados primero, por ejemplo, el modelo

(O I O DEPRESSED O)

para la palabra clave I es difícil de casar, pero si un comparación es lograda, la respuesta puede ser más espectacular que la transformación para el modelo "general de comparación" para I,

Cuando se logra que case algo, ELIZA genera una respuesta, ciclicamente usando reglas de reensamblaje asociadas con la regla de descomposición apropiada. Si ninguna regla de descomposición casa para una palabra clave dada, se saca de la pila y se repite el procedimiento para otra palabra clave. Si la pila se vacía, una respuesta como "Please go on," "I see," o "Very interesting" se dará.

Varios otros trucos, como la sustitución de palabras claves en la respuesta, asociando palabras clave con ciertas situaciones (Mother implica familia) y recordando esas palabras claves en el curso de la conversación, ayudan a realzar la ilusión de un diálogo inteligente.

LUNAR

Este es un sistema de recuperación de información de lenguaje natural experimental, disefiado por William Woods para ayudar a los geólogos a accesar, comparar y evaluar datos de análisis químicos de la roca lunar y composición soluble obtenidas por la misión del Apollo-11. La primer meta del diseñador fue investigar los problemas involucrados en la construcción de una interfaz hombre-máquina que pudiera lograr una comunicación en Inglés. La selección de l'un mundo real" fue hecha por dos razones, primero, esto tiende a enfocar esfuerzos en un problema que realmente necesita una solución, y segundo, la posibilidad de producir un sistema capaz de dirigir una tarea a la que vale la pena agregar ímpetus adicionales para realizar.

LUNAR opera mediante la traducción de una expresión en Inglés en una expresión en un lenguaje de consulta formal. La traducción es hecha mediante redes aumentadas de transición (ATN Augmented Transition Network) acopladas con procedimientos de reglas de manejo de interpretación de semántica, el cual guía el análisis de la pregunta. La 'konsulta'' que resulta del análisis es entonces aplicada a la base de datos para producir la respuesta deseada. El lenguaje de consulta es una generalización de el cálculo de predicados. Su característica central es una función cuantificadora que es capaz de expresar, en una manera simple, las restricciones puestas en la base de datos a una petición del usuario. Esta función es usada junto una función especial de enumeración para clases de objetos de la base de datos, liberando al cuantificador de una dependencia explícita de la estructura de la base de datos.

Página 2-9

Page 17: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

3. Lenguaje de programación LISP

3.1 ¿Qué es LISP? Antecedentes

LISP es uno de los lenguajes de programación más antiguos que se encuentran en uso hoy día. Los inicios de LISP datan de los primeros tiempos de las computadoras, John McCarthy, quien inventó el lenguaje en 1958, expuso que fue motivado por el deseo de implementar un lenguaje práctico de procesamiento de listas para trabajar en Inteligencia Artificial en la computadora IBM 704 lo que lo llevó a desarrollar este lenguaje. De esta manera sus ideas se transformaron para hacer de LISP una herramienta matemática elegante.

Para 1960, LISP era descrito tanto como un lenguaje de programación práctico como un modelo idealizado para usarse en la teoría de recursividad.

Las siguientes características fueron citadas por McCarthy (1 978), como las ideas base que tenía acerca de la computación y que incorporó en LISP:

1.

2.

3.

4.

5.

6.

Cálculo con expresiones simbólicas más que con números, esto es, conjuntos de bits en la memoria y registros de la computadora pueden representar símbolos arbitrarios.

Procesamiento de listas, esto es, representación de datos como estructuras de listas ligadas en la máquina y como listas multinivel en papel.

Estructuras de control basadas en la composición de funciones para formar funciones más complejas.

Recursión como una manera de describir procesos y problemas.

Representación de programas en LISP: internamente como listas ligadas, externamente como listas multinivel, esto es, en la misma forma en que los datos son representados.

La función EVAL, escrita en LISP, sirve como un interprete para LISP y como una definición formal del lenguaje.

Página 3-1

Page 18: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACIdN LISP

3.2 Descripción de LISP Estructura de datos

En LISP básico existe sólo un tipo de datos a saber, estructura de listas. En situaciones de programación en LISP, los datos toman la forma de listas o átomos.

Átomos

Los átomos están compuestos por la yuxtaposición de caracteres alfabéticos, numéricos o signos especiales como: *, &, !, -, etc.

Por convención, algunos caracteres no pueden formar parte de un átomo como lo son los siguientes; " " (blanco), "(", ")", ".", '"" (apóstrofo o "quote"), 'I 'I "

(comillas). Los paréntesis y blancos servirán para delimitar los átomos y listas (mencionadas posteriormente).

Ejemplos de átomos son los siguientes: SOY-UN-ÁTOMO, 3, xyz o NIL.

El atributo más importante que puede tener un átomo, además de su nombre, es su valor -de la misma forma que las variables tienen su valor. Ciertos átomos tienen un valor específico: el átomo NIL tiene el valor de NIL, T (verdadero) tiene el valor de T, y cualquier átomo numérico, como lo sería 12, 1.723 Ó - 1.09E3, tienen su correspondiente valor entero o punto flotante.

Listas

Una lista puede ser definida recursivamente como una secuencia de cero o más elementos encerrados entre paréntesis:

(elementol, elemento2, . . ., elementon)

Donde cada elemento puede ser tanto un átomo como una lista. (La definición es recursiva porque utilizamos lo que se está definiendo en la definición).

La lista vacía o nula (NULL) es representada como ( ) o NIL. Anteriormente se mencionó a NIL como un átomo. De hecho, NIL tiene la distinción de ser el único dato en LISP que puede ser definido tanto como un átomo o como una lista.

Ejemplos de listas en LISP son los siguientes:

(ALTO CORRE CASA)

(ALTO CORRE (PARA JUANA))

(ALTO CORRE (PARA (JUANA Y MEMO)))

La inherente recursividad en la estructura de listas es muy flexible y conveniente para la representación de varios tipos de información:

( 2 3 5 7 11 13 17 19)

( ( - B ) + (SQRT( (B *B) - (4 * A * C ) ) ) )

(Yo (digo ( (que (gasolina puede) ) explotar) ) )

(PASTO VERDE) Una aseveración

Un conjunto de números

Una expresión algebraica

Una oración a analizar

Página 3-2

Page 19: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACIÓN LISP

o e

La representación interna de LISP en la máquina es utilizando celdas llamadas CONS celdas. Cada celda CONS es una dirección que contiene un par de apuntadores, y cada apuntador puede apuntar tanto a un átomo como a otra celda CONS. En una implementación típica de LISP, las celdas CONS son palabras con apuntadores en sus lados derecho e izquierdo, como se ve en el siguiente ejemplo:

La celda CONS z

o 0

El apuntador izquierdo apunta al CAR de la celda z, el apuntador del lado derecho apunta al CDR (cood-er, nombre originado de la arquitectura de la IBM 704). La lista (A B C) es representada por tres celdas CONS cuyos lados izquierdos apuntan a sus lados A, B, y C, y sus lados derechos son usados para ligar las celdas:

A B C NIL En Matemáticas, los conjuntos son tomados como objetos fundamentales, y otros conceptos, como pares ordenados, secuencias, tuplas y relaciones, son definidos en términos de conjuntos. Los datos en LISP pueden ser considerados como un formalismo alternativo en el cual los pares ordenados, representados por celdas CONS, es fundamental. Secuencias y conjuntos son entonces representados por listas LISP, una n-tupla por una lista de longitud n, y una relación por una lista de tuplas.

La estructura de datos lista de LISP puede ser usada para modelar esencialmente cualquier estructura de datos. Por ejemplo, un arreglo bidimensional puede ser representado como una lista de renglones, y cada renglón como una lista de elementos.

Estructura de control La estructura de LISP es principalmente aplicativa el flujo de control es guiado por la aplicación de funciones a argumentos, donde los argumentos pueden ser funciones. Esto contrasta con la estructura de control secuencia1 de muchos lenguajes de programación, en los cuales las sentencias separadas son ejecutadas una después de otra. Comparar, por ejemplo, las siguientes versiones de un programa para calcular las raíces cuadradas de dos números no negativos en LISP y ALGOL:

Página 3-3

Page 20: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACI~N LISP

Versión ALGOL procedure RAÍZ (value X: real; R1, R2: real);

begin

RI <- SQRT (X);

R2 <- -R1

end

Versión LISP (defun RATZ(X) (BOTHSIGNS (SQRT X) ) )

donde (defun BOTHSIGNS (Y) (LIST Y (MINUS

y>>>

La función LISP, RAIZ aplica la función duplicada BOTHSIGNS al resultado de la función SQRT. En LISP, las sentencias no son diferenciados de las expresiones, no se distingue entre procedimientos y funciones. Cada función, si se trata de un lenguaje primitivo o definido por el usuario, devuelve un valor simple en la forma de un apuntador a una lista.

Sintaxis La sintaxis de LISP refleja su estructura de control uniforme. Una expresión de LISP es definida recursivamente ya sea como un átomo, el cual cuando es evaluado devuelve su valor, o como una lista de la forma:

(F e l e 2 . . . en)

Cuando se evalúa, esta expresión primero evalúa (recursivamente) los argumentos e l a en, los cuales pueden ser átomos o listas, y entonces llama (evalúa) la función F con estos valores como argumentos.

Alcance dinámico Las reglas de alcance de LISP están también ligadas con su estructura de control aplicativa. Se utiliza un alcance puramente dinámico: Durante la evaluación de una función F, una variable no local x tendrá el valor que se le haya asignado más recientemente en la llamada de mayor jerarquía. En otras palabras, si x fue asignado a un valor por la función que llamó a F, digamos G, que será su valor cuando F sea evaluada; de otra manera, el valor para x podrá ser el que le asigne la función que esté llamando a G; y así sucesivamente. El alcance en LISP, entonces, depende solamente en el orden en que sean llamadas las funciones (alcance dinámico) y de ninguna manera depende de cuando o donde fueron declaradas en el texto del programa (alcance estático).

Recursividad El alcance dinámico permite el uso libre de funciones recursivas -funciones que pueden llamarse a sí mismas. Las funciones recursivas son más fáciles de

Página 3-4

Page 21: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACIÓN LISP

comprender como operaciones que son definidas en términos de ellas mismas. Por ejemplo, la función factorial, N!, en los enteros positivos es definido como 1 cuando N = 1 y en otro caso como N(N - I)!. Así, la estructura de control de LISP, como la estructura de datos, son uniformes y basadas en una definición recursiva.

Asignación de almacenamiento y colector de basura LISP confía completamente en su asignación dinámica de almacenamiento de datos. Durante la ejecución de un programa, cada evaluación de una función CONS causa una celda CONS para ser almacenada en la estructura de lista que está siendo manipulada. Gradualmente, la disponibilidad de espacio del programa (ej. las listas libres de las celdas CONS) es empleado. Afortunadamente, después de que el programa ha usado una celda CONS, se olvida completamente de ella, (esto es, retiene apuntadores no directos o indirectos a él y no vuelve a accesar a estas celdas) de esta manera estas celdas pueden ser recicladas. Cuando el espacio de almacenamiento es poco, el sistema de LISP suspende el uso del programa y llama al colector de basura, el cual localiza todas las celdas "olvidadas" y las vuelve disponibles. Comparando este esquema de asignación estático, en el cual cada variable o arreglo tiene una cantidad fija de espacio reservado para sí antes de que el programa sea ejecutado, es claro que la asignación estático requiere menos gasto. Pero para LISP, en cuya estructura de lista crece impredeciblemente, la asignación estática puede volverse desesperadamente restringida. El tiempo gastado en la recolección de basura es parte del precio pagado por la flexibilidad de la estructura de datos de LISP.

3.3 Funciones primitivas de LISP En esta sección se hará un breve bosquejo de la programación en LISP, mencionando algunas de sus funciones primitivas y dando algunos ejemplos de pequeños programas en LISP comparándose con su similar en otro lenguaje de programación.

Existe sólo unas pocas funciones básicas en LISP en términos de las cuales otras funciones de LISP pueden ser definidas. Muchos ambientes de programación en LISP ofrecen un gran conjunto de funciones (utilerías) muy convenientes para el programador, estas son escritas en términos de estas pocas funciones primitivas.

Con excepción de la función CONS, la cual crea una celda CONS, ninguna de estas funciones básicas tiene algún efecto lateral, de manera que pueden ser descritas por medio del valor que devuelven.

La mayoría de las funciones de LISP evalúan primero sus argumentos antes de realizar cualquier operación con ellos. (Sólo la función QUOTE no lo hace). El primer programa con LISP es que frecuentemente no hace distinción entere una expresión y el valor de esa expresión. Por ejemplo, si el valor de el átomo A es

Página 3-5

Page 22: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACIÓN LISP

Aníbal, entonces el valor de la expresión A es Aníbal, pero el valor de la expresión (QUOTE A) es A. El valor de un átomo sin definir es indeterminado en LISP y posible causa de error en todas las implementaciones.

En la tabla 3.2-1, se hace a que el átomo X tenga como su valor a (TIMES 3 (PLUS 4 1)), lo cual es una lista, esta lista se evaluaría de la siguiente manera, se evalúa el primer elemento, que es la función TIMES, así que se asume que los siguientes elemento son sus argumentos, de manera que hay que evaluarlos antes de pasarlos como parámetros, el siguiente elemento es un 3, por lo que 3 evalúa a 3, una vez evaluado este parámetro, se continua con el siguiente, en este caso es (PLUS 4 1), que también es una lista, se procede de la misma manera que con TIMES, se verifica que PLUS sea una función, 4 evalúa a 4, y 1 evalúa a 1, una vez hecho esto, se pasan el 4 y el 1 como sus parámetros, (PLUS devuelve el resultado de sumar el valor de sus parámetros), así que su resultado es 5, finalmente se pasan los resultados (3 y 5) y se ejecuta la función TIMES (multiplicación), devolviendo el resultado que es 15.

Los símbolos e , e l , p l , etc., representan a cualquier expresión dada como argumentos a las funciones, y e, e l , p l , etc., representan los valores de esas expresiones. Las siete funciones tienen la capacidad para calcular cualquier cosa que pueda ser calculada -la capacidad de una máquina de Turing. Sin embargo, no permite escribir en el estilo común de mucho lenguajes de programación, esto es, como una secuencia de sentencias que operan por causa de efectos laterales.

El primer ejemplo de este tipo de sentencias es la asignación, representada por la función SET en LISP.

Expresión

(SET e l e2)

(SET 'Y (EVAL X) )

(SET 'Y X)

Valor que devuelve

e2

15

(TIMES 3 (PLUS 4 1) )

(TIMES 3 (PLUS 4 I ) )

Comentario

Como todas las funciones en LISP, SET devuelve un valor, pero su propósito real es su efecto lateral, asignar a e l el valor de e2, que es también el valor que devuelve.

La forma más comúnmente usada, SETQ, automáticamente se agrega el apóstrofe al primer elemento para no ser evaluado (la Q viene de QUOTE)

Página 3-6

Page 23: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGFUMACI~N LISP

Expresión

e

X

(QUOTE e )

(QUOTE X)

(CAR e )

(CAR X)

(CDR e )

(CDR X)

(CONS e l e 2 )

(CONS 'F X)

(CONS '(A B) '(A B))

(CONS NIL NIL)

(EQUAL e l e 2 )

(EQUAL '( B)

(CONS 'B NIL) )

(EQUAL X 15)

(EQUAL (EVAL X)

15) (ATOM e )

(ATOM (CAR X) )

(ATOM (CAR

(CDR (CDR

X ) ) ) ) Expresión

Valor que devuelve

e

(TIMES 3 (PLUS 4 1) )

e

X

Primer elemento de e

TIMES

El resto de e

(3 (PLUS 4 1))

Agrega e l ai inicio de 1: lista e2.

(F TIMES 3 (PLUS 4 1))

( (AB) A B)

(NIL) T si e l = e2

T

NIL

T

T si e es un átomo

T

NIL

Valor que devuelve

Comentario

Una expresión puede ser un átomo o una lista de la forma (F el , . . .,en)

QUOTE evita la evaluación de expresiones, es útil cuando deseamos considerar una lista como datos.

Se abrevia (QUOTE e) como 'e

No definido si e no es una lista.

El valor que regresa es el primer elemento de la lista (un átomo)

El valor que regresa es una lista conteniendo el resto de la primer lista. No es definido si e no es una lista.

Si e2 no es una lista se obtiene un par con punto (doted pair). Esta función crea y devuelve una nueva celda CONS, Sirve por tanto para construir listas.

Notar que NIL es usado para representar "Falso"

Usualmente

(EQUAL e 'e) = NIL pero

(EQUAL NIL 'NIL) = T

(ATOM NIL) = T

Comentario

Página 3-7

Page 24: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACIÓN LISP

(COND (pl e l ) ...

(pn en) )

(COND (NIL 'A)

(T 'B) 1

(EVAL e)

(EVAL X)

if e l = T then p l else

if en =T then pn

B

El valor de e

15

Devuelve el resultado de evaluar la última forma que acompañaba a la que es cierta o NIL en el caso de que no hubiera ninguna o no encontrara ningún test que se cumpliera

E VAL es lo contrario de QUOTE;

(EVAL 'e) = valor (e)

3.4 Comparación de LISP con otros lenguajes de programación Se han mencionado ya las características principales de LISP, en esta parte se volverán a mencionar algunas de estas características, sólo que ahora se confrontaran con otros lenguajes de programación con el propósito de demostrar porque se emplea LISP.

Lo que hace a LISP diferente

El porque se utiliza LISP para aplicaciones de AI y que lo aparta de otro lenguajes de programación se puede resumir en los siguientes puntos:

o Soporte incorporado para listas

o Manejo de almacenamiento automático

O Tipos dinámicos

o Funciones First-class

o Sintaxis uniforme

o Ambiente interactivo

o Extensibilidad

o Historia

En suma estos factores permiten al programador tomar decisiones. En el caso de estudio que se presenta (parte I1 tema 2) se hace uso de gramáticas en inglés y posteriormente se hace una modificación para que se acepte una gramática en español, la representación de estas gramáticas mediante redes aumentadas de transición en el programa, utilizando LISP, permite que las modificaciones que se hacen no sean en todo el programa, si no sólo en donde se representa dicha gramática, en general, si se decide hacer cambios en un programa es fácil alterar sólo algunas partes, dejando otras sin cambios, o agregar más funciones sin tener que preocuparse de detalles como tipos de datos, pensando sólo en la

Página 3-8

Page 25: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACIÓN LISP

secuencia lógica del programa, de esta manera se pueden ignorar los detalles irrelevantes que se presenten.

Por otro lado, esta posibilidad de retardar la toma de decisiones puede tener algunas desventajas, como el que pueda haber inconsistencia o, muchos errores no son detectados hasta que el programa es ejecutado.

Pasaremos a considerar cada factor con mayor profundidad, sopesando ventajas y desventajas.

Soporte incorporado para listas

Las listas son una estructura de datos muy versátil, y aunque las listas pueden ser iinplementadas en cualquier lenguaje, LISP hace fácil su manejo. Muchas aplicaciones de AI involucran listas cuyo tamaño constantemente está cambiando, haciendo de las estructuras de datos de longitud fija, como los vectores, difíciles de usar.

Manejo de almacenamiento automático

Los programadores de LISP no necesitan preocuparse por el almacenamiento en memoria, esto se hace automáticamente. Esto libera a los programadores de mucho esfuerzo, y facilita el uso de un estilo funcional de programación. Otros lenguajes presentan al programador una opción. Las variables pueden ser almacenadas en la pila, de manera que son creadas cuando un procedimiento es declarado, y desaparecen cuando el procedimiento es hecho. Este es un uso eficiente de almacenamiento, pero excluye las funciones que devuelven valores complejos. La otra opción es que el programador asigne y libere almacenamiento. Esto hace posible un estilo funcional pero puede ocasionar errores.

Por ejemplo, consideremos el problema trivial de calcular la expresión ax(b+c) donde a, b y c son números. El código es trivial en cualquier lenguaje, aquí se muestra en C y en LISP:

(* Pascal *)

a * (b + c)

La única diferencia es que Pascal usa notación infija y LISP prefija. Ahora consideremos el cálculo de ax(b+c), donde a, b, y c son matrices. Asumimos que tenemos procedimientos para la multiplicación y suma de matrices. En LISP la manera de hacer esto es exactamente la misma; sólo los nombres de las funciones son cambiados. En Pascal tomamos la opción mencionada anteriormente. Tendremos que declarar variables temporales para retener los resultados intermedios en la pila, y reemplazar las expresiones funcionales con una serie de llamadas a funciones:

Página 3-9

Page 26: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACIÓN LISP

(* Pascal *)

var temp, result: matrix;

suma(b, c, temp);

mult (a, temp, result);

imprime (result);

; ; ; LISP

(mult a (suma b c) )

La otra opción en Pascal es escribir funciones que almacenen las nuevas matrices. Entonces, también se pueden escribir expresiones funcionales convenientes como mult(a, suma(b,c)) en Pascal. Sin embargo, en la práctica raramente se trabaja tan convenientemente, por la necesidad de manejar almacenamiento explícito:

I * Pascal *I ; ; ; LISP

(* a (+ b c) ) var a, b, c, x, y: matrix;

x:= suma(b, c);

y := inult(a, x);

free (x);

return(y);

En general, decidir cual estructura liberar es una tarea difícil para el programador en Pascal. Si el programador pierde alguna, puede suceder que el programa quede fuera de la memoria, o lo que es peor, si el programador libera una estructura que está siendo utilizada, entonces errores extraños ocurren cuando la parte de memoria es reasignada. LISP automáticamente asigna y libera estructuras, así que estos dos tipos de errores nunca pueden ocurrir.

Tipos dinámicos

Los programadores de LISP no tienen que proporcionar declaraciones de tipos, porque el lenguaje no pierde de vista el tipo de cada objeto ai tiempo de ejecución, más que descifrar todos los tipos al tiempo de compilación. Esto hace íos programas en LISP más pequeños y por lo tanto más rápidos de desarrollar, además de que permite que las funciones puedan extenderse para trabajar con objetos para los cuales no fueron originalmente definidas. En Pascal, se puede escribir un procedimiento que ordene un arreglo de 100 enteros, pero no podemos usar el mismo procedimiento para ordenar 200 enteros, o 100 strings. En LISP, una soia función sirve para todos.

Por otro lado, el uso de tipos dinámicos permite que algunos errores no sean detectados hasta el tiempo de ejecución. La gran ventaja de los lenguajes con tipos es que envían mensajes de error al tiempo de compilación. La gran frustración de estos lenguajes es que sólo son capaces de advertir acerca de una pequeña clase de errores. Podrán advertir que se está pasando erróneamente un

Página 3-10

Page 27: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACIbN LISP

string a una función que espera un entero, pero no puede advertir acerca de que se está pasando un número impar a una función que está esperando un número par.

Funciones First-class

Un objeto firts-class es aquel que puede ser usado donde sea y que pude ser manipulado de la misma forma que cualquier otro. En Pascal o C, por ejemplo, las funciones pueden ser pasadas como argumentos a otras funciones, pero no son first-class, porque no es posible crear nuevas funciones mientras el programa está ejecutándose, no es posible crear una función sin que no se le dé un nombre. En LISP se puede hacer esto usando la función lambda.

Sintaxis uniforme

La sintaxis de los programas en LISP es simple. Esto hace al lenguaje fácil de aprender. En adición, facilita escribir programas que manipulan otros programas o definir lenguajes nuevos únicos. La simplicidad de su sintaxis permite también crear fácilmente editores. Los editores de LISP pueden ser capaces de identar expresiones automáticamente y mostrar que paréntesis corresponde con cual. Esto es difícil de hacer para lenguajes con sintaxis más complejas.

Es también importante que la sintaxis de los datos es la misma que la de los programas. Obviamente esto hace fácil la conversión de datos en programa. Menos obvio es el tiempo ahorrado al tener funciones universales para manejo de entrada y salida. Las funciones de LISP read y print manejan automáticamente cualquier lista, estructura, string o número. Esto hace trivial la prueba de funciones individuales mientras se desarrollan los programas. En lenguajes tradicionales como Pascal o C, se tienen que escribir funciones d propósito especial para leer e imprimir cada tipo de datos que se desea depurar, así como un manejador de propósito especial para llamar a las rutinas. Debido a que esto es tiempo-consumido y propenso-errores, la tentación de evitar estas pruebas es persistente. Así, LISP fomenta programas mejor depurados, y facilita que su desarrollo sea rápido.

Ambiente interactivo

Tradicionalmente, un programador puede escribir un programa completo, compilarlo, corregir cualquier error detectado por el compilador y ejecutarlo y depurarlo. Esto es conocido como modo butch de interacción. Para programas grandes, la espera para la compilación ocuparía una gran porción del tiempo de depuración. En LISP uno normalmente escribe algunas funciones pequeñas a un tiempo, obteniendo retroalimentación del sistema de LISP después de la evaluación de cada una. Esto es conocido como un ambiente interactivo. Cuando es tiempo de hacer un cambio, sólo la función afectada necesita ser recompilada, así la espera es muy corta. En adición, el programador en LISP puede depurar escribiendo una expresión arbitraria en cualquier momento. Esto

Página 3-1 1

Page 28: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

LENGUAJE DE PROGRAMACIÓN LISP

es una gran improvisación sobre lo que sería introducir la sentencia de impresión y recompilar.

Hay que notar que la distinción entre lenguajes interactivo y batch es aparte de la distinción entre lenguaje interpretado y compilado. Esto ha menudo ha planteado, incorrectamente, que LISP tiene una ventaja debido a su existencia como lenguaje interpretado. Actualmente, los programadores experimentados en Common Lisp tienden a usar compiladores casi exclusivamente. El punto importante es la interacción, no la interpretación.

La idea de un ambiente interactivo es tan atractiva, que lenguajes tradicionales como C y Pascal ya ofrecen ambientes de este tipo, así que esta no es una ventaja exclusiva de LISP. Sin embargo, LISP proporciona un mejor acceso a características ineteractivas.

Actualmente existen varias versiones de editores e interpretes de LISP que corren bajo ambiente Windows, la que se emplea en el presente trabajo, es Allegro CL\PC 1 .O.

Extensibilidad

Cuando LISP fue creado en 1958 nadie podía desechar los avances teoría de programación y diseño de lenguajes que habían tenido lugar en los últimos treinta años. Otros lenguajes iniciales han sido desechados, reemplazados por otros que se basan en nuevas ideas. Sin embargo, LISP ha sido capaz de sobrevivir, debido a que LISP es extensible, ha sido cambiado para incorporar características nuevas que lo han vuelto muy popular. La manera fácil de extender el lenguaje es usando macros. Cuando los así llamadas constructores de programación estructurada, tales como case e if-then-else surgieron, fueron incorporados a LISP en forma de macros. Pero la flexibilidad de LISP fue más allá de la simple incorporación de constructores individuales. Marcar nuevos estilos de programación puede ser fácil de implementar. Muchas aplicaciones de AI son basadas en la idea de una programación de reglas-base. Otro nuevo estilo es la programación orientada a objetos, la cual ha sido incorporada en Common Lisp Object System (CLOS), un conjunto de macros, funciones y tipos de datos que han sido integrados al Common LISP ANSI.

Página 3-12

Page 29: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

4 Redes Aumentadas de Transición

4.1 Concepto y características Las redes aumentadas de transición fueron desarrolladas primeramente por William Woods (1970) como un representación versátil para gramáticas de lenguajes naturales. El concepto involucra desde lo que es un diagrama de estados de transición finitos, con la adición de pruebas y "efectos laterales", que son descritos posteriormente. Así, para combinar el análisis lexicográfico con el análisis semántico, sería posible ligar rutinas semánticas con partes específicas del mecanismo de análisis lexicográfico o gramática.

Características El esquema básico de análisis es fácil de entender; la información gramatical es representada en una red de transición, y consecuentemente, un ATN es relativamente fácil de diseñar.

El análisis semántico procede simultáneamente con el análisis sintáctico, y la semántica puede ser fácilmente usada para forzar al análisis a resolver ambigüedades.

Los arcos de un ATN corresponden con palabras y frases. Cada arco de un ATN es etiquetado con una especificación de la condición bajo la cual el arco puede ser recorrido. Esto es normalmente una palabra, una frase, un predicado a ser satisfecho por un prefijo de la parte sin revisar de la oración de entrada, o el nombre de otra (o la misma) ATN (caso en el cual otra ATN es llamada, posiblemente recursivamente).

Además de la condición en cada arco, hay una acción asociada con cada arco. La acción puede involucrar procedimientos que hacen interpretaciones parciales, examinan otras acciones, o quizá no hacen nada. Los ATN no dan lugar a ninguna restricción de los tipos de acciones que uno puedes especificar. Así decidiendo a usar un ATN, no acorta el diseño de alternativas para un sistema. Sin embargo proporcionan bastante estructura para que un sistema de entendimiento de lenguaje natural sea útil.

Página 4-1

Page 30: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PARTE 11

I . Caso de estudio -Programa de interfaz con un micromundo-

1.1 Descripción de un sistema de interface para un micro mundo Para ilustrar la interacción entre un sistema de entendimiento de lenguaje natural y el programa sirven de ..., un ambiente en miniatura llamado "Stone World" es descrito. Stone World utiliza un ambiente simulado en el cual ciertas acciones pueden realizadas. Este mundo consiste de un espacio bidimensional (llamado "Stone Land"), un personaje llamado "Mace" y un conjunto de objetos algunos de los cuales son movibles y otros son fijos. El espacio bidimensional es celular y cualquier parte en el espacio puede ser especificada por un par de enteros dando el renglón y la columna de la célula.

Mace puede ser imaginado como un hombre o como un robot que participa en algunas de las actividades de un albañil. Mace puede moverse al rededor de Stone Land de acuerdo a los comandos dados en lenguaje natural por el usuario. Los objetos en Stone World son los siguientes: un árbol, un pilar, un pozo, una cantera, una gema y algunas piedras. La gema y las piedras son portables. Mace puede ser dirigido para sacar y colocar piedras. Un mapa mostrando el estado inicial es dado a continuación.

Página 1-1

Page 31: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

1.2 Descripción de la red Los ATN usados en la interface de Stone World son mostrados a continuación:

O 4

TOWARD (DNP1)

(DIRECTION ADVERB)

* / TO(DNPI) 1

(DIRECTION ADVERB)

(DIRECTION-NOUN) k El nodo de inicio para la red principal es G1. Los nodos aceptados son dados con doble círculo y están sin etiquetar. Los arcos son etiquetados tanto con materiales o condiciones. Las condiciones son dadas entre paréntesis. El símbolo 1 denota la cadena vacía. Un arco que involucra a la cadena vacía es probado al final de todas las alternativas de un nodo. Notar que algunas condiciones son predicados en la siguiente palabra a examinar. Por ejemplo "(DIRECTION-ADVERB)" especifica que, en el orden que se recorra el arco, una palabra del tipo direction-adverb es la próxima. Otras condiciones son expresadas como llamadas a subredes de los AT". Así "(NPI)" especifica que la

Página 1-2

Page 32: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

subred de quien NPI es nodo de inicio será recorrida, guardando el contexto dentro de la red principal. La frase analizada por la subred es considerada examinada si el arco en la red principal es recorrido. La red y el esquema de análisis son definidos de tal manera que se elimine cualquier posibilidad de backtrack. Este resultar en algunas restricciones del subconjunto del lenguaje reconocido por el sistema, pero esto simplifica grandemente el procedimiento de análisis y reduce el tiempo promedio requerido para analizar una oración.

Una oración (comando) que este AT" maneja es :PICK UP A STONE FROM THE QUARRY.

Hay que notar que no es necesario introducir la oración entre paréntesis, ya que las palabras son leídas hasta que una sea encontrada con el punto al final. Este comando pude ser analizado iniciando en GI en la red principal, y recorriendo la siguiente trayectoria: El arco etiquetado "(TAKE-VERB)" puede ser recorrido ya que el predicado TAKE-VERB aplicado a PICK produce T; el arco etiquetado TJP" puede ser recorrido. El arco etiquetado "(NPI)" puede ser recorrido de acuerdo con el éxito del análisis de la subred iniciada con NPI. La porción de la oración examinada por la subred será "A STONE". Entonces el arco de a T4 será recorrido, examinando "FROM THE QUARRY" ya que FROM satisface DIR-PREP (esto es FROM es una proposición direccional) y "THE QUARRY" puede ser examinada exitosamente por l a subred iniciada por DNPl (la cual maneja una frase sustantiva direccional). Entonces el arco de T4 a LAST puede ser tomado, examinado el punto al final de la oración. (los arcos marcados con un asterisco permiten examinar o un punto o un signo de exclamación). Finalmente el arco etiquetado con h puede ser recorrido, tomando el proceso como un nodo aceptado.

Página 1-3

Page 33: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON IJN MICROMUNDO

1.3 Implementación El programa consiste de dos conjuntos de funciones y formas: los usados para implementar Stone World, y los usados en la interface del lenguaje natural.

Primero se describirá como son representados los objetos y el espacio. Stone Land es representado por un arreglo de 10 por 29. Estos elementos son inicialmente representados por el átomo 1.1 al cual se hace referencia con el valor de la variable global *V* (vacante). Entonces los objetos son colocados en una parte especifica con la ayuda de la función SHOW-STONELAND, la cual despliega Stone World, manipulando su representación directamente.

;;; Definición del micromundo "Stone Wor1d"y de una interface de lenguaje

;;; natural con el.

;;; Este programa demuestra como un programa de entendimiento de lenguaje

;;; natural puede ser modijicado en base a un "micromundo"

............................................................................................ ... I , ,

(setq *V* '1.1) ;;; Declaración de la variable *V* (vacante) que indica un

;;; lugar vacio

;;; El ambiente de Stone World es representado por un arreglo de IOpor 20

;;; llamado *STONELAND*

;;; inicialmente todo esta vacio (inicializado con la constante * V*)

(setq *nrows* IO) ; ; ; Número de renglones

(setq *ncols* 20) ;;; Número de columnas

(setq *stoneland* (make-array (list *nrows* *ncols*)) ;;; Declaración del

;;; arreglo

;;; Incialización del arreglo

(defun inicia( )

(dotimes (i *nrows*)

(dotiines (i *ncols*)

(setq (aref *stoneland* i j) *V*))))

Página 1-4

Page 34: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE MTERFAZ CON UN MICROMUNDO

;;; SHO W-STONELAND despliega a Stone Land en Ea pantalla

(defun show-stoneland ( )

(dotimes (i *nrows*)

(terpri)

(dotimes (j *ncois*)

(princ (aref *stoneland* i j))

(forinat t " ")))

(forinat t "-%Mace lleva: -a. -%I' *carrying*))

;;; La función SET-PLACE coloca un objeto en Stone Land de acuerdo a la posición

;;; dada por ROW y COL el parámetro OBJTYPE nos dice si el objeto es portable o no

;;; yOBJ nos da el objeto que se esta utilizando

(defun set-piace(row coi objtype obj)

(setf (aref *stoneland* row col) objtype)

(setf (get obj 'position) (list row col))) ;;; se especifica la nueva

;;; posición del objeto dado

;;; Se colocan inicialmente los objetos en Stoneland

(set-place 4 4 'W 'W) ; ;; pozo

(set-place 6 14 'Q 'Q) ;;; cantera

(set-place 4 12 'M 'M) ;;; Mace el robot

(set-place 6 1 'T 'T) ;;; árbol

(set-place 9 17 'P IT) ;;; pilar

(set-place 1 5 'G 'Gl) ;;; gema

Una vez definido el espacio y los objetos en el, se necesitan especificar otras propiedades de los objetos. Algunos son portables y otros fijos. Mace está iniciaiineiite mirando al norte y no lleva nada.

;;; Se definen objetosfijos yportables

;;; piedras (S) y gemas (G) son portables

(mapcar #'(lainbda (obj) (setf (get obj 'portable) t)) '(S G)) ;;; La cantera (a, elpozo (W), el árbol (T) y el pilar (P) son fijos

(inapcar #' (lambda (obj) (setf (get obj 'portable) nil))

'(Q W T PI>

Página 1-5

Page 35: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

(setq *carrying* nil)

(setq *last-direction* 'north)

;;; En *last-direction* se guarda la dirección en que mira Mace en su último

;;; movimiento. A l inicio mira hacia el norte

;;; Inicialmente Mace no lleva algo

Ahora se definirán funciones que manipulan direcciones y posiciones. Primero definiremos las cuatro principales direcciones que existen:

(setq *directions* '(north east south west))

;;; NEIGHBOR-CONTENTS devuelve el contenido de la celda especiJicada

;;; por DIR o la variable OFF-LIMITS si la posición dada estáfuera del espacio

;;; definido

(defun neighbor-contents (dir)

(let* ((nei-pos (neighbor-pos dir)) ;;; coordenadas requeridas

(i (car nei-pos))

(i (cadr nei-pos))

; ; ; i = coordenada en X

,,;,y = coordenada en Y

(if (or (minus i) (minus j) (= i *nrows) (= j *ncols*))

'off-limits

(aref *stoneland* i j) ) ) )

;;; NEIGHBOR-POS devuelve las coordenadas de la celda especiJicada por

;;; DIR

(defun neighbor-pos (dir)

(vector+ (get 'M 'position)

(cond ((es dir 'north) '(-1 O))

((es dir 'south) '(I O))

((eq dir 'west) '(O -1))

((es dir 'east) '(O 1)) ) ) )

;;; VECTOR+ devuelve la suma vectorial de X e Y

(defun vector+ (x y)

(if (null x) nil

(cons (+ (car x) (car y))

(vector+ (cdr x) (cdr y)) ) ) )

Página 1-6

Page 36: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

;;; MOVE mueve a Mace en la dirección dada por DIRECTION

(defun move (direction)

(let ((pos (neighbor-pos direction))) ;;; sepiden las coordenadas

;;; de la dirección dada

(setplace (mace-row) (mace-col) *V* *V*) ;;; el lugar donde estaba

;;; Mace es ahora vacante

(setplace (car pos) (cadr pos) 'M 'M) ;;; se da la nueva posición

;;; de Mace

;;; Se ubica la posición actual en X de Mace

(defun mace-row ( ) (car (get 'M 'position)))

;;; Se ubica la posición actual en Y de Mace

(defun mace-col ( ) (cadr (get 'M 'position)))

;;; MOVE-LEGAL devuelve T s i se hace un movimiento legal en la dirección dada por

;;; DIRECTION

(defun move-legal (direction)

(es (neigbor-contents direction) *V*) )

;;; TAKE hace que Mace tome un objeto en la dirección dada por DIRECTION

(defun take (direction)

(let ((pos (neighbor-pos direction)))

(setq *carrying*

(stone-or-gem (aref *stoneland* (car pos) (cadr pos))) )

(if (not (equal pos (get 'Q 'position)))

(set-place (car pos) (cadr pos) *V* *V*) ) ) )

; ; ; STONE-OR-GEM forza a la salida a ser S o G convirtiendo Q en S

(defun stone-or-gem (obj)

(if (es obj 'Q) 'S obj) )

Página 1-7

Page 37: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMIJNDO

;;; TAKE-LEGAL devuelve T s i en la dirección dada por DIRECTION existe

;;; un objeto que pueda ser tomado

(defun take-legal (direction)

(and (member direction *directions*)

;;; dada exista

; ; ; se comprueba que la dirección

(inember (neighbor-contents direction) '(Q S G))

; ; ; el contenido de esa dirección seaportable

(null *carrying*) ) ) ; ; ; si no es a s í s e devuelve NULL

; ; ; Con la función PUT Mace coloca un objeto en la dirección dada

(defun put (direction)

(let ((pos (neighbor-pos direction))) ;;; se asignan las

;;; coordenadas de la dirección dada

;;; si no es la cantera, se (if (not (equal pos (get 'Q 'position)))

;;; asigna a esa posición lo que Mace esté cargando

(set-place (car pos) (cadr pos) *carrying* *carrying*) )

(setq *carryiiig* nil) ) ) ;;; en caso contrario se devuelve NIL

;;; PUT-LEGAL comprueba si se puede colocar un objeto en la dirección dada

;;; por DIRECTION

(defun put-legal (direction)

(and (member direction *directions*)

(member (neighbor-contents direction)

(list 'Q *V*) ) *carrying*) )

;;; L a segunda parte del programa se muestra la interfm de Lenguaje Natural

;;; Se definirán los ATNpara interpretar comandos como "take a stonefrom de

;;; quarry"

(setq *S* null) ;;; Usada para almacenar el resto de la oración durante el

;;; análisis

Página 1-8

Page 38: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

;;; PARSE comienza el análisis de la lista actual de palabras desde NODE

(defun parse (node)

(eval (append '(cond)

(build-cond-clause (get node 'arcs))

'((t (format t "-%Stuck in parse. ")

(setq *interpretation* '(nil))

(setq *succes* nil) )) )) )

;;; BUILD-COND-CLA USE construye los parámetros de MATCH: la oración a

;;; analizar y la parte a comparar

(defun build-cond-clause (arclist)

(mapcar #'(lambda (edge)

(cons (append '(match)

(list (cons 'quote

(list (car edge)) ))

Y * s *>I (cdr edge) 1 )

arclist) )

; ; ; NEXT muestra el avance y continua el análisis a través de NODE

(defun next (node)

(format t "-a " node)

(parse node) )

Ahora se definirán las redes aumentadas de transición. Para cada nodo no terminal, se colocan una lista de arcos

; ; ; ATNk para el análisis basado en la gramática

(setf (get 'gl 'arcs)

Y (((bye-verb x) (* Y))

(setq *S* y)

(setq *interpretation* '(bye-command)))

((show \.)

(setq *S* I(\.))

Página 1-9

Page 39: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

(setq *interpretation* '(show-command))

)

(((go-verb 4 (* Y))

(setq *S* y)

(setq *direction-slot*

'(direction forward) ) ;;; dirección por omisión

(setq distance-slot

'(steps 1) ) ;;; distancia por omisión

(next 'g2) )

(((take-verb x) (* y))

(setq *S* y)

(setq *command* 'take-command)

(setq *direction-slot*

'(direction unspec) ) ;;; dirección por omisión

;;; objeto por omisión (setq *object-slot* 'stone)

(next 't2) )

(((put-verb x> (* Y))

(setq *S* y)

(setq *command* 'put-command)

(setq *direction-slot*

'(direction forward) ) ;;; dirección por omisión

(setq *object-slot*

(list *carrying*))

(next 'p2) ))

)

(setf (get '82 'arcs)

Y ((\.) (next 'g3))

((to (* 4 )

;;;Jin de .!a oración

;;; arco 'TO''

(setq *S* x)

(parse 'dnp 1)

(next 'g3) )

((toward (* x))

;;; obtiene información del destino

Página 1-10

Page 40: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

(steq *S* x)

(parse 'dnp 1)

(next 'g3) )

;;; obtiene información de la dirección

(( (d i rec t ion-adverb x)( 8 y))

(setq *S* y)

(setq *direction-slot*

(list 'direction (normalize-direction x)) )

(next'g3) ) )

1

(setf (get '83 'arcs)

Y ((\.) (setq *interpretation*

(list 'go-command

*direction-slot*

distance-slot) )

(next 'last-node) )

(((* x)) (next 'last-node) ) )

1

(setf (get 'dnpl 'arcs) ;;; sub-ATNpara lafrase sustantiva de dirección

'(

((\.) (forinat t '-%This must be a name.")(next 'dnp2))

((a (* XI) (setq *S* x)

(next 'dnp2) )

((the (* x)) (setq *S* x)

(next 'dnp2) ) )

)

(setf (get 'dnp2 'arcs)

Y (((obj-noun x)(* y))

(setq *S* y)

Página 1-11

Page 41: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE MTERFAZ CON UN MICROMUNDO

(setq *direction-slot*

(list 'toward (normalize-object x)) )

(((direction-noun x) (* y))

(setq *S* y)

(setq *direction-slot* (list 'direction x))

>I )

(setf (get 't2 'arcs)

Y ((UP (* XI) ;; ignora "up" si se presenta aquí

(setq *S* x)

(next 't3) )

(((* XI) (next 't3) ) )

(setf (get It3 'arcs)

'(

(((article XI(* Y>>

(parse 'npl)

(setq *object-slot* npl)

(next 't4) ) )

)

;;; Se obtiene un objeto (si es que h q ) o se coloca

(setf (get It4 'arcs)

'(

(0.1 (setq *interpretation*

(list *command* *objet-slot* *direction-slot*) )

1 (((dir-prep 4 (* Y>>

(setq *S* y)

(parse 'dnpl)

Página 1-12

Page 42: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON IJN MICROMUNDO

(next 't4) ) )

1

;;; Se analiza el sustantivo (setf (get 'npl 'arcs)

Y (((article x) (* Y))

(setq *S* y)

(cond ((eq x 'the)(setq definite t))

(t (setq definite nil)) )

(next '11~2) ) )

1

(setf (get 'np2 'arcs)

Y (((obj-noun x)(* y))

(setq *S* y)

(setq npl (list (normalize-object x)

(cons 'definite (list definite)) ))

1 ) 1

(setf (get 'p2 'arcs)

Y ((down (* x))

(setq *s* x)

(next 't3) )

((it (* XI1

(setq *s* x)

(next 'p3) )

(((* XI1

(next 't3) ) )

1

;;; se ignora down

Página 1-13

Page 43: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

(setf (get 'p3 'arcs) ;;; objetos ya vistos

((down (* x))

(setq *s* x)

(next 't4) )

)

(setf (get 'last-node 'arcs)

'( ((\.) (format t "--%I understand you.") )

(((* x))(format t "-%I couldn't parse: -SI' x) ) )

)

Coil esto, la estructura de un ATN ha sido dada. Sin embargo, el resto de las acciones que son tomadas en cada arco no están definidas. A continuación se hace esto. Algunas de estas funciones como GO-VERB son predicados que dan a la interfaz la habilidad de reconocer sinónimos comunes para los nombres de las acciones, objetos o direcciones que se pretende entender.

;;; Funciones que soportan el modelo analizado en el ATN

(defun go-verb (w) (member w '(take pick grab lift carry)))

(defun put-verb (w)

(member w '(put drop place release position leave)) )

(defun direction-adverb (w)

(member w '(north east south west northward eastward southward westward

right left up down stright ahead)) )

(defun direction-noun (w)

(member w '(north east south west)) )

(defun dir-prep (w)

(member w '(to from toward towrads)) )

Página 1-14

Page 44: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

(defun obj-nouii (w)

(member w '(quarry corner place tree well pillar stone gem)) )

(defun article (w)

(member w '(a an the)) )

(defun bye-verb (w)

(member w '(quit bye exit finish bye-bye goobbye stop)) )

; ; ; La siguiente función sirve de soporte a las acciones de cada arco en el ATN

(defun normalize-direction (w)

(translate w '((northward . north)(eastward . east)

(southward . south)(westward . west)(right . east)

(left. west)(up . north) (down . south) (srtaight . forward)

(ahead. forward) )) )

; ; ; translate busca la palabra w en el diccionario (lista de dottedpairs)

(defun translate (w dict)

(cond ((null dict) w) ;;; regresa lapalabra correspondiente o Wsi no lo es

((eq w (caar dict)) (cdar dict))

(t (translate w (cdr dict))) ) )

(defun normalize-object (w)

(translate w '((quarry . Q) (tree . T) (well . W) (pillar . P)

(stone . S) (gem . G) (mace . M) (you . M) )) )

La función ACT-UPON despacha los comandos a realizar a su correspondiente función que los ejecutará.

;;; ACT-UPON es un despachador de comandos. SI es la interpretación

;;; semántica incorporada al comando

(defun act-upon (si)

(cond ( (eq (car si) 'go-command)

(setq *succes* t)

(obey-go si) )

;es Thasta que se de NIL

Página 1-15

Page 45: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

( (eq (car si) 'show-command)

(setq *succes* t) )

( (eq (car si) 'take-command)

(setq *succes* t)

(obey-take si) )

( (eq (car si) 'put-command)

(setq *succes* t)

(obey-put si) )

(t (setq *succes* nil)

(format t

''-%Can't satisfy that kind or request.") ) ) )

;;; L a función OBEY-GO comienza extrayendo la dirección y número de pasos

;;; del comando (el cual es el valor de L, el argumento pasado a ACT-UPON). si la

;;; dirección dada es ADELANTE entonces esta se cambia al valor global de la variable

;;; *LAST-DIRECTION*. Entonces entra en un loop en el cual en cada iteración se

;;; intenta mover A4ace una celda en la dirección dada

(defun obey-go (si)

(let* ( (prms (cdr si) )

(direction (cadadr si) )

(distance-slot (caddr si) )

(nsteps (cadr distance-slot) ) )

(if (eq direction 'forward) (setq direction *last-direction*) )

(dotiines (i nsteps)

(cond ( (move-legal direction)

(move direction)

(setq *last-direction* direction) )

(t (setq *succes* nil) ) ) ) ) )

Página 1-16

Page 46: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

; ; ; Pura que Muce saque un objeto, la función OBEY-TAKE determina que objeto ha

;;; sido especificado y en cual dirección está. Ya que el primer elemento de SI es de

;;; un tipo de comando (en este caso TAKE-COMMAND), los parámetros están en el

;;; resto de SI. Si el usuario no especrfca una dirección, lafinción FIND-DIR es

;;; invocada para determinar en que dirección se puede tomar un objeto. Si la

;;; dirección es especrfcada como '%A CANTERA" entonces unafinción especial

;;; FIN-DIRI es llamada para determinar la dirección correspondiente. Finalmente si

;;; es posible llevar u cabo e1 comando, se hace, en otro caso se asigna a *SUCCES* el

;;; valor de NIL

(defun obey-take (si)

(let* ( (prms (cdr si) )

(object (caar prms) )

(direction (cadadr prms) ) )

(cond ( (eq direction 'forward)

(setq direction *last-direction*) )

( (eq direction 'unsepec)

(setq direction (find-dir object *directions*) ) )

( (eq direction 'Q)

(setq direction (find-dirl 'Q *directions*) ) )

1

; se ocupa de la dirección de la cantera

(cond ( (take-legal direction) (take direction) )

(t (format t "-%Can't take that way")

(setq *succes* nil) ) ) ) )

;;; FIND-DIR busca en DIRECTIONS para encontrar OBJ

(defun find-dir (obj directions)

(cond ( (null directions) nil)

í (eq obj (stone-or-gem

(apply #'aref

;Considera a G como S

(cons *stoneland*

(neighbor-pos (car directions) ) ) ) ) )

(car directions) )

(t (find-dir obj (cdr directions) ) ) ) )

Página 1-17

Page 47: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

;;;FIND-DIRI es como FIND-DIRpero G no es mapeada a S

(defun find-dirl (obj directions)

(cond ( (nu l l directions) nil)

í (es 0b.i (apply #'aref

(cons *stoileland*

(neighbor-pos (car directions) ) ) ) )

(car directions) )

(t (find-dirl obj (cdr directions) ) ) ) )

(defun obey-put (I)

(let* ( (prins (cdr *interpretation*) )

(object (caar prms) )

(direction (cadadr prms) )

(ok nil) )

;cosa aponer

(if (eq object *carrying*) (setq ok t) )

(if (eq direction 'forward)

(setq direction *last-direction*) )

(if (and ok (put-legal direction) )

(piitl direction)

(progii (format t "-%Can't put that way! ")

(setq *succes* nil) ) ) ) )

(defun produce-reply ( )

(if *succes* (format t "-%OK, next?")

(format t "-% I can't quite do that one. -%") ) )

;;; La func ih START es usada para iniciar una sesión. Esta llama a la función

;;; SHOW-STONELAND, la cual despliega Stone World, y el diálogo con el

;;; usuario comienza. La función PARSE es llamada para iniciar la interpretación

;;; de cada oración de entrada dada por el usuario

Página 1-18

Page 48: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

(defvar *direction-slot*)

(defvar *destination-slot*)

(defvar *object-slot*)

;;; START es la función de arranque

(defun start ( )

(show-stoneland)

(format t "-%Hey you up there! What should i do?")

(format t "-%Please end your sentence with ! . o ?-%'I)

(loop (let* ( (input (input-sentence) ) )

(setq *s* input) )

(parse 'si) ; ; test para elfin del diálogo

(if (es (car *interpretation*) 'bye-command)

;analiza la oración contenida en *S*

(return '(Good Bye) ) )

(act-upon *interpretation*)

(produce-reply)

(if *siicces* (show-stoneland) )

; trata de hacer cmd o resolver una pregunta

;actualiza stoneland

> >

;;; INPUT-SENTENCE obtiene una oración dada por el usuario.

;;; Sólo se leen átomos hasta que encuentre los siguientes símbolos: ! . ?

(defun input-sentence ( )

(let ( (word (separate-punc (read) ) ) )

(if (atom word) (cons word (input-sentence) )

word) )

)

Página 1-19

Page 49: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

PROGRAMA DE INTERFAZ CON UN MICROMUNDO

;;; SEPARA TE-PUNC toma un átomo y ver$ca si tiene alfinal un caracter de

;;; puntuacicín, si es así, este caracter es separado del resto de la cadena, y una lista

;;; de dos dotnos separados es regresada: uno para la palabra en sí y otro para el

;;; punto.

;;; Si no hay tales caracteres, simplemente se regresa el argumento de entrada sin

;;; cambios. Los signos de exclamación son convertidos a puntos finales.

(defun separate-punc (word)

(let* ( (str (string word) )

(lei1 (length str) ) ; se guarda su longitud

(last-char (elt str (1- len) ) ) ) ; se obtiene el último caracter

(if (or (char= last-char #\.)

(char= last-char #\!)

(char= last-char #\?) )

; si se trata de. ! o ?

(list ; T, se crea una lista de palabra y otra de punto

(intern (subseq str O (1- len) ) )

(iiiterii (string (excl-to-period last-char) ) ) )

;F, se regresa [apalabra sin cambios word) ) )

;;; EXCL-TO-PERIOD mapea ! a . y todo lo demás a sí mismo

(defun excl-to-period (c) (if (char= c #\!) #\. c) )

Página 1-20

Page 50: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

2 Transformación del programa utilizando una gramática en español

a

hacia

hacia

hacia

2.1 Diseño de la Red (ATN)

la izquierda

la derecha

el este

el norte

Siguiendo las mismas especificaciones de la red aumenta de transición que se tenía para una gramática en inglés, se implementa para una gramática en español.

Inicialmente se tienen tres acciones diferentes a realizar:

O

O

O

acción de ir (verbo ir)

acción de tomar (verbo tomar)

acción de colocar (verbo colocar)

Sustantivo

piedra

Para cada u tia de estas acciones se toman en cuenta los siguientes enunciados:

Preposición Artículo Sustantivo

de la cantera

(VERBO-I R)

trae

saca

lleva

toma

Verbo

una

la

la

una

I Preposición 1 Artículo I Sustantivo

Camina

dirígete

ve

dirígete

(VERBO-TOMAR)

Verbo I Artículo

piedra gema Ite 1 sur I de gema

Página 2-1

Page 51: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TKANSFORMACI~N DEL PROGRAMA UTILIZANDO UNA GRAMATICA EN ESPAÑOL

Verbo

coloca

Pon sitúa

(VERBOCOLOCAR)

Artículo Sustantivo

la gema

la piedra

la gema

Preposición

en

en

Artículo

al

la

el

Sustantivo

norte

izquierda

sur

Por lo que la red aumentada de transición correspondiente quedaría de la siguiente manera:

I (DIR-ADVERB)

o Página 2-2

Page 52: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TR.WSFORMACI~N DEL PROGRAMA UTILIZANDO UNA CRAMATICA EN ESPAÑOL

2.2 Cambios en la implementación Una vez que se ha diseñado la red aumentada de transición se modifica la implementación original del programa para que acepte la gramática en español. Algunas oraciones comunes que esta red maneja son:

CAMINA HACIA LA DERECHA.

O

SACA UNA PIEDRA DE LA CANTERA.

O

PON LA PIEDRA AL NORTE.

El programa se modifica en lo correspondiente a la definición de los arco de la red, esto de acuerdo a la red que se ha diseñado, el nodo inicial es GI, para avanzar a los siguientes nodos, se aceptan tres diferentes acciones, ya mencionadas, acción de ir, acción de tomar y acción de colocar.

Como en la red original, puede suceder que para recorrer un arco se tenga que recorrer una subred antes (DNP1, NP1).

Finalmente, se modifican las funciones TAKE-VERB, PUT-VERB,

ARTICLE, de manera que verifiquen sus elementos en español. DIRECTION-ADVERB, DIRECTION-NOUN, DIR-PREP, OBJ-NOUN y

;;; Este programa inuestt-a como un programa de entendimiento de lenguaje natural

;;; puede ser n2odficado en base a un "micromundo" utilizando una gramática en

;;; español.

(defconstant *v* ' 1 . I)

;;; El esptrcio de stoneland es representado como un arreglo de IOpor 20

;;; inicialinenle iacio

(defcoiistant *iireng* I O)

(defconstant *ncols* 20)

;;; Se dejiiien las dit-ecciones comunes

(defconstaiit *directions* '(norte sur oeste este))

;;; Inicializar *STONELAND* con *Y*

(setq *stoneland*

(make-array ( l is t *nreng* *ncols*) :initial-element *v*) )

Página 2-3

Page 53: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

~

T R A N S F O I ~ ~ I A C I ~ N DEL PROGRAMA UTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

;;; SHO W-STONELAND despliega Stone Land en la pantalla

(defun show-stoneland ( )

(dotiines (i *nreng*)

(terpri)

(dotinies (j *ncols*)

(princ (aref *stoneland* i j ) )

(format t I' ") ) )

(foriiiat t "-%Mace lleva: -a. -%" *carrying*) )

;;; SET-PLACE coloca un objeto en un lugar de Stone Land

(defun set-place (row col objtype obj)

(setf (aref *stoneland* row col ) objtype)

(setf (get obj 'position) (list row col) ) )

;;; Se colocan lm marcas de los objetos existentes en Stone Land

(set-place 4 4 'W 'W) ;pozo

(set-place 6 14 'C IC) ;Cantera

(set-place 4 12 'M 'M) ;"nzace"

(set-place 6 1 'A 'A) ;árbol

(set-place 9 17 'P 'T) ;pilar

(set-place 1 5 'C 'GI ) ;gema

;;; Se deJinen objetos portables y no portables

(mapcar #'(lambda (obj) (setf (get obj 'portable) t) )

'(PG) 1 (inapcar #'(lainbda (obj) (setf (get obj 'portable) nil) )

'(C W A P) )

(defvar "carrying" nil)

(defvar *last-direction* 'norte)

(defvar * i nterpi'etation * ni I )

;;; mace inicia con las manos vacías

Página 2-4

Page 54: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSFOIWACI~N DEL PROGRAMA UTILIZANDO UNA GRAMATICA EN ESPAÑOL

;;; NEIGHBOR-CONTENTS regresa el contenido del vecino especificado por DIR

;;; o FUERA-LIMITES si está fuera de los limites de STONELAND

(defun neighbor-contents (dir)

(let" ( (nei-pos (neighbor-pos dir) )

(i (car nei-pos) )

(i (cadr nei-pos) ) )

(if (or (iiiinusp i) (minusp j) (= i *nreng*) (= j *ncols*) )

'off-iini its

(aref *stoneland* i j) ) ) )

;;; NEIGHBOR-POS regresa las coordenadas del vecino que se especiJique por DIR

(defun neighbor-pos (dir)

(vector+ (get 'M 'position)

(cond ( (eq dir 'norte) '(-1 O) )

( (eq dir 'sur) '( 1 O))

( (ccl dir 'oeste) '(O -1) )

( (eq dir 'este) '(O I ) ) ) ) )

;;; VECTOK+ regresa la suma vectorial de X e Y

(defun vector+ (x y)

(if (null x) n i l

(cons (+ (car x) (car y) )

(vector+ (cdr x) (cdr y) ) ) ) )

;;; MOVE hace pie mace se mueva en la dirección dada por DIRECTION una celda a

;;; la vez

(defun move (direction)

(let ( (pos (iieighbor-pos direction) ) )

(set-place (inace-row) (mace-col) *v* *v*)

(set-place (car pos) (cadr pos) 'M 'M)

1 )

(defun mace-row ( ) (car (get 'M 'position) ) )

(defun mace-coi ( ) (cadr (get 'M 'position) ) )

Página 2-5

Page 55: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSIWRMACIÓN DEL PROGRAMA UTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

;;; MOVE-LEGA L regresa Tsi el movimiento es legal en la dirección dada

(defun move-legal (direction)

(eq (neighbor-contents direction) *v*) )

;;; TAKE hace que Mace recoja un objeto en la dirección dada

(defun take (direction)

(let ( (pos (neighbor-pos direction) ) )

(setq *carrying*

(stone-or-gem (aref *stoneland* (car pos) (cadr pos) ) ) )

(if (not (equal pos (get 'C 'position) ) )

(set-place (car pos) (cadr pos) *v* *v*) ) ) )

;;; STONE-OR-GEM forza a la entrada a ser S o G convirtiendo C a S

(defun stone-or-gem (obj)

(if (eq obj 'C) 'P obj) )

;;; TAKE-LECA L regresa T si se puede tomar un objeto de la dirección dada

(defun take-legal (direction)

(and (member direction *directions*)

(iiiein ber (neighbor-contents direction) '(C P G) )

(null *carrying*) ) )

;;; PUT hace q ~ i e Mace coloque un objeto en la dirección dada

(defun put1 (direction)

(let ( (pos (iieiglibor-pos direction) ) )

(if (not (equal pos (get 'C 'position) ) )

(set-place (car pos) (cadr pos) *carrying* *carrying*) )

(setq "carrying* nil) ) )

;;; PUT-LEíGSL segvesa Tsi se puede colocar algo en la dirección dada

(defun put- I ega I (direction)

(and (member direction *directions*)

(meiiiber (neighbor-contents direction)

(list 'C *v*) )

Página 2-6

Page 56: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSI:OI1MACIÓN DEL PROGRAMA UTILIZANDO UNA CRAMATICA EN ESPAÑOL

; ; ; Se definircín las redes aumentadas de transición para interpretar comandos como

; ; ; "toma una piedra de la cantera."

(defvar *s*) ; : ; La variable S se usa para guardar el resto de cadapase

;;; durante el análisis

;;; PARSE comienza analizando la lista actual de palabras de NODE

(defun parse (node)

(eval (append '(coiid)

(build-cond-clause (get node 'arcs) )

'( (t (format t "-%Análisis detenido.

(setq *interpretation* '(nil) )

(setq *succes* nil) ) ) ) ) )

")

;;; MATCH h c e las comparaciones necesarias

(defun match (p s)

(cond

((nu11 p) (null s))

((atom (carp))

(and s

(equal (car p) (car s))

(match (cdr p) (cdr s) ) ) )

((and

S

(eq (caar p) I \ . )

(eq (caar PI (caar s))) (coiid ((match (cdr p) (cdr s))

t)

(t nil) ) )

((eq (caar PI '*> (cond

Página 2-7

Page 57: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSFORMACI~N DEL PROGRAMA UTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

((and s (match (cdr p) (cdr s)))

(set (cadar p) (list (car s))) t)

((match (cdr p) s)

(set (cadar p) nil) T)

((and s (match p (cdr s)))

(set (cadar p)

(cons (car s) (eval (cadar p))) ) t)

(t nil) 1 ) ((and s

(apply (caar p) (list (car s)))

(match (cdr p) (cdr s)) )

(set (cadar p)(car s)) t)

(t nil) ) )

;;; BUILD-COND-CLA USE hace cada oración comprimida en una legitima oración

(defun bui Id-cond-clause (arclist)

(mapcar #'(lambda (edge)

(cons (append '(match)

(list (cons 'quote

(list (car edge) ) ) )

' ( *s*> )

(cdredge) ) 1 arclist) )

;;; NEXT despliega el progreso y continua el análisis desde NODE

(defun next (node)

(format t "-a " node)

(parse node) )

Página 2-8

Page 58: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSFORMACI~N DEL PROGRAMA CJTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

;;; Se hace la representación para cada red aumentada de transición. Por cada nodo

;;; intermedio se coloca una lista de arcos con su lista de propiedades A continuación

;;; los ATNpara el análisis. Se basan en la gramática dada

(setf (get 'g 1 'arcs)

Y ( ( (bye-verb x) (* Y) )

(setq *s* y)

(setq *interpretation* '(bye-command) ) )

( (show \ .)

(setq *s* '(\ .) )

(setq *interpretation* '(show-command) )

)

( ( (go-verb XI (* Y> 1 (setq *s* y)

(setq *direction-slot*

'(direct ion adelante) ) ;dirección por default

(setq distance-slot

'(steps 1) ) ;distanciapor defauít

(next'g2) )

( ( (take-verb x) (* y) )

(setq *s* y)

(setq *command* 'take-command)

(setq *direction-slot*

'(direction indeterminada) ) ;dirección por default

(setq *object-slot* 'piedra)

(next 't2) )

;objeto por defauZt

( ( (PLit-verb X I (* Y) 1 (setq *s* y)

(setq *command* 'put-command)

(setq *direction-slot*

'(direction adelante) ) ;dirección por default

(setq *object-slot*

(list *carrying*) ) ;objetopor defauIt

(next 't2) ) )

Página 2-9

Page 59: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRA~\'SFO~WACIÓN DEL PROGRAMA UTILIZANDO UNA CRAMATICA EN ESPANOL

(setf (get '82 'arcs)

Y ( (\ .) (next 'g3) ) ;$n del comando

( ((dir-prep X I (* Y) ) (setq *s* y)

(parse 'diip 1)

(next'g3) )

;se obtiene información del destino

( ( (article x) (* y) )

(parse 'diip 1)

(setq *s* y)

(next '83) )

1 1

(setf (get 'g3 'arcs)

Y ( (\.) (setq *interpretation*

( I ist 'go-corninand

*direction-slot*

dista nce-slot) )

(next 'last-node) )

( ( (* x) ) (next 'last-node) ) )

)

(setf (get 'dnp 1 'arcs) ;sub-A TN para la frase sustantiva de dirección

'(

( (\.) (forinat t "-'%O Esto puede ser un nombre.") (next 'dnp2) )

( ( la(* x) 1 (setq *s* x)

(next 'diip2) )

((el (* 4 ) (setq *s* x)

Página 2-10

Page 60: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSFORMACIÓN DEL PROGRAMA UTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

(next 'dnp2) )

((al (* 1 (setq *s* x)

(next 'dnp2) ) )

1

(setf (get 'diip2 'arcs)

Y ( ( (obj-noun x) (* y) )

(setq *s* y)

(setq "direction-slot*

(list 'hacia (normalize-object x) ) )

)

( ( (direction-noun x) (* y) )

(setq *s* y)

(setq *direction-slot* (list 'direction x) )

)

( ( (dircction-adverb x) (* y) )

(setq *s* y)

(setq *direction-slot*

( I ist 'direction (normalize-direction x))))

)

(setf (get 't2 'arcs) ;obtiene un objeto (si hay alguno)

Y ( ( (article x) (* y) )

(parse 'np i )

(setq *object-slot* npl)

(next '13) ) )

Página 2-11

Page 61: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSFOIIJIACIÓN DEL PROGRAMA UTILIZANDO UNA CRAMÁTICA EN ESPAÑOL

(setf (get It3 'arcs)

Y ( 0.)

(setq *interpretation*

( I ist *corninand* *object-slot* *direction-slot*) )

)

( ( (dir-prep x) (* Y) 1 (setq *s* y)

(parse 'dnp 1 )

(next It?) )

( ( (article x) (* y) )

(parse 'dnpl)

(next 7 3 ) ) )

1

(setf (get 'npl 'arcs) ;Analiza el sustantivo de lafrase y el conjunto NPI resultante

Y ( ( (article x) (* y) )

(setq *s* y)

(cond ( (eq x 'the) (setq definite t) )

(t (setq definite nil) ) )

(next 'iip2) ) )

1

(setf (get 'np2 'arcs)

'(

( ( (obj-i~u~in x) (* y) )

(setq *sa y)

(setq i ip 1 (list (norinalize-object x)

(cons 'definite (list definite) ) ) )

1

Página 2-12

Page 62: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSFOIZRIACI~N DEL PROGRAMA UTILIZANDO UNA CRAMATICA EN ESPAÑOL

(setf (get 'last-node 'arcs)

Y ( (\.) (format t "-%Te entiendo.") )

( ( (* x) ) (format t 'I-% No puedo analizar: 4' x) ) )

)

; ; ; Funciones que d m soporte al modelo revisado en el A71V

(defun go-verb (w) (member w '(ve camina muévete dirígete) ) )

(defun take-verb (w) (member w '(trae saca toma quita) ) )

(defun put-verb (w)

(member w '(coloca pon sitúa lleva) ) )

(defun direction-adverb (w)

(member w '(iiorte este sur oeste derecha izquierda arriba abajo ) )

1

(defuii directioii-noun (w)

(member v '(iiorte este sur oeste) ) )

(defun dir-prep (w)

(member w '(a hacia de hasta en) ) )

(defun obj-noun (\Y)

(member \v '(cantera esquina lugar árbol pozo pilar piedra gema) ) )

(defun article (w)

(member w '(1111 una la lo el los las al) ) )

(defun bye-verb (w)

(member w '(alto adiós fuera nos vemos) ) )

Página 2-13

Page 63: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

T R A N S F O ~ ~ ~ I . . W ~ N DEL PROGRAMA UTILIZANDO UNA CRAMÁTICA EN ESPAÑOL

;;; Función que (Iii soporte a las acciones de los arcos en los ATN's

(defun normalimdirection (w)

(translate w '((derecha. este) (izquierda. oeste) (arriba. norte) (abajo . sur)

)

;;; TRANSLATE hiisca la palabra Wen DICT (lista de dottedpairs).

(defun translatc (w dict)

(cond ( (nu I I dict) W)

( (eq (caar dict) ) (cdar dict) )

(t (tixiislate w (cdr dict) ) ) ) )

I. regresa lapalabra correspondiente o Wsi no hay

(defun normal ize-object (w)

(translate w '( (cantera . C) (árbol . A) (pozo . W) (pilar. P)

(piedra . P) (gema . G) (mace . M) ) ) )

;;; ACT-UPOhl L*\ MI comando despachador de comandos a la función particular que ;;; puede ejecul(ii los comandos que se vayan a realizar

(defun act-upoii (si)

(cond ( (eq (car si) 'go-command)

(setq *siIcces* t) ;es Thasta que se de NIL

(obey-bo Si) )

( (eq (car si) 'show-command)

(setq *sLicces* t) )

( (eq (car si) 'take-command)

(setq *wcces* t)

(obq -take si) )

( (eq (car si) 'put-command)

(setq 'ksiicces* t)

( o b q -}"it si) )

(t (setq *succes* nil)

(forinat t

"-%No puedo satisfacer esa petición.") ) ) )

Página 2-14

Page 64: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

T F U N S l ~ O i ~ \ i ~ \ C l Ó N DEL PROGRAMA UTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

;;; La función OBEl'-GO comienza extrayendo la dirección y número de pasos

;;; del comando (el mal es el valor de L, el argumento pasado a ACT-UPON). si la

;;; dirección dadci es ADELANTE entonces esta se cambia al valor global de la variable

;;; *LAST-DIREC770N*. Entonces entra en un loop en el cual en cada iteración se

;;; intenta mover ikfcice una celda en la dirección dada

(defun obey-go (si)

(let* ( (prins (cdr si) )

(direction (cadadr si) )

(distaiice-slot (caddr si) )

(nsteps ícndr distance-slot) ) )

(if (eq diixction 'adelante) (setq direction *last-direction*) )

(dotimes ( i iisteps)

(coiid ( (iiiove-legal direction)

(move direction)

(cetq *last-direction* direction) )

( t (setq *succes* nil) ) ) ) ) )

; ; ; Para que MCK cj wque un objeto, la función OBEY-TAKE determina que objeto ha

; ; ; sido espec$ccido y en cual dirección está. Ya que el primer elemento de SI es de

; ; ; un tipo de coiiwiiido (en este caso TAKE-COMMAND), los parámetros están en el

;;; resto de SI. SI ci Lisirario no específica una dirección, lafunción FIND-DIR es

; ; ; invocada par a determinar en que dirección se puede tomar un objeto. Si la

; ; ; dirección es especEficada como '!LA CANTERA" entonces una función especial

; ; ; FIN-DIR I es Iltrinada para determinar la dirección correspondiente. Finalmente

; ; ; si es posible l l c w r a cabo el comando, se hace en otro caso se asigna a

;;; *SUCCES" cl \,olor de NIL

(defun obey-take (si)

(let* ( (prins (cdr si) )

(object (caar prms) )

(directioii (cadadr prms) ) )

(cond ( (eq direction 'adelante)

(setq direction *last-direction*) )

( (eq direction 'indeterminada)

Página 2-15

Page 65: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSFORhL\CIÓN DEL PROGRAMA UTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

(setq direction (find-dir object *directions*) ) )

( (eq direction 'C)

(setq direction (find-dirl 'C *directions*) ) )

1

; se ocupa de la dirección de la cantera

(cond ( (take-legal direction) (take direction) )

(t (format t "-%No puedo tomar esa ruta.")

(setq *cucces* nil) ) ) ) )

;;; FIND-DIR Ouscn L'M DIRECTIONS para encontrar OBJ

(defun find-dir (obj directions)

(cond ( (null directions) nil)

( (eq 0b.i (stone-or-gem

(apply #laref

;Considera a G como P

(cons *stoneland*

(neighbor-pos (car directions) ) ) ) ) )

(car directions) )

(t (fiiid-dir obj (cdr directions) ) ) ) )

;;;FIND-DIRI es como FIND-DIRpero G no es mapeada a S

(defun find-dirl (obj directions)

(cond ( (n~ili directions) nil)

( (eq obi (apply #'aref

(cons *stoneland*

(neighbor-pos (car directions) ) ) ) )

(car directions) )

(t (find-dirl obj (cdr directions) ) ) ) )

(defun obey-put (1)

(let* ( (prnis (cdr *interpretation*) )

(object (caar prms) )

(direction (cadadr prms) )

(ok nil) )

;cosa a poner

Página 2-16

Page 66: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSFORRlACION DEL PROGRAMA UTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

(if (eq object *carrying*) (setq ok t) )

(if (eq direction 'adelante)

(setq direction *last-direction*) )

(if (and ok (piit-legal direction) )

(put 1 direction)

(progii (forinat t "-%iNo puedo colocar eso! 'I)

(setq *cLIcces* nil) ) ) ) )

(defun produce-reply ( )

(if *succes* (format t "-%Bien, ¿Que sigue?")

(format t "-% No puedo hacer muy bien eso. -%") ) )

;;; La función START es usada para iniciar una sesión. Esta llama a la función

;;; SHOW-STONELAND, la cual despliega Stone World, y el diálogo con el

;;; usuario comienza La función PARSE es llamada para iniciar la interpretación

;;; de cada oración de entrada dada por el usuario

(defvar *direct i on-s lot * ) (defvar *dest in at ion-slot *)

(defvar *object-slot*)

;;; START es la,fitnción de arranque

(defun start ( )

(show-stoneland)

(format t "-%Hey t u afuera que hay !'I)

(format t "-% Para terminar la oración escribir ! . o ?-%'I)

(loop (let* ( (input (input-sentence) ) )

(setq *s* iiiput) )

(parse 'gi)

; ; test para e1,fin del diálogo

(if (es (car *interpretation*) 'bye-command)

;analiza la oración contenida en *S*

(return '(Adios) ) )

(act-upon *interpretation*) ; trata de hacer cmd o resolver unapregunta

Página 2-17

Page 67: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TKANSFOlli\IACiÓN DEL PROGRAMA UTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

(produce-repi y)

(if * succes * (slio w-stone land) )

1 ) ;actualiza stone land

;;; INPUT-SENTENCE obtiene una oración dada por el usuario.

;;; Sólo se leen úiomos hasta que encuentre los siguientes símbolos: ! . ?

(defun input-sentence ( )

(let ( (word (separate-punc (read) ) ) )

(if (atoin word) (cons word (input-sentence) )

word) )

)

;;; SEPARATE-PUNC toma un átomoy verijica si tiene alfinal un caracter de

;;; puntuación, si es asi, este caructer es separado del resto de la cadena, y una lista

;;; de dos átomos separados es regresada: uno para la palabra en s íy otro para el

;;; punto.

;;; Si no hay tales caracteres, simplemente se regresa el argumento de entrada sin

;;; cambios. Los signos de exclamación son convertidos a puntosfinales.

(defun separate-punc (word)

(let* ( (str (string word) )

(len (length str) ) ; se guarda su longitud

(last-char (elt str (1- len) ) ) ) ; se obtiene el último caracter

(if (or (char= last-char #\.)

(char= last-char #\!)

(char= last-char #\?) )

; si se trata d e . ! o ?

(list ; T, se crea una lista de palabra y otra de punto

(intern (subseq str O (1- len) ) )

(intern (string (excl-to-period last-char) ) ) )

; F, se regresa la palabra sin cambios word) ) )

;;; EXCL-TO-PERIOD mapea ! a . y todo lo demds a sí mismo

(defun excl-to-period (c) (if (char= c #\!) #\. c) )

Página 2-18

Page 68: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

TRANSFORhlACIÓN DEL PROGRAMA UTILIZANDO UNA GRAMÁTICA EN ESPAÑOL

2.3 Especificaciones en el uso del programa Para poder hacer uso de una manera correcta del programa de interface con "Stoneworld" se deben seguir las siguientes especificaciones.

Especificaciones técnicas

Este programa fiie realizado en Allegro CL\PC 1.0 para poder ejecutarse se requier lo siguiente:

o Windows

o Mínimo 4 inb de ineinoria.

Una vez compilado el archivo .LSP, se genera un archivo .FSL, el cual se carga mediante la orden Load del menú Archivo.

La función de iiiico es (START)

Cada vez que se de una oración de entrada, esta debe terminar con un punto, de lo contrario será causa de error.

En caso de que sea una pregunta, los signos de interrogación deben ir inmediatamente de cada palabra que los acompaña, ejemplo ¿Qué . . .cargando?.

Página 2-19

Page 69: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

3. Modificación del programa

Una vez hecha la transformación de la gramática (inglés a español) se procede a realizar las siguientes modificaciones al programa:

1. Que Mace acepte ordenes tales como ¿Qué estás cargando? ¿Qué cargas? ¿Estas cargando una piedra?, ¿Donde estás?

2. Lograr que Mace avance un determinado número de pasos, de acuerdo a io que se le indique, ej. "camina 5 pasos hacia el norte"

3. Por último, que pueda llegar a un lugar dado mediante una sola orden: "ve hacia la cantera" pudiendo esquivar obstáculos e identificar si el camino que lleva está sobre Stoneworld (es decir, que sea válido).

3.1 Diseño de la red Para el punto número uno, se agregan arcos y estados a la red, para poder aceptar las ordenes mencionadas, estos serían los siguientes:

El estado de inicio sigue siendo GI, para recorre el arco a P2, se necesita que sea el enunciado de una pregunta (Qué, Donde, etc.), la condición (VERBO) se refiere a los verbos estas, cargas, llevas, etc., (VERBO-GERUNDIO) se refiere al gerundio de un verbo, ejemplos: cargando, llevando, acarreando, etc. Finalmente NPl, es la misma subred que se manejó desde un principio.

Para el punto número dos sólo se agrega un arco al estado G2, de manera que se acepte la parte It . . .5 pasos.. . 'I.

3.2 Modificaciones al programa Ai agregar nuevos estados a la red, estos se tienen que agregar al programa, para que sean recorridos. No se mostrará el programa completo, únicamente las funciones y definiciones que se agregan.

La definición de esta red ya codificada en LISP es la siguiente:

Incorporación de los nuevos arcos a la definición de la red original:

Página 3-1

Page 70: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

MODIFICACI~N DEL PROGRAMA

(setf (get 'p2 'arcs)

Y ( ( (pregunta XI (* Y) ) ;;; verrfica que sea una pregunta

(setq *tipo-pregunta* (list x)) ;; tipo de pregunta (Qué, donde, estas)

(setq *s* y)

(next 'p3)

> > I

(setf (get 'p3 'arcs)

Y ( ( (verbo x> (* Y>

(setq *s* y)

(next 'p4) )

( ( (verb-gerundio x) (* y) )

(next 'P4) 1 )

(setf (get 'p4 'arcs)

Y ( ( (verb-gerundio x) (* y) )

(setq *s* y)

(setq *object-slot* nil)

(next 'p5) )

( (\*I (setq *object-slot* nil)

(setq *interpretation* (list *command* *tipo-pregunta* *object-slot*))

) 1 )

(setf (get 'p5 'arcs)

Y ( (1.1

(((article XI (* Y>>

(setq *interpretation* (list *command* *tipo-pregunta* *object-slot*))

(parse 'np 1)

(setq *object-slot* np 1)

Página 3-2

Page 71: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

MODIFICACI~N DEL PROGRAMA

Se modifica los siguientes procedimientos en la forma que se indica:

A la función ACT-UPON agregar:

( (eq (car si) 'preg-comand)

(setq *succes* t)

(obedece-pregunta si) )

;;; si se trata de una pregunta, realiza

;;; la función OBEDECE-PREGUNTA

;;; Dejhición de la función OBEDECE-PREGUNTA, que responde a la

;;; pregunta que se esté formulando.

(defun obedece-pregunta (si)

(let* ( (prms (cdr *interpretation*) )

(preg (caar prms))

(objeto (caadr prms) ) )

;;; tipo depregunta (Qué, donde, estas)

(cond ( (eq preg 'Qué)

(if (and (eq objeto *carrying*) (eq *carrying* 'p)) ;; si está

;;cargando algo (format t "-% Llevo una piedra ")

(format t "-% No llevo nada") )

1 ( (eq preg 'Estas)

(if (and (es objeto *carrying*) (eq *carrying* 'p))

(format t "-% S i 'I)

(format t "-% NO") )

1 ( (eq preg 'Donde)

(format t "-% Estoy mirando hacia el -a" *last-direction*)

(terpri)

(format t "-% En las coordenadas -a " (get 'M 'position) ) )

1 )

Redefinición de las funciones SEPARATE-PUNC e INPUT-SENTENCE

(defun separate-punc (word)

Página 3-3

Page 72: Casa abierta ai tiempo UNlVERSlD AD AUTONOMA …

MODIFICACI~N DEL PROGRAMA

(if (numberp word) word mueva

;;; para el caso de que se pida se

(let* ( (str (string word) ) ;;; un número de pasos, no se hace cambios

(len (length str) )

(last-char (elt str (1 - len) ) )

; se guarda su longitud

; se obtiene el último caracter

;;se obtiene el primer caracter

;;; s i se trata de unapregunta

(primer-char (elt str O)) )

(cond ((char= primer-char #\¿)

(list (intern (string primer-char))

(intern (subseq str 1 ien))))

((or (char= last-char #\.) ; si se trata de . ! o ?

(char= last-char #\!)

(char= last-char #\?) )

(list ; si, se crea una lista de palabra y otra de punto

(intern (subseq str O (1- len) ) )

(intern (string (excl-to-period last-char) ) ) ))

@word) 1 ) 1 )

(defun input-sentence ( )

(let ( (word (separate-puiic (read) ) ) )

(cond ((atom word) (cons word (input-sentence) ))

((eq (car word) '¿) (append word (input-sentence))) ;separa ,j de la

(t word) ) 1 ;;; pregunta

)

Se modifica la función MATCH, para el caso en que el enunciado a verificar comience con "¿".

Página 3-4