SlideShare una empresa de Scribd logo
1 de 16
ESCUELA POLITÉCNICA NACIONAL

FACULTAD DE INGENIERÍA DE SISTEMAS
INGENIERÍA EN SISTEMAS INFORMÁTICOS Y DE
COMPUTACIÓN
ASIGNATURA:
PROFESOR:
PERÍODO ACADÉMICO:

Inteligencia Artificial
Dr. Hugo A. Banda Gamboa
2013-A

INFORME DE LABORATORIO
TÍTULO DE LA PRÁCTICA: Agenda de Datos Personales en LISP

FECHA DE REALIZACIÓN DE LA PRÁCTICA: 02-09-2013

MIEMBROS DEL GRUPO
• SOSA DANIELA
• PRADO ROBERTO
• PINCHAO ALEXANDER

FECHA PRESENTACIÓN DEL INFORME: 10-09-2013
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

1 Resumen
Realizar un programa de una libreta de teléfonos en lenguaje lisp que nos permita repasar los
conceptos aprendidos en clase sobre metodología y manejo de lenguajes basados en listas y
modelado de operaciones de tipo pre fijo

2 Introducción
Es particularmente cierto que la mejor forma de aprender Lisp es usándolo, porque se trata de un
lenguaje interactivo. Cualquier sistema Lisp, incluye una interfaz interactiva llamada top-level.
Uno escribe expresiones Lisp en el top-level, y el sistema despliega sus valores. El sistema
normalmente despliega un indicador llamado prompt (>) señalando que está esperando que una
expresión sea escrita. Por ejemplo, si escribimos el entero 1 después del prompt y tecleamos
enter, tenemos:
El sistema despliega el valor de la expresión, seguida de un nuevo prompt, indicando que está
listo para evaluar una nueva expresión. En este caso, el sistema desplegó lo mismo que
tecleamos porque los números, como otras constantes, evalúan a si mismos. Las cosas son más
interesantes cuando una expresión necesita algo de trabajo para ser evaluado, por ejemplo, sumar
dos números:
En la expresión (+ 2 3) el símbolo + es llamado el operador y los números 3 y 4 son sus
argumentos. Como el operador viene al principio de la expresión, esta notación se conoce como
prefija y aunque parezca extraña, veremos que es muy práctica. Por ejemplo, si queremos sumar
tres números en notación infija, necesitaríamos usar dos veces el operador +: 2+3+4. En Lisp, las
siguientes sumas son válidas:

Como los operadores pueden tomar un número variable de argumentos, es necesario utilizar los
paréntesis para indicar donde inicia y donde termina una expresión. Las expresiones pueden
anidarse, esto es, el argumento de una expresión puede ser otra expresión compleja.
En español esto corresponde a siete menos uno, dividido por cuatro menos dos. Estética
minimalista, esto es todo lo que hay que decir sobre la notación en Lisp. Toda expresión Lisp es
un átomo, como 1, o bien es una lista que consiste de cero o más expresiones delimitadas por
paréntesis.
Veamos más en detalle como las expresiones son evaluadas para desplegar su valor en el toplevel. En Lisp, + es una función y (+ 2 3) es una llamada a la función. Cuando Lisp evalúa una
llamada a alguna función, lo hace en dos pasos:
•
Los argumentos de la llamada son evaluados de izquierda a derecha.
En este caso, los valores de los argumentos son 2 y 3, respectivamente.

Prof. Dr. Hugo A. Banda Gamboa

1
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

• Los valores de los argumentos son pasados a la función nombrada por el operador. En
este caso la función + que regresa 5.
Si alguno de los argumentos es a su vez una llamada de función, será evaluado con las mismas
reglas. Ej. Al evaluar la expresión (/ (- 7 1) (- 4 2)) pasa lo siguiente.
• Lisp evalúa el primer argumento de izquierda a derecha (- 7 1). 7 es evaluado como 7 y 1
como 1. Estos valores son pasados a la función - que regresa 6.
• El siguiente argumento (- 4 2) es evaluado. 4 es evaluado como 4 y 2 como 2. Estos
valores son pasados a la función - que regresa 2.
• Los valores 6 y 2 son pasados a la función / que regresa 3.
No todos los operadores en Lisp son funciones, pero la mayoría lo son. Todas las llamadas a
función son evaluadas de esta forma, que se conoce como regla de evaluación de Lisp. Los
operadores que no siguen la regla de evaluación se conocen como operadores especiales. Uno de
estos operadores especiales es quote (’). La regla de evaluación de quote es –No evalúes nada,
despliega lo que el usuario tecleo, verbatim.

Lisp provee el operador quote como una forma de evitar que una expresión sea evaluada Lisp
ofrece los tipos de datos que podemos encontrar en otros lenguajes de programación, y otros que
no. Ya hemos usado enteros en los ejemplos precedentes. Las cadenas de caracteres se delimita
por comillas, por ejemplo, “Hola mundo”. Enteros y cadenas evalúan a ellos mismos, como las
constantes. Dos tipos de datos propios de Lisp son los símbolos y las listas. Los símbolos son
palabras. Normalmente se evalúan como si estuvieran escritos en mayúsculas,
independientemente de cómo fueron tecleados.
Los símbolos por lo general no evalúan a si mismos, así que si es necesario referirse a ellos, se
debe usar quote, como en ejemplo anterior, de lo contrario, se producirá un error ya que el
símbolo uno no está acotado (no tiene ligado ningún valor en este momento). Las listas se
representan como cero o más elementos entre paréntesis. Los elementos pueden ser de cualquier
tipo, incluidas las listas. Se debe usar quote con las listas, ya que de otra forma Lisp las tomaría
como una llamada a función.

Se observa que quote protege a toda la expresión, incluidas las sub-expresiones en ella. La lista
(a b c), tampoco fue evaluada. También es posible construir listas usando la función list.
Estética minimalista y pragmática, observen que los programas Lisp se representan como listas.
Si el argumento estético no bastará para defender la notación de Lisp, esto debe bastar –Un
programa Lisp puede generar código Lisp! Por eso es necesario quote. Si una lista es precedida
por el operador quote, la evaluación regresa la misma lista, en otro caso, la lista es evaluada
como si fuese código.
En Lisp hay dos formas de representar la lista vacía, como un par de paréntesis o con el símbolo
nil.

Prof. Dr. Hugo A. Banda Gamboa

2
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

En Lisp, el símbolo t es la representación por default para verdadero. La representación por
default de falso es nil. Ambos se evalúan a si mismos.
Una función cuyo valor de regreso se interpreta como un valor de verdad (verdadero o falso) se
conoce como predicado. En lisp es común que el símbolo de un predicado termine en p. Como
nil juega dos roles en Lisp, las funciones null (lista vacía) y not (negación) hacen exactamente lo
mismo.

El condicional (estructura de control) más simple en Lisp es if. Normalmente toma tres
argumentos: una expresión test, una expresión then y una expresión else. La expresión test es
evaluada, si su valor es verdadero, la expresión then es evaluada; si su valor es falso, la
expresión else es evaluada.

Como quote, if es un operador especial. No puede implementarse como una función, porque los
argumentos de una función siempre se evalúan, y la idea al usar if es que sólo uno de sus
argumentos sea evaluado. Si bien el default para representar verdadero es t, todo excepto nil
cuenta como verdadero en un contexto lógico

Los operadores lógicos and y or parecen condicionales. Ambos toman cualquier número de
argumentos, pero solo evaluar los necesarios para decidir qué valor regresar. Si todos los
argumentos son verdaderos (diferentes de nil), entonces and regresa el valor del último
argumento.
Pero si uno de los argumentos de and resulta falso, ninguno de los argumentos posteriores es
evaluado y el operador regresa nil. De manera similar, or se detiene en cuanto encuentra un
elemento verdadero.
Se observa que los operadores lógicos son operadores especiales, en este caso definidos como
macros.
Es posible definir nuevas funciones con defun que toma normalmente tres argumentos: un
nombre, una lista de parámetros y una o más expresiones que conforman el cuerpo de la función.
El primer argumento de defun indica que el nombre de nuestra función definida será tercero. El
segundo argumento (lst) indica que la función tiene un sólo argumento, lst. Un símbolo usado de
esta forma se conoce como variable. Cuando la variable representa el argumento de una función,
se conoce como parámetro. El resto de la definición indica lo que se debe hacer para calcular el
valor de la función, en este caso, para cualquier lst, se calculará el primer elemento, del resto, del
resto del parámetro (caddr lst).

Prof. Dr. Hugo A. Banda Gamboa

3
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

Ahora que hemos introducido el concepto de variable, es más sencillo entender lo que es un
símbolo. Los símbolos son nombres de variables, que existen con derechos propios en el
lenguaje Lisp. Por ello símbolos y listas deben protegerse con quote para ser accesados. Una lista
debe protegerse porque de otra forma es procesada como si fuese código; un símbolo debe
protegerse porque de otra forma es procesado como si fuese una variable. Podríamos decir que la
definición de una función corresponde a la versión generalizada de una expresión Lisp.
Substituyendo los números particulares por variables, podemos definir una función que verifica
si la suma de sus dos primeros argumentos es mayor que el tercero:

Lisp no distingue entre programa, procedimiento y función; todos cuentan como funciones y de
hecho, casi todo el lenguaje está compuesto de funciones. Si se desea considerar una función en
particular como main, es posible hacerlo, pero cualquier función puede ser llamada desde el toplevel. Entre otras cosas, esto significa que posible probar nuestros programas, pieza por pieza,
conforme los vamos escribiendo, lo que se conoce como programación incremental (bottom-up).
Las funciones que hemos definido hasta ahora, llaman a otras funciones para hacer una parte de
sus cálculos. Ej. suma-mayor-que llama a las funciones + y >. Una función puede llamar a
cualquier otra función, incluida ella misma. Una función que se llama a si misma se conoce
como recursiva.

El predicado eql verifica si sus dos argumentos son idénticos, el resto lo hemos visto
previamente. La llamada a miembro es como sigue:

La descripción en español de lo que hace la función miembro es como sigue:
• Primero, verificar si la lista lst está vacía, en cuyo caso es evidente que obj no es un
miembro de lst.
• De otra forma, si obj es el primer elemento de lst entonces es miembro de la lista.
• De otra forma, obj es miembro de lst únicamente si es miembro del resto delst.
Traducir una función recursiva a una descripción como la anterior, siempre ayuda a entenderla.
Al principio, es común toparse con dificultades para entender la recursividad. Una metáfora
adecuada es ver a las funciones como procesos que vamos resolviendo. Solemos usar procesos
recursivos en nuestras actividades diarias. Si bien los paréntesis delimitan las expresiones en
Lisp, un programador en realidad usa los márgenes en el código para hacerlo más legible. Casi
todo editor puede configurarse para verificar paréntesis bien balanceados.
Hasta el momento hemos procesado las E/S implícitamente, utilizando el top-level.
Para programas interactivos esto no es suficiente1, así que veremos algunas operaciones básicas
de E/S. La función de salida más general en Lisp es format. Esta función toma dos o más
argumentos: el primero indica donde debe imprimirse la salida, el segundo es una cadena que se
usa como molde (template), y el resto son generalmente objetos cuya representación impresa
será insertada en la cadena molde.

Observen que dos líneas fueron desplegadas en el ejemplo anterior. La primera es producida por
format y la segunda es el valor devuelto por la llamada a format, desplegada por el top-level
Prof. Dr. Hugo A. Banda Gamboa

4
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

como se hace con toda función. Normalmente no llamamos a format en el top-level, sino dentro
de alguna función, por lo que el valor que regresa queda generalmente oculto. El primer
argumento de format, t, indica que la salida será desplegada en el dispositivo estándar de salida,
generalmente el top-level. El segundo argumento es una cadena que sirve como molde de lo que
será impreso. Dentro de esta cadena, cada A reserva espacio para insertar un objeto y el % indica
un salto de línea. Los espacios reservados de esta forma, son ocupados por el resto de los
argumentos en el orden en que son evaluados. La función estándar de entrada es read. Sin
argumentos, normalmente la lectura se hace a partir del top-level.

Puesto que read espera indefinidamente a que el usuario escriba algo, no es recomendable usar
read sin desplegar antes un mensaje que solicite la información al usuario. De otra forma el
sistema dará la impresión de haberse plantado. Se debe mencionar que read hace mucho más que
leer caracteres, es un auténtico parser de Lisp que evalúa su entrada y regresa los objetos que se
hayan generado. La función pregunta, aunque corta, muestra algo que no habíamos visto antes:
su cuerpo incluye más de una expresión Lisp. El cuerpo de una función puede incluir cualquier
número de expresiones. Cuando la función es llamada, las expresiones en su cuerpo son
evaluadas en orden y la función regresará el valor de la última expresión evaluada.
Hasta el momento, lo que hemos mostrado se conoce como Lisp puro, esto es, Lisp sin efectos
colaterales. Un efecto colateral es un cambio en el sistema Lisp producto de la evaluación de una
expresión. Cuando evaluamos (+ 2 3), no hay efectos colaterales, el sistema simplemente regresa
el valor 5. Pero al usar format, además de obtener el valor nil, el sistema imprime algo, esto es un
tipo de efecto colateral. Cuando se escribe código sin efectos colaterales, no hay razón alguna
para definir funciones cuyo cuerpo incluye más de una expresión. La última expresión evaluada
en el cuerpo producirá el valor de la función, pero el valor de las expresiones evaluadas antes se
perderá. Uno de los operadores más comunes en Lisp es let, que permite la creación de nuevas
variables locales.

Una expresión let tiene dos partes: Primero viene una lista de expresiones definiendo las nuevas
variables locales, cada una de ellas con la forma (variable expresión). Cada variable es
inicializada con el valor que regrese la expresión asociada a ella. En el ejemplo anterior se han
creado dos variables, x e y, con los valores 1 y 2 respectivamente. Esas variables son válidas
dentro del cuerpo de let. Después de la lista de variables y valores, viene el cuerpo de let
constituido por una serie de expresiones que son evaluadas en orden. En el ejemplo, sólo hay una
llamada a +.

Esta función crea la variable local var para guardar el valor que regresa read. Como este valor
puede ahora ser manipulado por Lisp, la función revisa que se ha escrito para decidir qué hacer.
Si el usuario ha escrito algo que no es un número, la función vuelve a llamarse a sí misma:

Prof. Dr. Hugo A. Banda Gamboa

5
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

Las variables de este estilo se conocen como locales porque sólo son válidas en cierto contexto.
Existe otro tipo de variables llamadas globales, que son visibles donde sea.
Se puede crear una variable global usando defparameter:
Esta variable es visible donde sea, salvo en contextos que definan una variable local con el
mismo nombre. Para evitar errores accidentales con los nombre de las variables, se usa la
convención de nombrar a las variables globales con símbolos que inicien y terminen en asterisco.
Se pueden definir también constantes globales usando defconstant:
No hay necesidad de dar a las constantes nombres distintivos porque si se intenta usar el nombre
de una constante para una variable se produce un error. Para verificar si un símbolo es el nombre
de una variable global o constante, se puede usar boundp.
En Lisp el operador de asignación más común es setf. Se puede usar para asignar valores a
cualquier tipo de variable.

Cuando el primer argumento de setf es un símbolo que no es el nombre de una variable local, se
asume que se trata de una variable global.

Esto es, es posible crear implícitamente variables globales con sólo asignarles valores. Como
sea, es preferible usar explícitamente defparameter. Se puede hacer más que simplemente asignar
valores a variables. El primer argumento de setf puede ser tanto una expresión, como un nombre
de variable. En el primer caso, el valor representado por el segundo argumento es insertado en el
lugar al que hace referencia la expresión.

Se puede dar cualquier número de argumentos pares a setf. Una expresión de la forma:
La programación funcional significa, entre otras cosas, escribir programas que trabajan
regresando valores, en lugar de modificar cosas. Es el paradigma de programación, dominante en
Lisp. La mayor parte de las funciones predefinidas en el lenguaje, se espera sean llamadas por el
valor que producen y no por sus efectos colaterales. La función remove, por ejemplo, toma un
objeto y una lista y regresa una nueva lista que contiene todos los elementos de la lista original,
mejor el objeto indicado:

Prof. Dr. Hugo A. Banda Gamboa

6
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

¿Por qué no decir simplemente que remove remueve un objeto dado de una lista? Porque esto no
es lo que la función hace. La lista original no es modificada:

Si se desea que la lista original sea afectada, se puede evaluar la siguiente expresión:

La programación funcional significa, esencialmente, evitar setf y otras expresiones con el mismo
tipo de efecto colateral. Esto puede parecer contra intuitivo y hasta no deseable. Si bien
programar totalmente sin efectos colaterales es inconveniente, a medida que practiquen Lisp, se
sorprenderán de lo poco que en realidad se necesita este tipo de efecto. Una de las ventajas de la
programación funcional es que permite la verificación interactiva. En código puramente
funcional, se puede verificar cada función a medida que se va escribiendo. Si la función regresa
los valores que esperamos, se puede confiar en que es correcta. La confianza agregada al
proceder de este modo, hace una gran diferencia: un nuevo estilo de programación.

3 Materiales y Métodos
Para la realización de la agenda en lisp, la implementación que escogimos fue una lo que en
lenguaje java se llamaría una lista enlazada en la que poco a poco vamos a ir programando
funciones que nos permitan trabajar de una manera más rápida y mucho más intuitiva, además de
permitirnos que nuestra agenda funciones como una base de datos muy primitiva.
Para la programación y pruebas se usó los programas:
• Allegro Common Lisp 8.2 Free Express Edition
• Clisp GNU
• Notepad++ 6.4.5
FUNCIONES
DESCRIPCION
(defvar *db* nil)
creación de la variable con la cual vamos a
trabajar en un comienzo vacía
(defun agenda-ent (nombre telefono direccion) función en la que definimos los valores que
(list :nombre nombre :telefono telefono
vamos a ingresar así como el formato que van
:direccion direccion))
a tener dentro de la variable antes creada
(defun add-pers (per) (push per *db*))
Función que ingresa los valores en la variable
usando el comando push a modo de una pila
(defun salto-db()(format t "~{~{~a:~10t~a~
Función con la que se le da formato a la
%~}~%~}" *db*))
información que ingresa en la variable *db*
(defun prompt-lec (prompt)
Función de lectura del prompt del programa, y
(format *query-io* "~a:" prompt) (forceque además da formato a lo que se va a
output *query-io*)(read-line *query-io*))
almacenar, en este punto solo está definido el
cómo se va a hacer aún no ingresa nada
(defun prompt-llena()(agenda-ent (prompt-lec Función que permite la lectura e ingreso de los
"nombre")(prompt-lec "telefono")(prompt-lec valores en sus correspondientes espacios
"direccion")))
dentro de la variable, utiliza la función antes
definida agenda-ent
(defun add-perso()(loop(add-pers (promptFunción iterativa , para llenar los espacios de
llena))(if(not (y-or-n-p "otra entrada[y/n]: "))
las entradas a la variable, se detendrá al dar
(return))))
como respuesta n en la ventana de dialogo que
se genera caso contrario permite otro ingreso
Prof. Dr. Hugo A. Banda Gamboa

7
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

(defun select-nom(nombre)(remove-if-not
#'(lambda (per)(equal (getf per :nombre)
nombre))*db* ))
(defun select (selector-fn)(remove-if-not
selector-fn *db*))

Función para determinar el formato de las
búsquedas además de definir la función
lambda
Function que define el espacio que será
consultado dentro de la base de datos

FUNCIONES
(defun nom-selector (nombre)
#'(lambda(per)(equal(getf per :nombre)
nombre)))
(defun where (&key nombre telefono
direccion)
#'(lambda(per)(and(if nombre (equal(getf
per :nombre) nombre) t)
(if telefono (equal (getf per :telefono)
telefono) t)
(if direccion (equal(getf per :direccion)
direccion) t))))
(defun actualizar(selector-fn &key nombre
telefono direccion)(setf *db*(mapcar
#'(lambda(row)(when(funcall selector-fn row)
(if nombre (setf (getf row :nombre)nombre))
(if telefono (setf(getf row :telefono)telefono))
(if direccion (setf(getf row
:direccion)direccion)))
row) *db*) ) )
(defun borrar-todo (selector-fn)(setf
*db*(remove-if selector-fn *db*)))

DESCRIPCION
Función para buscar un espacio en función a
su nombre dentro de la base de datos
Función para realizar la consulta en la base de
datos en función al nombre al teléfono o a la
dirección, presenta los valores en la forma en
la que estarán dentro de la variable *db*

Función para actualizar los valores en función
de nombre, teléfono o dirección para actualizar
se debe de dar los valores que identifiquen la
consulta y los valores con los que se
cambiaran

Función para borrar ingresos en función a el
nombre

4 Resultados
Base de datos vacía

Ingreso de valores en la variable

Cuando ya se terminó de ingresar valores y se escogió la opción no

Prof. Dr. Hugo A. Banda Gamboa

8
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

Revisión de las entradas en la variable

Búsqueda por nombre

Búsqueda por teléfono

Búsqueda por dirección

Actualizar en función al nombre

Borrado en función al nombre

Base de datos como quedo luego de las actualizaciones y borrados

5 Discusión
El lenguaje de programación lisp es muy poderoso, y permite un desarrollo de programas de una
manera mucho más sencilla (una vez que se entiende cómo funciona), los resultados obtenidos
resultan ser de lo más alentadores ya que se logró generar un programa altamente funcional, que
nada tiene que envidiar a los realizados con otros programas y sin necesidad de tener que hacer
llamados o cargas de librerías para trabajar, se nota la clara ventaja de este lenguaje de
Prof. Dr. Hugo A. Banda Gamboa

9
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

programación en especial cuando un programa igual en java c o c++ necesitaría como mínimo
unas 100 líneas de código , mientras que el desarrollo en lisp no necesito más de 15 líneas.

6 Conclusiones
• La curva de aprendizaje de este lenguaje de programación en realidad es muy
pronunciada es decir se invierte mucho tiempo y se logra avanzar muy poco en su
comprensión
• Los errores de sintaxis pueden ser fatales, una comilla simple mal puesta o un par de
puntos mal colocado puede dañar los ingresos realizados o dañar el formato que se ha
definido para la representación de los mismos
• Es mucho más fácil crear las variables con valores vacíos y luego proceder a llenar con
los datos que crearlas inicializadas ya que de este modo no se puede dar formato con
libertad
• Los paréntesis pueden ser usados de otras formas además de delimitar las funciones,
pueden distribuirse de manera que faciliten o entorpezcan la interpretación del código
en caso de no querer que alguien se entere de lo que se está haciendo o de querer usarlo
para explicar el uso del mismo.
• Lisp no distingue entre programa, procedimiento y función; todos cuentan como
funciones y de hecho, casi todo el lenguaje está compuesto de funciones
• En Lisp las funciones son objetos regulares como los símbolos, las cadenas y las listas
• La macro defun crea una función y le da un nombre, pero las funciones no tienen por
qué tener nombre y no necesitamos defun para crearlas. Como los otros tipos de objeto
en Lisp, podemos definir a las funciones literalmente (pero es más facil usar defun).
• Lisp utiliza un inusual enfoque flexible sobre tipos. En muchos lenguajes, las variables
tienen un tipo asociado y no es posible usar una variable sin especificar su tipo. En Lisp,
los valores tienen un tipo, no las variables.
• Si C es el lenguaje para escribir UNIX, entonces podríamos describir a Lisp como el
lenguaje para describir Lisp, pero eso es una historia totalmente diferente. Un lenguaje
que puede ser escrito en sí mismo, es algo distinto de un lenguaje para escribir una clase
particular de aplicaciones. Ofrece una nueva forma de programar: así como es posible
escribir un programa en el lenguaje, ¡el lenguaje puede mejorarse para acomodarse al
programa! Esto es un buen inicio para entender la esencia de Lisp.

7 Recomendaciones
•
•
•

Se necesita definir mejor las funciones de lectura de prompt para ingreso de datos ya
que las dadas en el manual básico de programación en lisp que se nos dio, se necesita
saber el orden de entrada y el orden de escritura
Definir mejor las funciones de salida ya que con la dad no se puede dar formato
Definir variables y listas de mejor manera, ya que si se define bien una variable puede
facilitarse mucho la forma de ingresar los datos.

8 Referencias
[1]
[2]
[3]
[4]

P. Seibel, “Practical common lisp” , 2nd ed. . New York: APRESS, 2005, pp. 15–64.
D.S. Touretzky, “Common LISP: A Gentle Introduction to Symbolic Computation” , the
Benjamin Cummings publishing company, 2013
C. Barski, “Land of Lisp: Learn to Program in Lisp, One Game at a Time!” , 2nd ed. .
San Francisco: No Starch Press, 2011,
P. Winston, “Lisp” , 2nd ed. . New York: APRESS, 2011

Prof. Dr. Hugo A. Banda Gamboa

10
Ingeniería de Sistemas Informáticos y de Computación

[5]

Laboratorio de Inteligencia Artificial

S. Howard, “Common Lisp Programming” , CAnada: Kindle, 2010

9 ANEXOS (En formato digital)
9.1 Código fuente y archivos ejecutables de la solución desarrollada
(defun agenda-ent (nombre telefono direccion)(list :nombre nombre :telefono telefono :direccion
direccion))
(defvar *db* nil)
(defun add-pers (per) (push per *db*))
(defun salto-db()(format t "~{~{~a:~10t~a~%~}~%~}" *db*))
(defun prompt-lec (prompt)(format *query-io* "~a:" prompt) (force-output *query-io*)(read-line
*query-io*))
(defun prompt-llena()(agenda-ent (prompt-lec "nombre")(prompt-lec "telefono")(prompt-lec
"direccion")))
(defun add-perso()(loop(add-pers (prompt-llena))(if(not (y-or-n-p "otra entrada[y/n]: "))
(return))))
(defun select-nom(nombre)(remove-if-not
#'(lambda (per)(equal (getf per :nombre) nombre))*db* ))
(defun select (selector-fn)(remove-if-not selector-fn *db*))
(defun nom-selector (nombre)
#'(lambda(per)(equal(getf per :nombre) nombre)))
(defun where (&key nombre telefono direccion)
#'(lambda(per)(and(if nombre (equal(getf per :nombre) nombre) t)
(if telefono (equal (getf per :telefono) telefono) t)
(if direccion (equal(getf per :direccion) direccion) t))))
(defun actualizar(selector-fn &key nombre telefono direccion)(setf *db*(mapcar
#'(lambda(row)(when(funcall selector-fn row)
(if nombre (setf (getf row :nombre)nombre))
(if telefono (setf(getf row :telefono)telefono))
(if direccion (setf(getf row :direccion)direccion)))
row) *db*) ) )
(defun borrar-todo (selector-fn)(setf *db*(remove-if selector-fn *db*)))

9.2 Instrucciones para la instalación, ejecución y pruebas de la
solución informática desarrollada
Las siguientes instrucciones son para poder abrir el programa usando el interprete allegro
common lisp
1.- Copiar el código fuente en el editor,

Prof. Dr. Hugo A. Banda Gamboa

11
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

2.- Guardar con el nombre que se le va a asignar

3.- Verificar que se guardo bien

4.- Abrir file ir, a load, y seleccionar el archivo que creamos antes

Prof. Dr. Hugo A. Banda Gamboa

12
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

5.- Esperar que salga el mensaje de carga del common lisp, esperar a que cargue correctamente
(En el caso de allegro common lisp, que no salte la ventana informándonos que an ocurrido
errores) y comenzar

Como manejar el programa
Mostrar el contenido de la variable (por ahora estará en nil ya que la variable esta vacia)
Se usara *db*

Ingreso de valores en la variable, los valores se iran ingresando uno a uno primero nombre, luego
telefono, luego direccion, para ingresar cada valor se da enter en caso de querer realizar mas
entradas se elejira la opción yes
Se usara (add-perso)

Cuando ya se terminó de ingresar valores y se escogió la opción no y se retornara un valor nil
por el valor del boton

Prof. Dr. Hugo A. Banda Gamboa

13
Ingeniería de Sistemas Informáticos y de Computación

Laboratorio de Inteligencia Artificial

Revisión de las entradas en la variable

Búsqueda por nombre
Se usara (select (where :nombre “nombre-a-buscar”))

Búsqueda por teléfono
Se usara (select (where :telefono “telefono-a-buscar”))

Búsqueda por dirección
Se usara (select (where :direccion “direccion-a-buscar”))

Actualizar en función al nombre se puede usar para actualizar en función a telefono , o a
direccion solo hay que definir espacio a ser actualizado y valor que se va ha actualizar
Se usara (actualizar(where :nombre “nombre-a-actualizar”):telefono “valor-actualizado”)

Borrado en función al nombre se puede usar para borrar en función a direccion o en función a
telefono solo hay que definir correctamente el espacio a borrar y que borrar
Se usara (borrar-todo(where :nombre “nombre-a borrar”))

Base de datos como quedo luego de las actualizaciones y borrados

Prof. Dr. Hugo A. Banda Gamboa

14
Ingeniería de Sistemas Informáticos y de Computación

Prof. Dr. Hugo A. Banda Gamboa

Laboratorio de Inteligencia Artificial

15

Más contenido relacionado

La actualidad más candente

Presentación 2014 profe gabriel
Presentación 2014 profe gabrielPresentación 2014 profe gabriel
Presentación 2014 profe gabrielEnrique Morales
 
Lisp tutorial en latex
Lisp tutorial en latexLisp tutorial en latex
Lisp tutorial en latexomar quito
 
Clase analisis lexico
Clase analisis lexicoClase analisis lexico
Clase analisis lexicoInfomania pro
 
Gramatica libre de contexto
Gramatica libre de contextoGramatica libre de contexto
Gramatica libre de contextoDaniel Molina
 
Analizador sintactico
Analizador sintacticoAnalizador sintactico
Analizador sintacticoalexisdario
 
Automatas y compiladores analisis sintactico
Automatas y compiladores analisis sintacticoAutomatas y compiladores analisis sintactico
Automatas y compiladores analisis sintacticoGermania Rodriguez
 
Análisis léxico y análisis sintáctico
Análisis léxico y análisis sintácticoAnálisis léxico y análisis sintáctico
Análisis léxico y análisis sintácticoangiepao1717
 
Software de Programación Lógica.
Software de Programación Lógica.Software de Programación Lógica.
Software de Programación Lógica.Edison Guerra
 
Compiladores analizadores gramática y algo mas
Compiladores analizadores gramática y algo masCompiladores analizadores gramática y algo mas
Compiladores analizadores gramática y algo mascesarkt
 
37 tarazona karen programacion
37 tarazona karen programacion37 tarazona karen programacion
37 tarazona karen programacionkarenyulithza
 
Clase6 ejemplo analisis lexico dev cpp
Clase6 ejemplo analisis lexico dev cppClase6 ejemplo analisis lexico dev cpp
Clase6 ejemplo analisis lexico dev cppInfomania pro
 
Analizadores Sintácticos
Analizadores SintácticosAnalizadores Sintácticos
Analizadores SintácticosBryant Arellano
 

La actualidad más candente (20)

Presentación 2014 profe gabriel
Presentación 2014 profe gabrielPresentación 2014 profe gabriel
Presentación 2014 profe gabriel
 
Lisp tutorial en latex
Lisp tutorial en latexLisp tutorial en latex
Lisp tutorial en latex
 
Clase analisis lexico
Clase analisis lexicoClase analisis lexico
Clase analisis lexico
 
Gramatica libre de contexto
Gramatica libre de contextoGramatica libre de contexto
Gramatica libre de contexto
 
Semantico.apun
Semantico.apunSemantico.apun
Semantico.apun
 
Analizador sintactico
Analizador sintacticoAnalizador sintactico
Analizador sintactico
 
Claselexico
ClaselexicoClaselexico
Claselexico
 
Automatas y compiladores analisis sintactico
Automatas y compiladores analisis sintacticoAutomatas y compiladores analisis sintactico
Automatas y compiladores analisis sintactico
 
Análisis léxico y análisis sintáctico
Análisis léxico y análisis sintácticoAnálisis léxico y análisis sintáctico
Análisis léxico y análisis sintáctico
 
Software de Programación Lógica.
Software de Programación Lógica.Software de Programación Lógica.
Software de Programación Lógica.
 
AnáLisis LéXico
AnáLisis LéXicoAnáLisis LéXico
AnáLisis LéXico
 
Lenguaje Lisp
Lenguaje LispLenguaje Lisp
Lenguaje Lisp
 
Compiladores analizadores gramática y algo mas
Compiladores analizadores gramática y algo masCompiladores analizadores gramática y algo mas
Compiladores analizadores gramática y algo mas
 
Analisis sintactico
Analisis sintacticoAnalisis sintactico
Analisis sintactico
 
Compiladores, Analisis Lexico Conceptos
Compiladores, Analisis Lexico ConceptosCompiladores, Analisis Lexico Conceptos
Compiladores, Analisis Lexico Conceptos
 
37 tarazona karen programacion
37 tarazona karen programacion37 tarazona karen programacion
37 tarazona karen programacion
 
Clase6 ejemplo analisis lexico dev cpp
Clase6 ejemplo analisis lexico dev cppClase6 ejemplo analisis lexico dev cpp
Clase6 ejemplo analisis lexico dev cpp
 
Analizador léxico
Analizador léxicoAnalizador léxico
Analizador léxico
 
Tr asem-ver
Tr asem-verTr asem-ver
Tr asem-ver
 
Analizadores Sintácticos
Analizadores SintácticosAnalizadores Sintácticos
Analizadores Sintácticos
 

Similar a Agenda de Datos Personales en LISP

Conceptos fundmentales
Conceptos fundmentalesConceptos fundmentales
Conceptos fundmentalesalondrashare
 
Python guia01 1
Python guia01 1Python guia01 1
Python guia01 1zeta2015
 
PARADIGMA FUNCIONAL
PARADIGMA FUNCIONALPARADIGMA FUNCIONAL
PARADIGMA FUNCIONALFredy Olaya
 
Variables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeIntVariables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeIntCristian C
 
9. listas y for-in
9.  listas y for-in9.  listas y for-in
9. listas y for-inFaby Ignacio
 
Presentacion del pseudocodigo2ºam
Presentacion del pseudocodigo2ºamPresentacion del pseudocodigo2ºam
Presentacion del pseudocodigo2ºamEsmeralda Salvador
 
Alguas ideas de estructura de datos
Alguas ideas de estructura de datosAlguas ideas de estructura de datos
Alguas ideas de estructura de datosWolphkens Leveille
 
Estructura datos unidad-2_y_3
Estructura datos unidad-2_y_3Estructura datos unidad-2_y_3
Estructura datos unidad-2_y_3Jhon_Marjorie
 
DIAPOSITIVAS DE LA UNIDAD 3
DIAPOSITIVAS DE LA UNIDAD 3DIAPOSITIVAS DE LA UNIDAD 3
DIAPOSITIVAS DE LA UNIDAD 3efrain_rap
 
Estructura datos unidad-2_y_3
Estructura datos unidad-2_y_3Estructura datos unidad-2_y_3
Estructura datos unidad-2_y_3marioUitzil
 
conceptos basicos lenguajes de programacion.pdf
conceptos basicos lenguajes de programacion.pdfconceptos basicos lenguajes de programacion.pdf
conceptos basicos lenguajes de programacion.pdfcarlosquiza2
 
Act. Individual.- Pseudocódigos y diagramas de flujo
 Act. Individual.- Pseudocódigos y diagramas de flujo Act. Individual.- Pseudocódigos y diagramas de flujo
Act. Individual.- Pseudocódigos y diagramas de flujoElizabeth Reyna
 
Algoritmos y programas super manual de algoritmia
Algoritmos y programas   super manual de algoritmiaAlgoritmos y programas   super manual de algoritmia
Algoritmos y programas super manual de algoritmiaEsteban Bedoya
 
Introducción a la programación
Introducción  a la programaciónIntroducción  a la programación
Introducción a la programaciónH Trujillo
 

Similar a Agenda de Datos Personales en LISP (20)

Conceptos fundmentales
Conceptos fundmentalesConceptos fundmentales
Conceptos fundmentales
 
Cálculo proposicional y de predicados
Cálculo proposicional y de predicadosCálculo proposicional y de predicados
Cálculo proposicional y de predicados
 
Python guia01 1
Python guia01 1Python guia01 1
Python guia01 1
 
PARADIGMA FUNCIONAL
PARADIGMA FUNCIONALPARADIGMA FUNCIONAL
PARADIGMA FUNCIONAL
 
Variables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeIntVariables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeInt
 
9. listas y for-in
9.  listas y for-in9.  listas y for-in
9. listas y for-in
 
Presentacion del pseudocodigo2ºam
Presentacion del pseudocodigo2ºamPresentacion del pseudocodigo2ºam
Presentacion del pseudocodigo2ºam
 
Alguas ideas de estructura de datos
Alguas ideas de estructura de datosAlguas ideas de estructura de datos
Alguas ideas de estructura de datos
 
Python 4
Python 4Python 4
Python 4
 
Estructura datos unidad-2_y_3
Estructura datos unidad-2_y_3Estructura datos unidad-2_y_3
Estructura datos unidad-2_y_3
 
DIAPOSITIVAS DE LA UNIDAD 3
DIAPOSITIVAS DE LA UNIDAD 3DIAPOSITIVAS DE LA UNIDAD 3
DIAPOSITIVAS DE LA UNIDAD 3
 
Estructura datos unidad-2_y_3
Estructura datos unidad-2_y_3Estructura datos unidad-2_y_3
Estructura datos unidad-2_y_3
 
Unidad 2 & 3 estructura datos
Unidad 2 & 3 estructura datosUnidad 2 & 3 estructura datos
Unidad 2 & 3 estructura datos
 
T37 isc zaraos vazquez jorge alejandro
T37 isc zaraos vazquez jorge alejandroT37 isc zaraos vazquez jorge alejandro
T37 isc zaraos vazquez jorge alejandro
 
conceptos basicos lenguajes de programacion.pdf
conceptos basicos lenguajes de programacion.pdfconceptos basicos lenguajes de programacion.pdf
conceptos basicos lenguajes de programacion.pdf
 
4072954.ppt
4072954.ppt4072954.ppt
4072954.ppt
 
Act. Individual.- Pseudocódigos y diagramas de flujo
 Act. Individual.- Pseudocódigos y diagramas de flujo Act. Individual.- Pseudocódigos y diagramas de flujo
Act. Individual.- Pseudocódigos y diagramas de flujo
 
Algoritmos y programas super manual de algoritmia
Algoritmos y programas   super manual de algoritmiaAlgoritmos y programas   super manual de algoritmia
Algoritmos y programas super manual de algoritmia
 
Lógica y Algoritmos
Lógica y AlgoritmosLógica y Algoritmos
Lógica y Algoritmos
 
Introducción a la programación
Introducción  a la programaciónIntroducción  a la programación
Introducción a la programación
 

Más de Alex Pin

Configuracion de redes vlan
Configuracion de redes vlanConfiguracion de redes vlan
Configuracion de redes vlanAlex Pin
 
ingeniera social
ingeniera socialingeniera social
ingeniera socialAlex Pin
 
Ingeniera social carlosbiscione
Ingeniera social carlosbiscioneIngeniera social carlosbiscione
Ingeniera social carlosbiscioneAlex Pin
 
programación en prolog
programación en prologprogramación en prolog
programación en prologAlex Pin
 
seguridad informática
seguridad informáticaseguridad informática
seguridad informáticaAlex Pin
 
Administración de sistemas linux
Administración de sistemas linuxAdministración de sistemas linux
Administración de sistemas linuxAlex Pin
 
Introducción a la_neuro_computación
Introducción a la_neuro_computaciónIntroducción a la_neuro_computación
Introducción a la_neuro_computaciónAlex Pin
 
Catedral y bazar una visión analítica de la técnica de desarrollo open source
Catedral y bazar una visión analítica de la técnica de desarrollo open source Catedral y bazar una visión analítica de la técnica de desarrollo open source
Catedral y bazar una visión analítica de la técnica de desarrollo open source Alex Pin
 
Analisis y-modelado-de-amenazas
Analisis y-modelado-de-amenazasAnalisis y-modelado-de-amenazas
Analisis y-modelado-de-amenazasAlex Pin
 
Comparacion de las estructuras de bloque de los sistemas operativos symbian, ...
Comparacion de las estructuras de bloque de los sistemas operativos symbian, ...Comparacion de las estructuras de bloque de los sistemas operativos symbian, ...
Comparacion de las estructuras de bloque de los sistemas operativos symbian, ...Alex Pin
 
Descripcion del S.O. Symbian para el desarrollo de aplicaciones en la red GPRS
Descripcion del S.O. Symbian para el desarrollo de aplicaciones en la red GPRSDescripcion del S.O. Symbian para el desarrollo de aplicaciones en la red GPRS
Descripcion del S.O. Symbian para el desarrollo de aplicaciones en la red GPRSAlex Pin
 
Trabajo symbian
Trabajo symbianTrabajo symbian
Trabajo symbianAlex Pin
 
Torres de hanoi
Torres de hanoiTorres de hanoi
Torres de hanoiAlex Pin
 
manufactura inteligente
manufactura inteligentemanufactura inteligente
manufactura inteligenteAlex Pin
 
Arboles avl
Arboles avlArboles avl
Arboles avlAlex Pin
 
Tutorial perl en linux
Tutorial perl en linuxTutorial perl en linux
Tutorial perl en linuxAlex Pin
 
Informe minishell
Informe minishellInforme minishell
Informe minishellAlex Pin
 
Pilas y Colas
Pilas y ColasPilas y Colas
Pilas y ColasAlex Pin
 

Más de Alex Pin (20)

Configuracion de redes vlan
Configuracion de redes vlanConfiguracion de redes vlan
Configuracion de redes vlan
 
ingeniera social
ingeniera socialingeniera social
ingeniera social
 
Ingeniera social carlosbiscione
Ingeniera social carlosbiscioneIngeniera social carlosbiscione
Ingeniera social carlosbiscione
 
programación en prolog
programación en prologprogramación en prolog
programación en prolog
 
seguridad informática
seguridad informáticaseguridad informática
seguridad informática
 
Administración de sistemas linux
Administración de sistemas linuxAdministración de sistemas linux
Administración de sistemas linux
 
LISP
LISP LISP
LISP
 
Introducción a la_neuro_computación
Introducción a la_neuro_computaciónIntroducción a la_neuro_computación
Introducción a la_neuro_computación
 
Catedral y bazar una visión analítica de la técnica de desarrollo open source
Catedral y bazar una visión analítica de la técnica de desarrollo open source Catedral y bazar una visión analítica de la técnica de desarrollo open source
Catedral y bazar una visión analítica de la técnica de desarrollo open source
 
Analisis y-modelado-de-amenazas
Analisis y-modelado-de-amenazasAnalisis y-modelado-de-amenazas
Analisis y-modelado-de-amenazas
 
Comparacion de las estructuras de bloque de los sistemas operativos symbian, ...
Comparacion de las estructuras de bloque de los sistemas operativos symbian, ...Comparacion de las estructuras de bloque de los sistemas operativos symbian, ...
Comparacion de las estructuras de bloque de los sistemas operativos symbian, ...
 
Descripcion del S.O. Symbian para el desarrollo de aplicaciones en la red GPRS
Descripcion del S.O. Symbian para el desarrollo de aplicaciones en la red GPRSDescripcion del S.O. Symbian para el desarrollo de aplicaciones en la red GPRS
Descripcion del S.O. Symbian para el desarrollo de aplicaciones en la red GPRS
 
Trabajo symbian
Trabajo symbianTrabajo symbian
Trabajo symbian
 
Torres de hanoi
Torres de hanoiTorres de hanoi
Torres de hanoi
 
manufactura inteligente
manufactura inteligentemanufactura inteligente
manufactura inteligente
 
Arboles avl
Arboles avlArboles avl
Arboles avl
 
NASM
NASM NASM
NASM
 
Tutorial perl en linux
Tutorial perl en linuxTutorial perl en linux
Tutorial perl en linux
 
Informe minishell
Informe minishellInforme minishell
Informe minishell
 
Pilas y Colas
Pilas y ColasPilas y Colas
Pilas y Colas
 

Último

Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Carlos Muñoz
 
SINTAXIS DE LA ORACIÓN SIMPLE 2023-2024.pptx
SINTAXIS DE LA ORACIÓN SIMPLE 2023-2024.pptxSINTAXIS DE LA ORACIÓN SIMPLE 2023-2024.pptx
SINTAXIS DE LA ORACIÓN SIMPLE 2023-2024.pptxlclcarmen
 
EXPECTATIVAS vs PERSPECTIVA en la vida.
EXPECTATIVAS vs PERSPECTIVA  en la vida.EXPECTATIVAS vs PERSPECTIVA  en la vida.
EXPECTATIVAS vs PERSPECTIVA en la vida.DaluiMonasterio
 
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADODECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADOJosé Luis Palma
 
Historia y técnica del collage en el arte
Historia y técnica del collage en el arteHistoria y técnica del collage en el arte
Historia y técnica del collage en el arteRaquel Martín Contreras
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdfBaker Publishing Company
 
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptxACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptxzulyvero07
 
30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdfgimenanahuel
 
PRIMER SEMESTRE 2024 ASAMBLEA DEPARTAMENTAL.pptx
PRIMER SEMESTRE 2024 ASAMBLEA DEPARTAMENTAL.pptxPRIMER SEMESTRE 2024 ASAMBLEA DEPARTAMENTAL.pptx
PRIMER SEMESTRE 2024 ASAMBLEA DEPARTAMENTAL.pptxinformacionasapespu
 
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptxEXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptxPryhaSalam
 
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdfDemetrio Ccesa Rayme
 
Heinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoHeinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoFundación YOD YOD
 
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdfResolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdfDemetrio Ccesa Rayme
 
Registro Auxiliar - Primaria 2024 (1).pptx
Registro Auxiliar - Primaria  2024 (1).pptxRegistro Auxiliar - Primaria  2024 (1).pptx
Registro Auxiliar - Primaria 2024 (1).pptxFelicitasAsuncionDia
 
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIARAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIACarlos Campaña Montenegro
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.amayarogel
 

Último (20)

Sesión de clase: Defendamos la verdad.pdf
Sesión de clase: Defendamos la verdad.pdfSesión de clase: Defendamos la verdad.pdf
Sesión de clase: Defendamos la verdad.pdf
 
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
 
SINTAXIS DE LA ORACIÓN SIMPLE 2023-2024.pptx
SINTAXIS DE LA ORACIÓN SIMPLE 2023-2024.pptxSINTAXIS DE LA ORACIÓN SIMPLE 2023-2024.pptx
SINTAXIS DE LA ORACIÓN SIMPLE 2023-2024.pptx
 
EXPECTATIVAS vs PERSPECTIVA en la vida.
EXPECTATIVAS vs PERSPECTIVA  en la vida.EXPECTATIVAS vs PERSPECTIVA  en la vida.
EXPECTATIVAS vs PERSPECTIVA en la vida.
 
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADODECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
 
Historia y técnica del collage en el arte
Historia y técnica del collage en el arteHistoria y técnica del collage en el arte
Historia y técnica del collage en el arte
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf
 
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptxACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
ACUERDO MINISTERIAL 078-ORGANISMOS ESCOLARES..pptx
 
30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf
 
La Trampa De La Felicidad. Russ-Harris.pdf
La Trampa De La Felicidad. Russ-Harris.pdfLa Trampa De La Felicidad. Russ-Harris.pdf
La Trampa De La Felicidad. Russ-Harris.pdf
 
PRIMER SEMESTRE 2024 ASAMBLEA DEPARTAMENTAL.pptx
PRIMER SEMESTRE 2024 ASAMBLEA DEPARTAMENTAL.pptxPRIMER SEMESTRE 2024 ASAMBLEA DEPARTAMENTAL.pptx
PRIMER SEMESTRE 2024 ASAMBLEA DEPARTAMENTAL.pptx
 
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptxEXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
 
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdf
 
Heinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativoHeinsohn Privacidad y Ciberseguridad para el sector educativo
Heinsohn Privacidad y Ciberseguridad para el sector educativo
 
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdfResolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
 
Registro Auxiliar - Primaria 2024 (1).pptx
Registro Auxiliar - Primaria  2024 (1).pptxRegistro Auxiliar - Primaria  2024 (1).pptx
Registro Auxiliar - Primaria 2024 (1).pptx
 
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIARAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
RAIZ CUADRADA Y CUBICA PARA NIÑOS DE PRIMARIA
 
Repaso Pruebas CRECE PR 2024. Ciencia General
Repaso Pruebas CRECE PR 2024. Ciencia GeneralRepaso Pruebas CRECE PR 2024. Ciencia General
Repaso Pruebas CRECE PR 2024. Ciencia General
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.
 
Defendamos la verdad. La defensa es importante.
Defendamos la verdad. La defensa es importante.Defendamos la verdad. La defensa es importante.
Defendamos la verdad. La defensa es importante.
 

Agenda de Datos Personales en LISP

  • 1. ESCUELA POLITÉCNICA NACIONAL FACULTAD DE INGENIERÍA DE SISTEMAS INGENIERÍA EN SISTEMAS INFORMÁTICOS Y DE COMPUTACIÓN ASIGNATURA: PROFESOR: PERÍODO ACADÉMICO: Inteligencia Artificial Dr. Hugo A. Banda Gamboa 2013-A INFORME DE LABORATORIO TÍTULO DE LA PRÁCTICA: Agenda de Datos Personales en LISP FECHA DE REALIZACIÓN DE LA PRÁCTICA: 02-09-2013 MIEMBROS DEL GRUPO • SOSA DANIELA • PRADO ROBERTO • PINCHAO ALEXANDER FECHA PRESENTACIÓN DEL INFORME: 10-09-2013
  • 2. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial 1 Resumen Realizar un programa de una libreta de teléfonos en lenguaje lisp que nos permita repasar los conceptos aprendidos en clase sobre metodología y manejo de lenguajes basados en listas y modelado de operaciones de tipo pre fijo 2 Introducción Es particularmente cierto que la mejor forma de aprender Lisp es usándolo, porque se trata de un lenguaje interactivo. Cualquier sistema Lisp, incluye una interfaz interactiva llamada top-level. Uno escribe expresiones Lisp en el top-level, y el sistema despliega sus valores. El sistema normalmente despliega un indicador llamado prompt (>) señalando que está esperando que una expresión sea escrita. Por ejemplo, si escribimos el entero 1 después del prompt y tecleamos enter, tenemos: El sistema despliega el valor de la expresión, seguida de un nuevo prompt, indicando que está listo para evaluar una nueva expresión. En este caso, el sistema desplegó lo mismo que tecleamos porque los números, como otras constantes, evalúan a si mismos. Las cosas son más interesantes cuando una expresión necesita algo de trabajo para ser evaluado, por ejemplo, sumar dos números: En la expresión (+ 2 3) el símbolo + es llamado el operador y los números 3 y 4 son sus argumentos. Como el operador viene al principio de la expresión, esta notación se conoce como prefija y aunque parezca extraña, veremos que es muy práctica. Por ejemplo, si queremos sumar tres números en notación infija, necesitaríamos usar dos veces el operador +: 2+3+4. En Lisp, las siguientes sumas son válidas: Como los operadores pueden tomar un número variable de argumentos, es necesario utilizar los paréntesis para indicar donde inicia y donde termina una expresión. Las expresiones pueden anidarse, esto es, el argumento de una expresión puede ser otra expresión compleja. En español esto corresponde a siete menos uno, dividido por cuatro menos dos. Estética minimalista, esto es todo lo que hay que decir sobre la notación en Lisp. Toda expresión Lisp es un átomo, como 1, o bien es una lista que consiste de cero o más expresiones delimitadas por paréntesis. Veamos más en detalle como las expresiones son evaluadas para desplegar su valor en el toplevel. En Lisp, + es una función y (+ 2 3) es una llamada a la función. Cuando Lisp evalúa una llamada a alguna función, lo hace en dos pasos: • Los argumentos de la llamada son evaluados de izquierda a derecha. En este caso, los valores de los argumentos son 2 y 3, respectivamente. Prof. Dr. Hugo A. Banda Gamboa 1
  • 3. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial • Los valores de los argumentos son pasados a la función nombrada por el operador. En este caso la función + que regresa 5. Si alguno de los argumentos es a su vez una llamada de función, será evaluado con las mismas reglas. Ej. Al evaluar la expresión (/ (- 7 1) (- 4 2)) pasa lo siguiente. • Lisp evalúa el primer argumento de izquierda a derecha (- 7 1). 7 es evaluado como 7 y 1 como 1. Estos valores son pasados a la función - que regresa 6. • El siguiente argumento (- 4 2) es evaluado. 4 es evaluado como 4 y 2 como 2. Estos valores son pasados a la función - que regresa 2. • Los valores 6 y 2 son pasados a la función / que regresa 3. No todos los operadores en Lisp son funciones, pero la mayoría lo son. Todas las llamadas a función son evaluadas de esta forma, que se conoce como regla de evaluación de Lisp. Los operadores que no siguen la regla de evaluación se conocen como operadores especiales. Uno de estos operadores especiales es quote (’). La regla de evaluación de quote es –No evalúes nada, despliega lo que el usuario tecleo, verbatim. Lisp provee el operador quote como una forma de evitar que una expresión sea evaluada Lisp ofrece los tipos de datos que podemos encontrar en otros lenguajes de programación, y otros que no. Ya hemos usado enteros en los ejemplos precedentes. Las cadenas de caracteres se delimita por comillas, por ejemplo, “Hola mundo”. Enteros y cadenas evalúan a ellos mismos, como las constantes. Dos tipos de datos propios de Lisp son los símbolos y las listas. Los símbolos son palabras. Normalmente se evalúan como si estuvieran escritos en mayúsculas, independientemente de cómo fueron tecleados. Los símbolos por lo general no evalúan a si mismos, así que si es necesario referirse a ellos, se debe usar quote, como en ejemplo anterior, de lo contrario, se producirá un error ya que el símbolo uno no está acotado (no tiene ligado ningún valor en este momento). Las listas se representan como cero o más elementos entre paréntesis. Los elementos pueden ser de cualquier tipo, incluidas las listas. Se debe usar quote con las listas, ya que de otra forma Lisp las tomaría como una llamada a función. Se observa que quote protege a toda la expresión, incluidas las sub-expresiones en ella. La lista (a b c), tampoco fue evaluada. También es posible construir listas usando la función list. Estética minimalista y pragmática, observen que los programas Lisp se representan como listas. Si el argumento estético no bastará para defender la notación de Lisp, esto debe bastar –Un programa Lisp puede generar código Lisp! Por eso es necesario quote. Si una lista es precedida por el operador quote, la evaluación regresa la misma lista, en otro caso, la lista es evaluada como si fuese código. En Lisp hay dos formas de representar la lista vacía, como un par de paréntesis o con el símbolo nil. Prof. Dr. Hugo A. Banda Gamboa 2
  • 4. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial En Lisp, el símbolo t es la representación por default para verdadero. La representación por default de falso es nil. Ambos se evalúan a si mismos. Una función cuyo valor de regreso se interpreta como un valor de verdad (verdadero o falso) se conoce como predicado. En lisp es común que el símbolo de un predicado termine en p. Como nil juega dos roles en Lisp, las funciones null (lista vacía) y not (negación) hacen exactamente lo mismo. El condicional (estructura de control) más simple en Lisp es if. Normalmente toma tres argumentos: una expresión test, una expresión then y una expresión else. La expresión test es evaluada, si su valor es verdadero, la expresión then es evaluada; si su valor es falso, la expresión else es evaluada. Como quote, if es un operador especial. No puede implementarse como una función, porque los argumentos de una función siempre se evalúan, y la idea al usar if es que sólo uno de sus argumentos sea evaluado. Si bien el default para representar verdadero es t, todo excepto nil cuenta como verdadero en un contexto lógico Los operadores lógicos and y or parecen condicionales. Ambos toman cualquier número de argumentos, pero solo evaluar los necesarios para decidir qué valor regresar. Si todos los argumentos son verdaderos (diferentes de nil), entonces and regresa el valor del último argumento. Pero si uno de los argumentos de and resulta falso, ninguno de los argumentos posteriores es evaluado y el operador regresa nil. De manera similar, or se detiene en cuanto encuentra un elemento verdadero. Se observa que los operadores lógicos son operadores especiales, en este caso definidos como macros. Es posible definir nuevas funciones con defun que toma normalmente tres argumentos: un nombre, una lista de parámetros y una o más expresiones que conforman el cuerpo de la función. El primer argumento de defun indica que el nombre de nuestra función definida será tercero. El segundo argumento (lst) indica que la función tiene un sólo argumento, lst. Un símbolo usado de esta forma se conoce como variable. Cuando la variable representa el argumento de una función, se conoce como parámetro. El resto de la definición indica lo que se debe hacer para calcular el valor de la función, en este caso, para cualquier lst, se calculará el primer elemento, del resto, del resto del parámetro (caddr lst). Prof. Dr. Hugo A. Banda Gamboa 3
  • 5. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial Ahora que hemos introducido el concepto de variable, es más sencillo entender lo que es un símbolo. Los símbolos son nombres de variables, que existen con derechos propios en el lenguaje Lisp. Por ello símbolos y listas deben protegerse con quote para ser accesados. Una lista debe protegerse porque de otra forma es procesada como si fuese código; un símbolo debe protegerse porque de otra forma es procesado como si fuese una variable. Podríamos decir que la definición de una función corresponde a la versión generalizada de una expresión Lisp. Substituyendo los números particulares por variables, podemos definir una función que verifica si la suma de sus dos primeros argumentos es mayor que el tercero: Lisp no distingue entre programa, procedimiento y función; todos cuentan como funciones y de hecho, casi todo el lenguaje está compuesto de funciones. Si se desea considerar una función en particular como main, es posible hacerlo, pero cualquier función puede ser llamada desde el toplevel. Entre otras cosas, esto significa que posible probar nuestros programas, pieza por pieza, conforme los vamos escribiendo, lo que se conoce como programación incremental (bottom-up). Las funciones que hemos definido hasta ahora, llaman a otras funciones para hacer una parte de sus cálculos. Ej. suma-mayor-que llama a las funciones + y >. Una función puede llamar a cualquier otra función, incluida ella misma. Una función que se llama a si misma se conoce como recursiva. El predicado eql verifica si sus dos argumentos son idénticos, el resto lo hemos visto previamente. La llamada a miembro es como sigue: La descripción en español de lo que hace la función miembro es como sigue: • Primero, verificar si la lista lst está vacía, en cuyo caso es evidente que obj no es un miembro de lst. • De otra forma, si obj es el primer elemento de lst entonces es miembro de la lista. • De otra forma, obj es miembro de lst únicamente si es miembro del resto delst. Traducir una función recursiva a una descripción como la anterior, siempre ayuda a entenderla. Al principio, es común toparse con dificultades para entender la recursividad. Una metáfora adecuada es ver a las funciones como procesos que vamos resolviendo. Solemos usar procesos recursivos en nuestras actividades diarias. Si bien los paréntesis delimitan las expresiones en Lisp, un programador en realidad usa los márgenes en el código para hacerlo más legible. Casi todo editor puede configurarse para verificar paréntesis bien balanceados. Hasta el momento hemos procesado las E/S implícitamente, utilizando el top-level. Para programas interactivos esto no es suficiente1, así que veremos algunas operaciones básicas de E/S. La función de salida más general en Lisp es format. Esta función toma dos o más argumentos: el primero indica donde debe imprimirse la salida, el segundo es una cadena que se usa como molde (template), y el resto son generalmente objetos cuya representación impresa será insertada en la cadena molde. Observen que dos líneas fueron desplegadas en el ejemplo anterior. La primera es producida por format y la segunda es el valor devuelto por la llamada a format, desplegada por el top-level Prof. Dr. Hugo A. Banda Gamboa 4
  • 6. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial como se hace con toda función. Normalmente no llamamos a format en el top-level, sino dentro de alguna función, por lo que el valor que regresa queda generalmente oculto. El primer argumento de format, t, indica que la salida será desplegada en el dispositivo estándar de salida, generalmente el top-level. El segundo argumento es una cadena que sirve como molde de lo que será impreso. Dentro de esta cadena, cada A reserva espacio para insertar un objeto y el % indica un salto de línea. Los espacios reservados de esta forma, son ocupados por el resto de los argumentos en el orden en que son evaluados. La función estándar de entrada es read. Sin argumentos, normalmente la lectura se hace a partir del top-level. Puesto que read espera indefinidamente a que el usuario escriba algo, no es recomendable usar read sin desplegar antes un mensaje que solicite la información al usuario. De otra forma el sistema dará la impresión de haberse plantado. Se debe mencionar que read hace mucho más que leer caracteres, es un auténtico parser de Lisp que evalúa su entrada y regresa los objetos que se hayan generado. La función pregunta, aunque corta, muestra algo que no habíamos visto antes: su cuerpo incluye más de una expresión Lisp. El cuerpo de una función puede incluir cualquier número de expresiones. Cuando la función es llamada, las expresiones en su cuerpo son evaluadas en orden y la función regresará el valor de la última expresión evaluada. Hasta el momento, lo que hemos mostrado se conoce como Lisp puro, esto es, Lisp sin efectos colaterales. Un efecto colateral es un cambio en el sistema Lisp producto de la evaluación de una expresión. Cuando evaluamos (+ 2 3), no hay efectos colaterales, el sistema simplemente regresa el valor 5. Pero al usar format, además de obtener el valor nil, el sistema imprime algo, esto es un tipo de efecto colateral. Cuando se escribe código sin efectos colaterales, no hay razón alguna para definir funciones cuyo cuerpo incluye más de una expresión. La última expresión evaluada en el cuerpo producirá el valor de la función, pero el valor de las expresiones evaluadas antes se perderá. Uno de los operadores más comunes en Lisp es let, que permite la creación de nuevas variables locales. Una expresión let tiene dos partes: Primero viene una lista de expresiones definiendo las nuevas variables locales, cada una de ellas con la forma (variable expresión). Cada variable es inicializada con el valor que regrese la expresión asociada a ella. En el ejemplo anterior se han creado dos variables, x e y, con los valores 1 y 2 respectivamente. Esas variables son válidas dentro del cuerpo de let. Después de la lista de variables y valores, viene el cuerpo de let constituido por una serie de expresiones que son evaluadas en orden. En el ejemplo, sólo hay una llamada a +. Esta función crea la variable local var para guardar el valor que regresa read. Como este valor puede ahora ser manipulado por Lisp, la función revisa que se ha escrito para decidir qué hacer. Si el usuario ha escrito algo que no es un número, la función vuelve a llamarse a sí misma: Prof. Dr. Hugo A. Banda Gamboa 5
  • 7. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial Las variables de este estilo se conocen como locales porque sólo son válidas en cierto contexto. Existe otro tipo de variables llamadas globales, que son visibles donde sea. Se puede crear una variable global usando defparameter: Esta variable es visible donde sea, salvo en contextos que definan una variable local con el mismo nombre. Para evitar errores accidentales con los nombre de las variables, se usa la convención de nombrar a las variables globales con símbolos que inicien y terminen en asterisco. Se pueden definir también constantes globales usando defconstant: No hay necesidad de dar a las constantes nombres distintivos porque si se intenta usar el nombre de una constante para una variable se produce un error. Para verificar si un símbolo es el nombre de una variable global o constante, se puede usar boundp. En Lisp el operador de asignación más común es setf. Se puede usar para asignar valores a cualquier tipo de variable. Cuando el primer argumento de setf es un símbolo que no es el nombre de una variable local, se asume que se trata de una variable global. Esto es, es posible crear implícitamente variables globales con sólo asignarles valores. Como sea, es preferible usar explícitamente defparameter. Se puede hacer más que simplemente asignar valores a variables. El primer argumento de setf puede ser tanto una expresión, como un nombre de variable. En el primer caso, el valor representado por el segundo argumento es insertado en el lugar al que hace referencia la expresión. Se puede dar cualquier número de argumentos pares a setf. Una expresión de la forma: La programación funcional significa, entre otras cosas, escribir programas que trabajan regresando valores, en lugar de modificar cosas. Es el paradigma de programación, dominante en Lisp. La mayor parte de las funciones predefinidas en el lenguaje, se espera sean llamadas por el valor que producen y no por sus efectos colaterales. La función remove, por ejemplo, toma un objeto y una lista y regresa una nueva lista que contiene todos los elementos de la lista original, mejor el objeto indicado: Prof. Dr. Hugo A. Banda Gamboa 6
  • 8. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial ¿Por qué no decir simplemente que remove remueve un objeto dado de una lista? Porque esto no es lo que la función hace. La lista original no es modificada: Si se desea que la lista original sea afectada, se puede evaluar la siguiente expresión: La programación funcional significa, esencialmente, evitar setf y otras expresiones con el mismo tipo de efecto colateral. Esto puede parecer contra intuitivo y hasta no deseable. Si bien programar totalmente sin efectos colaterales es inconveniente, a medida que practiquen Lisp, se sorprenderán de lo poco que en realidad se necesita este tipo de efecto. Una de las ventajas de la programación funcional es que permite la verificación interactiva. En código puramente funcional, se puede verificar cada función a medida que se va escribiendo. Si la función regresa los valores que esperamos, se puede confiar en que es correcta. La confianza agregada al proceder de este modo, hace una gran diferencia: un nuevo estilo de programación. 3 Materiales y Métodos Para la realización de la agenda en lisp, la implementación que escogimos fue una lo que en lenguaje java se llamaría una lista enlazada en la que poco a poco vamos a ir programando funciones que nos permitan trabajar de una manera más rápida y mucho más intuitiva, además de permitirnos que nuestra agenda funciones como una base de datos muy primitiva. Para la programación y pruebas se usó los programas: • Allegro Common Lisp 8.2 Free Express Edition • Clisp GNU • Notepad++ 6.4.5 FUNCIONES DESCRIPCION (defvar *db* nil) creación de la variable con la cual vamos a trabajar en un comienzo vacía (defun agenda-ent (nombre telefono direccion) función en la que definimos los valores que (list :nombre nombre :telefono telefono vamos a ingresar así como el formato que van :direccion direccion)) a tener dentro de la variable antes creada (defun add-pers (per) (push per *db*)) Función que ingresa los valores en la variable usando el comando push a modo de una pila (defun salto-db()(format t "~{~{~a:~10t~a~ Función con la que se le da formato a la %~}~%~}" *db*)) información que ingresa en la variable *db* (defun prompt-lec (prompt) Función de lectura del prompt del programa, y (format *query-io* "~a:" prompt) (forceque además da formato a lo que se va a output *query-io*)(read-line *query-io*)) almacenar, en este punto solo está definido el cómo se va a hacer aún no ingresa nada (defun prompt-llena()(agenda-ent (prompt-lec Función que permite la lectura e ingreso de los "nombre")(prompt-lec "telefono")(prompt-lec valores en sus correspondientes espacios "direccion"))) dentro de la variable, utiliza la función antes definida agenda-ent (defun add-perso()(loop(add-pers (promptFunción iterativa , para llenar los espacios de llena))(if(not (y-or-n-p "otra entrada[y/n]: ")) las entradas a la variable, se detendrá al dar (return)))) como respuesta n en la ventana de dialogo que se genera caso contrario permite otro ingreso Prof. Dr. Hugo A. Banda Gamboa 7
  • 9. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial (defun select-nom(nombre)(remove-if-not #'(lambda (per)(equal (getf per :nombre) nombre))*db* )) (defun select (selector-fn)(remove-if-not selector-fn *db*)) Función para determinar el formato de las búsquedas además de definir la función lambda Function que define el espacio que será consultado dentro de la base de datos FUNCIONES (defun nom-selector (nombre) #'(lambda(per)(equal(getf per :nombre) nombre))) (defun where (&key nombre telefono direccion) #'(lambda(per)(and(if nombre (equal(getf per :nombre) nombre) t) (if telefono (equal (getf per :telefono) telefono) t) (if direccion (equal(getf per :direccion) direccion) t)))) (defun actualizar(selector-fn &key nombre telefono direccion)(setf *db*(mapcar #'(lambda(row)(when(funcall selector-fn row) (if nombre (setf (getf row :nombre)nombre)) (if telefono (setf(getf row :telefono)telefono)) (if direccion (setf(getf row :direccion)direccion))) row) *db*) ) ) (defun borrar-todo (selector-fn)(setf *db*(remove-if selector-fn *db*))) DESCRIPCION Función para buscar un espacio en función a su nombre dentro de la base de datos Función para realizar la consulta en la base de datos en función al nombre al teléfono o a la dirección, presenta los valores en la forma en la que estarán dentro de la variable *db* Función para actualizar los valores en función de nombre, teléfono o dirección para actualizar se debe de dar los valores que identifiquen la consulta y los valores con los que se cambiaran Función para borrar ingresos en función a el nombre 4 Resultados Base de datos vacía Ingreso de valores en la variable Cuando ya se terminó de ingresar valores y se escogió la opción no Prof. Dr. Hugo A. Banda Gamboa 8
  • 10. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial Revisión de las entradas en la variable Búsqueda por nombre Búsqueda por teléfono Búsqueda por dirección Actualizar en función al nombre Borrado en función al nombre Base de datos como quedo luego de las actualizaciones y borrados 5 Discusión El lenguaje de programación lisp es muy poderoso, y permite un desarrollo de programas de una manera mucho más sencilla (una vez que se entiende cómo funciona), los resultados obtenidos resultan ser de lo más alentadores ya que se logró generar un programa altamente funcional, que nada tiene que envidiar a los realizados con otros programas y sin necesidad de tener que hacer llamados o cargas de librerías para trabajar, se nota la clara ventaja de este lenguaje de Prof. Dr. Hugo A. Banda Gamboa 9
  • 11. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial programación en especial cuando un programa igual en java c o c++ necesitaría como mínimo unas 100 líneas de código , mientras que el desarrollo en lisp no necesito más de 15 líneas. 6 Conclusiones • La curva de aprendizaje de este lenguaje de programación en realidad es muy pronunciada es decir se invierte mucho tiempo y se logra avanzar muy poco en su comprensión • Los errores de sintaxis pueden ser fatales, una comilla simple mal puesta o un par de puntos mal colocado puede dañar los ingresos realizados o dañar el formato que se ha definido para la representación de los mismos • Es mucho más fácil crear las variables con valores vacíos y luego proceder a llenar con los datos que crearlas inicializadas ya que de este modo no se puede dar formato con libertad • Los paréntesis pueden ser usados de otras formas además de delimitar las funciones, pueden distribuirse de manera que faciliten o entorpezcan la interpretación del código en caso de no querer que alguien se entere de lo que se está haciendo o de querer usarlo para explicar el uso del mismo. • Lisp no distingue entre programa, procedimiento y función; todos cuentan como funciones y de hecho, casi todo el lenguaje está compuesto de funciones • En Lisp las funciones son objetos regulares como los símbolos, las cadenas y las listas • La macro defun crea una función y le da un nombre, pero las funciones no tienen por qué tener nombre y no necesitamos defun para crearlas. Como los otros tipos de objeto en Lisp, podemos definir a las funciones literalmente (pero es más facil usar defun). • Lisp utiliza un inusual enfoque flexible sobre tipos. En muchos lenguajes, las variables tienen un tipo asociado y no es posible usar una variable sin especificar su tipo. En Lisp, los valores tienen un tipo, no las variables. • Si C es el lenguaje para escribir UNIX, entonces podríamos describir a Lisp como el lenguaje para describir Lisp, pero eso es una historia totalmente diferente. Un lenguaje que puede ser escrito en sí mismo, es algo distinto de un lenguaje para escribir una clase particular de aplicaciones. Ofrece una nueva forma de programar: así como es posible escribir un programa en el lenguaje, ¡el lenguaje puede mejorarse para acomodarse al programa! Esto es un buen inicio para entender la esencia de Lisp. 7 Recomendaciones • • • Se necesita definir mejor las funciones de lectura de prompt para ingreso de datos ya que las dadas en el manual básico de programación en lisp que se nos dio, se necesita saber el orden de entrada y el orden de escritura Definir mejor las funciones de salida ya que con la dad no se puede dar formato Definir variables y listas de mejor manera, ya que si se define bien una variable puede facilitarse mucho la forma de ingresar los datos. 8 Referencias [1] [2] [3] [4] P. Seibel, “Practical common lisp” , 2nd ed. . New York: APRESS, 2005, pp. 15–64. D.S. Touretzky, “Common LISP: A Gentle Introduction to Symbolic Computation” , the Benjamin Cummings publishing company, 2013 C. Barski, “Land of Lisp: Learn to Program in Lisp, One Game at a Time!” , 2nd ed. . San Francisco: No Starch Press, 2011, P. Winston, “Lisp” , 2nd ed. . New York: APRESS, 2011 Prof. Dr. Hugo A. Banda Gamboa 10
  • 12. Ingeniería de Sistemas Informáticos y de Computación [5] Laboratorio de Inteligencia Artificial S. Howard, “Common Lisp Programming” , CAnada: Kindle, 2010 9 ANEXOS (En formato digital) 9.1 Código fuente y archivos ejecutables de la solución desarrollada (defun agenda-ent (nombre telefono direccion)(list :nombre nombre :telefono telefono :direccion direccion)) (defvar *db* nil) (defun add-pers (per) (push per *db*)) (defun salto-db()(format t "~{~{~a:~10t~a~%~}~%~}" *db*)) (defun prompt-lec (prompt)(format *query-io* "~a:" prompt) (force-output *query-io*)(read-line *query-io*)) (defun prompt-llena()(agenda-ent (prompt-lec "nombre")(prompt-lec "telefono")(prompt-lec "direccion"))) (defun add-perso()(loop(add-pers (prompt-llena))(if(not (y-or-n-p "otra entrada[y/n]: ")) (return)))) (defun select-nom(nombre)(remove-if-not #'(lambda (per)(equal (getf per :nombre) nombre))*db* )) (defun select (selector-fn)(remove-if-not selector-fn *db*)) (defun nom-selector (nombre) #'(lambda(per)(equal(getf per :nombre) nombre))) (defun where (&key nombre telefono direccion) #'(lambda(per)(and(if nombre (equal(getf per :nombre) nombre) t) (if telefono (equal (getf per :telefono) telefono) t) (if direccion (equal(getf per :direccion) direccion) t)))) (defun actualizar(selector-fn &key nombre telefono direccion)(setf *db*(mapcar #'(lambda(row)(when(funcall selector-fn row) (if nombre (setf (getf row :nombre)nombre)) (if telefono (setf(getf row :telefono)telefono)) (if direccion (setf(getf row :direccion)direccion))) row) *db*) ) ) (defun borrar-todo (selector-fn)(setf *db*(remove-if selector-fn *db*))) 9.2 Instrucciones para la instalación, ejecución y pruebas de la solución informática desarrollada Las siguientes instrucciones son para poder abrir el programa usando el interprete allegro common lisp 1.- Copiar el código fuente en el editor, Prof. Dr. Hugo A. Banda Gamboa 11
  • 13. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial 2.- Guardar con el nombre que se le va a asignar 3.- Verificar que se guardo bien 4.- Abrir file ir, a load, y seleccionar el archivo que creamos antes Prof. Dr. Hugo A. Banda Gamboa 12
  • 14. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial 5.- Esperar que salga el mensaje de carga del common lisp, esperar a que cargue correctamente (En el caso de allegro common lisp, que no salte la ventana informándonos que an ocurrido errores) y comenzar Como manejar el programa Mostrar el contenido de la variable (por ahora estará en nil ya que la variable esta vacia) Se usara *db* Ingreso de valores en la variable, los valores se iran ingresando uno a uno primero nombre, luego telefono, luego direccion, para ingresar cada valor se da enter en caso de querer realizar mas entradas se elejira la opción yes Se usara (add-perso) Cuando ya se terminó de ingresar valores y se escogió la opción no y se retornara un valor nil por el valor del boton Prof. Dr. Hugo A. Banda Gamboa 13
  • 15. Ingeniería de Sistemas Informáticos y de Computación Laboratorio de Inteligencia Artificial Revisión de las entradas en la variable Búsqueda por nombre Se usara (select (where :nombre “nombre-a-buscar”)) Búsqueda por teléfono Se usara (select (where :telefono “telefono-a-buscar”)) Búsqueda por dirección Se usara (select (where :direccion “direccion-a-buscar”)) Actualizar en función al nombre se puede usar para actualizar en función a telefono , o a direccion solo hay que definir espacio a ser actualizado y valor que se va ha actualizar Se usara (actualizar(where :nombre “nombre-a-actualizar”):telefono “valor-actualizado”) Borrado en función al nombre se puede usar para borrar en función a direccion o en función a telefono solo hay que definir correctamente el espacio a borrar y que borrar Se usara (borrar-todo(where :nombre “nombre-a borrar”)) Base de datos como quedo luego de las actualizaciones y borrados Prof. Dr. Hugo A. Banda Gamboa 14
  • 16. Ingeniería de Sistemas Informáticos y de Computación Prof. Dr. Hugo A. Banda Gamboa Laboratorio de Inteligencia Artificial 15