practicas02

Anuncio
PROGRAMACIÓN ORIENTADA A LA
INTELIGENCIA ARTIFICIAL
Ejercicios de programación en LISP y PROLOG
Angeles Manjarrés Riesco
Severino Fernández Galán
Jesús González Boticario
[email protected]
Dpto. Inteligencia Artificial.
E. T. Ingeniería Informática. UNED
Avda. Senda del Rey, s/n
28040 Madrid
Curso 2002/2003
EJERCICIOS DE PROGRAMACIÓN EN LISP
1. Ejercicios Básicos
1.1 Definir una función que calcule la entropía de un suceso aleatorio que representa k modos
de realización de probabilidades P1, P2, P3, …, Pk, cuyo valor viene dado por la expresión:
K
H   pi log pi
i=1
1.2 Definir una función que dados tres números X, Y y Z, devuelva una lista con los números
ordenados por orden creciente.
1.3 Definir una función que devuelva verdadero (cualquier valor distinto de NIL) o falso (NIL)
dependiendo de si el menor de sus argumentos sea par o impar. Resolverlo para dos
argumentos y para un número variable de éstos.
1.4 Definir una función que concatene un número variable de listas (algunas pueden ser listas
vacías) y átomos, comprobando qué argumentos son listas y cuáles son átomos. En el
resultado de dicha concatenación se deben excluir las listas vacías.
1.5 Definir las funciones SUST1 y SUST2 que reciban como argumentos una lista de
asociación y una expresión simbólica L. SUST1 debe sustituir en L los primeros elementos de
las parejas de la lista de asociación por sus correspondientes segundos elementos; esta
sustitución la hará de forma secuencias (una sustitución puede influir en le resultado de otra
sustitución anterior). SUST2 opera de forma análoga pero todas las sustituciones en la lista L
deben realizarse simultáneamente (no teniendo ninguna influencia el resultado de una
sustitución en las sustituciones que se realicen posteriormente).
Ejemplo:
> (SUST1 ‘( (A B) (C D) (E F) (B K) (D L) )
‘(A C E B D M))
(K L F K L M)
> (SUST2 ‘( (A B) (C D) (E F) (B K) (D L) )
‘(A C E B D M))
(B D F K L M)
1.6 Definir una función recursiva AGRUPAR que reciba dos argumentos, compruebe cuál de
ellos es un átomo y cuál una lista, y a continuación introduzca el átomo junto a los átomos
iguales que hubiera en la lista o al final de la misma, en el caso de no encontrar semejantes.
Por ejemplo:
> (AGRUPAR ‘(A A A B B B C C C) ‘B)
(A A A B B B B C C C )
1.7 Definir una función APLANAR que reciba como argumento una expresión simbólica y
elimine todos los paréntesis que aparezcan en esa expresión, devolviendo como resultado una
lista con todos los átomos que aparezcan en el argumento, de tal forma que todos los átomos
2
numéricos aparezcan en primer lugar, ordenados y sin repeticiones, seguidos de los que sean
literales, también sin repeticiones.
Ejemplo:
> (APLANAR ‘( (1 2 A) (9 (B C 4) ) ( ( ( ( 3 C ( 7 ) ) ) ) ) ) )
( 1 2 3 4 7 9 A B C)
1.8 Definir una macro MI-IF que reciba tres argumentos, siendo el tercero opcional; si el
primero es cierto devuelve el segundo, si no devuelve el tercero o NIL si éste no existiera.
1.9 Definir una macro MI-DO que tenga exactamente la misma funcionalidad que la macro DO,
pero que además de devolver el valor correspondiente cuando se cumpla la condición de
finalización, devuelva un segundo valor que indique el número de iteraciones que se han
realizado. No se deben utilizar las primitivas DO, DO*, DOLIST, DOTIMES.
1.10 Definir una matriz de 10 filas y 20 columnas, rellenarla, asignando a cada elemento el
valor de la suma de su fila más su columna y obtener una lista de salida con los elementos de la
diagonal.
2. Ejercicios avanzados
2.1 Un móvil es un tipo de escultura abstracta construida por elementos que pueden tener un
movimiento relativo unos respecto a otros. Puede definirse un tipo particularmente simple de
móvil de forma recursiva como, o bien un objeto suspendido en el aire, o bien una barra con un
submóvil colgando de cada extremo. Si se asume que cada barra está suspendida de su punto
medio, puede representarse un móvil como un árbol binario. Los objetos suspendidos ser
representarán como números que corresponderán al peso de cada objeto. Los móviles más
complejos se representarán como listas de tres elementos; el primero de ellos será un número
igual al peso de la barra, y los otros dos representan submóviles unidos a los extremos de la
barra.
Un móvil debe ser balanceado, es decir, los dos submóviles de los extremos de la barra
deben tener el mismo peso. definir MOVILP, una función que determina si un móvil está o no
balanceado. Devolverá NIL si no lo está y el peso total del móvil en caso contrario.
> (MOVILP '(6 (4 (2 1 1) 4) (2 5 (1 2 2))))
30
2.2 El juego de la vida es un juego de simulación que se desarrolla en una cuadrícula, de modo
que en cada casilla pueda haber un organismo. Cada casilla se puede encontrar ocupada o
vacía.
Dos organismos se consideran vecinos si sus casillas son contiguas en sentido horizontal,
vertical o diagonal. Por tanto, cada casilla tiene ocho casillas vecinas.
Las reglas del juego son:
- En cada casilla vacía nace un nuevo organismo si dicha casilla tiene exactamente tres
vecinos.
- Una casilla ocupada que tenga cero o un vecino muere por aislamiento.
- Una casilla ocupada con cuatro o más vecinos muere por superpoblación.
3
- Una casilla ocupada con dos o tres vecinos sobrevive.
Todos los nacimientos y muertes ocurren simultáneamente y la aplicación de las leyes
anteriores produce una nueva generación.
El juego continúa hasta que suceda uno de los siguientes hechos:
- La generación actual es igual que la generación inicial.
- La generación actual es igual que dos generaciones anteriores.
- Se ha alcanzado el número máximo de generaciones prefijado.
2.3 Escribir REINAS, una función que devuelva la solución al problema de las ocho reinas. Se
trata de situar a ocho reinas en un tablero de ajedrez, de manera que ninguna de ellas sea
atacada por otra, es decir, no puede haber dos reinas en la misma fila, columna o diagonal.
EJERCICIOS DE PROGRAMACIÓN EN PROLOG
3. Ejercicios básicos
3.1 Una agencia matrimonial guarda por cada uno de sus solicitantes una ficha acorde a los
siguientes hechos:
hombre(n,t,c,e).
mujer(n,t,c,e).
donde n es el nombre del hombre o la mujer, t es su talla (grande, mediana,
pequeña), c es el color de su pelo (rubio, moreno, pelirrojo, castaño) y e es su
edad (joven, maduro, anciano).
gustos(n,m,l,d)indica que a la persona n le gusta la música del tipo m
(clásica, pop, jazz), la literatura del género l (aventuras, ciencia ficción,
detectives) y el deporte de la variedad d (tenis, natación, yoga).
busca(n,t,c,e)
expresa que la persona n busca una pareja de talla t con color de pelo c y
edad e.
Se considera que dos personas x e y, de diferentes sexos, son
compatibles si x es compatible con y e y es compatible con x. En primer lugar,
x es compatible con y si x busca a alguien con las características físicas de y y
si los gustos de x e y en las áreas de música, deporte y literatura coinciden.
Diseñe un programa que determine la compatibilidad de una pareja.
4
3.2 Defina predicados par(X) e impar(X) que determinen si un número natural es par o
impar. Defina asimismo un predicado divide(X,Y,Z) que compute divisiones enteras
utilizando la substracción repetida.
3.3 Escriba un predicado substituye(X,Y,Xs,Ys), donde Ys es la lista que resulta de
substituir por Y todas las ocurrencias de X en la lista Xs. Idem para
permutacion_par(Xs,Ys) y permutacion_impar((Xs,Ys), donde Xs, Ys son listas.
4. Avanzados
4.1 Escriba dos versiones de un predicado que calcule derivadas de funciones de variable
entera, de modo que una de ellas utilice cuts y la otra no.
4.2 Escriba un programa que determine quién de entre 3 jugadores de póquer tiene la mejor
jugada.
4.3 Los vértices de un grafo se numeran de 0 a n. En una base de datos Prolog, a cada uno de
los arcos del grafo corresponde un hecho arco(i,j), donde i es el origen y j el destino del
arco. Diseñe un predicado que defina camino(X,Y,L), donde L es la lista que representa un
camino sin ciclos que conduce del vértice x al y.
5
Descargar