Programación en LISP (1). Inteligencia Artificial. Tercero de Ingeniería Informática. UAM. 1. Cada una de las siguientes cadenas de caracteres separadas por comas puede ser un símbolo, número, lista, string, keyword, ..., o ninguno de ellos. Identificarlos y decir cuáles de ellos son formas LISP evaluables: SIMBOLO, :TEST, ("primero" segundo :tercero), (), ()(), (()), 2.1, 1/2, ((A B) (C D) 3 (3)), O, 'a, (quote a), a, #'(lambda (x) (- 1 x)) 2. Escribir expresiones formadas únicamente por FIRSTs y RESTs que devuelvan el símbolo BINARIO a partir de las siguientes expresiones: (DECIMAL OCTAL BINARIO HEXADECIMAL) (DECIMAL OCTAL binario HEXADECIMAL) ((DECIMAL) (OCTAL) (BINARIO) (HEXADECIMAL)) ((((HEXADECIMAL) OCTAL) DECIMAL) BINARIO) 3. Definir la función TIPO de un argumento que obtenga el tipo del argumento al que se aplica. Así, por ejemplo, (tipo '(1 2 3)) debe evaluarse a LISTA, o (tipo 3.0) a NUMERO, etc.. 4. Definir la función MUEVE-A-LA-DERECHA, que toma como argumento una lista y devuelve otra lista en la que el último elemento ha pasado a ser el primero y los demás han avanzado una posición, como por ejemplo, (MUEVE-A-LA-DERECHA '(1 2 3 4)) => (4 1 2 3) 5. Redefinir la función ABS (valor absoluto) de tres maneras distintas, utilizando los condicionales IF, WHEN y COND. 6. Definir tres funciones, con argumentos R, (R S W) y (R S W X), respectivamente, que obtengan los mismos valores dados por (NOT R) ,(AND R S W) y (OR R S W X), (sin utilizar las funciones NOT, AND y R). 7. Definir el predicado VALORES-CRECIENTE-P, de modo que aplicado a una lista de números, devuelva T si la sucesión de números es creciente, y NIL en caso contrario. 8. Describir la acción de las siguientes funciones: (defun funcion-1 (l) (cond ((null l) nil) ((atom l) (if (evenp l) 'PAR 'IMPAR)) (T (cons (funcion-1 (first l)) (funcion-1 (rest l)))))) (defun funcion-2 (s) (cond ((null s) 1) ((atom s) 0) (t (max (+ (funcion-2 (first s)) 1) (funcion-2 (rest s)))))) 9. Usese MAPCAR para escribir una función que toma una lista y crea una nueva lista cuyos elementos son listas cuyo primer elemento es el elemento inicial, y el segundo su tipo. Por ejemplo, si la lista inicial es (X 2 "cadena" (Z W)), entonces se debe obtener ((X SIMBOLO) (2 NUMERO) ("cadena" STRING) ((Z SIMBOLO) (W SIMBOLO))). Utilícese el resultado del problema 3 10. Definir una función, crea-primos, que obtenga a partir de un número entero una lista formada por todos los números primos menores que dicho número. Por ejemplo: (crea-primos 13) => (2 3 5 7 11) 11. Definir iterativamente la función FACTORIAL de un número. 12. Un número es perfecto si la suma de sus divisores mas pequeños es igual a él mismo (como por ejemplo el número 6). Definir el predicado ES-PERFECTO-P que obtenga si un número inicial es o no perfecto. 13. Escribir una función (y su inversa) que transforme tiempos expresados en segundos a una combinación de años, meses, días, horas, minutos y segundos. 14. Definir el macro NEW-IF de modo que las dos siguientes sintaxis sean equivalentes: (new-if <condicion> then <resultado-positivo> [else <resultado-negativo>]) (if <condicion> <resultado-positivo> [<resultado-negativo>]) 15. Normalmente una función no modifica su argumento. Escribir un macro CAMBIA-LISTA que recibe una lista como argumento y es capaz de modificar dicha lista, añadiendo como primer elemento la longitud de la lista inicial, y devolviendo dicho valor: (setf lista '(A B C D)); (CAMBIA-LISTA lista); lista => (4 A B C D). 16. 16. Definir el macro DEFINE-VARIABLE-FUNCION para que permita definir simultáneamente el valor de un símbolo como variable y como función, evaluando expresiones como (define-variable-funcion (f 'a) (f (x) (* x 2))). 17. Definir macros según la siguiente sintaxis (de este modo se pueden reproducir estructuras sintácticas de otros lenguajes de programación): (mientras <predicado> ejecuta <forma-1> ... <forma-n>) (repite <forma-1> ... <forma-n> hasta-que <condicion-final>) (hasta-que <condicion-final> ejecuta <forma-1> ... <forma-n>)