Programación Declarativa Ejercicios de programación con listas Ejercicio 1 Define versiones recursivas de los siguientes predicados sobre listas: es lista(xs) Xs es una lista bien formada es lista nat(ss) Ss es una lista de naturales primero(x,xys) X es el primer elemento de XYs ultimo(x,ysx) X es el último elemento de YsX iesimo(i,asxibs) Xi es el iésimo elemento de AsXiBs miembro(x,asxbs) X es elemento de AsXBs adyacentes(x,y,asxybs) X e Y aparecen adyacentes en AsXYBs prefijo(xs,xsys) Xs es prefijo de XsYs sufijo(xs,ysxs) Xs es sufijo de YsXs sublista(ys,xsyszs) Ys es sublista de XsYsZs concatena(xs,ys,xsys) XsYs es la concatenación de Xs y Ys elimina(x,asxbs,asbs) AsBs es AsXBs con una aparición de X eliminada no esta(x,ys) X no es elemento de Ys (emplea el operador \==/2) Ejercicio 2 Define los siguientes predicados sobre listas empleando el predicado concatena/3: primero c(x,xys) ultimo c(x,ysx) miembro c(x,asxbs) adyacentes c(x,y,asxybs) prefijo c(xs,xsys) sufijo c(xs,ysxs) sublista c(ys,xsyszs) elimina c(x,asxbs,asbs) Ejercicio 3 Define los siguientes predicados sobre listas: X es el primer elemento de XYs X es el último elemento de YsX X es elemento de AsXBs X e Y aparecen adyacentes en AsXYBs Xs es prefijo de XsYs Xs es sufijo de YsXs Ys es sublista de XsYsZs AsBs es AsXBs con una aparición de X eliminada todos iguales(xs) todos los elementos de Xs son iguales entre sí todos distintos(xs) todos los elementos de Xs son distintos entre sí as bs(asbs) AsBs representa una sentencia del lenguaje a b am bm(asbs) AsBs representa una sentencia del lenguaje a + b + Ejercicio 4 Define versiones recursivas y recursivas de cola de los siguientes predicados: 1
longitud(xs,n) suma(xs,n) maximo(asmys,m) minimo(asmys,m) cuantas(x,asxbs,n) escalar(xs,ys,p) y(xs,v) o(xs,v) inversa(xsys,ysxs) purga(xs,ys) N es la longitud de Xs N es la suma de los elementos de Xs M es el máximo de AsMYs M es el mínimo de AsMYs X aparece N veces en AsXBs P es el producto escalar de Xs y Ys V es la conjunción de la lista de 1 s y 0 s Xs V es la disyunción de la lista de 1 s y 0 s Xs YsXs es la inversa de XsYs Ys es Xs eliminando los elementos repetidos Ejercicio 5 Define los siguientes predicados de borrado sobre listas: borra una(x,asxbs,asbs) borra todas(x,asxbs) borra algunas(x,asxbs) borra al menos una(x,asxbs) borra primera(x,asxbs,asbs) borra ultima(x,asxbs,asbs) borra una X de AsXBs borra todas las X de AsXBs borra algunas X de AsXBs borra al menos una X de AsXBs borra la primera X de AsXBs borra la última X de AsXBs Ejercicio 6 Define predicados que implementen los siguientes algoritmos de ordenación: burbuja(xs,ys) insercion(xs,ys) mezcla(xs,ys) quicksort(xs,ys) Ys es Xs ordenada por la burbuja Ys es Xs ordenada por la inserción directa Ys es Xs ordenada por mezcla Ys es Xs ordenada por ordenación rápida Emplea los siguientes predicados auxiliares para implementar los algoritmos: ordenada(xs) ins orden(x,asbs,asxbs) parte en dos(asbs,as,bs) mezcla ord(as,bs,cs) partir(p,xs,migs,mays) Xs está ordenada crecientemente inserta X ordenadamente en AsBs parte AsBs en As y Bs, de aprox. de la misma longitud Cs es la mezcla ordenada de las listas ordenadas As y Bs parte Xs en menores o iguales y mayores respecto a P Ejercicio 7 Define un predicado quicksort azar(xs,ys) que dada una lista Xs la ordene en Ys aplicando quicksort, seleccionando los pivotes respecto a los que se parten las sublistas al azar (emplea el predicado aritmético random/1 para generar un número al azar). Ejercicio 8 Define los siguientes predicados sobre listas: rotacion(xsys,ysxs) permutacion(xs,ys) combinacion(xs,n,ys) combinacion rep(xs,n,ys) variacion(xs,n,ys) variacion rep(xs,n,ys) YsXs es una rotación de XsYs Ys es una permutación de Xs Ys es una combinación de N elementos de Xs sin repetición Ys es una combinación de N elementos de Xs con repetición Ys es una variación de N elementos de Xs sin repetición Ys es una variación de N elementos de Xs con repetición 2
Ejercicio 9 Define un predicado premax(psxs,n,ps) que, dada una lista PsXs, se satisface cuando Ps es el prefijo no vacío más largo de PsXs tal que la suma de sus elementos no supera N. Por ejemplo:?- premax([1,2,3,4,5,6],12,ps). Ps= [1,2,3,4];?- premax([15,2,3,4,5,6],12,ps). Ejercicio 10 Define un predicado multirot(xs,mrxs) que, dadas las listas Xs y MRXs, se satisface cuando MRXs es la concatenación de varias rotaciones (al menos una) de Xs. Por ejemplo:?- multirot([a,b,c],[a,b,c,c,a,b,b,c,a,c,a,b,a,b,c]).?- multirot([a,b,c],[a,b,c,a,c]). Ejercicio 11 Define un predicado lista vars(n,vs) que devuelva en Vs una lista de N variables libres, todas distintas entre sí. Por ejemplo:?- lista_vars(5,vs). Vs= [A,B,C,D,E]; Ejercicio 12 Define un predicado es telescopio(n,xs) que se satisfaga cuando Xs sea una lista ordenada donde cada número i entre 1 y N aparece i veces. Por ejemplo:?- es_telescopio(5,[1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]). Ejercicio 13 Define un predicado gen telescopio(n,xs) que devuelva en Xs una lista ordenada donde cada número i entre 1 y N aparece i veces. Por ejemplo:?- gen_telescopio(5,xs). Xs= [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]; Ejercicio 14 Define un predicado son consecutivas(n,xs) que se satisfaga cuando Xs sea una lista donde cada número i entre 1 y N aparece i veces consecutivas. Por ejemplo:?- son_consecutivas(5,[3,3,3,1,2,2,5,5,5,5,5,4,4,4,4]). Ejercicio 15 Define un predicado gen consecutivas(n,xs) que devuelva en Xs una lista donde cada número i entre 1 y N aparece i veces consecutivas. Por ejemplo: 3
?- gen_consecutivas(5,xs). Xs= [3,3,3,1,2,2,5,5,5,5,5,4,4,4,4]; Xs= [4,4,4,4,3,3,3,1,5,5,5,5,5,2,2];... Ejercicio 16 Define un predicado aparecen i veces(n,xs) que se satisfaga cuando Xs sea una lista donde cada número i entre 1 y N aparece i veces. Por ejemplo:?- aparecen_i_veces(5,[3,1,4,5,2,3,5,5,5,4,5,4,3,4,2]). Ejercicio 17 Define un predicado gen i veces(n,xs) que devuelva en Xs una lista donde cada número i entre 1 y N aparece i veces. Por ejemplo:?- gen_i_veces(5,xs). Xs=[3,1,4,5,2,3,5,5,5,4,5,4,3,4,2]; Xs=[3,4,1,5,3,2,5,4,5,4,5,5,3,4,2];... Ejercicio 18 Define un predicado auto rep(xs,yss) que, dada una lista Xs de N elementos, genere una lista de listas Yss de N elementos iguales a la lista Xs. Por ejemplo:?- auto_rep([a,b,c],yss). Yss= [[a,b,c],[a,b,c],[a,b,c]];?- auto_rep([],yss). Yss= []; Ejercicio 19 Define un predicado pascal(n,pss) que se satisfaga cuando Pss sea una lista de listas que almacene por filas el triángulo de Pascal de orden N. Por ejemplo:?- pascal(4,ps). Ps = [[1],[1,1],[1,2,1],[1,3,4,4,3,1]]; Ejercicio 20 Un equipo de fútbol consta de una plantilla de jugadores y para cada partido han de seleccionarse 11 de estos jugadores. En el campo estos jugadores se distribuyen en 4 líneas de juego: meta(un jugador), defensa, media y delantera. Suponiendo que la plantilla venga descrita mediante una base de conocimiento con predicados portero/1, defensa/1, medio/1 y delantero/1, definir un predicado alineacion(esquema,alineacion) 4
donde Esquema es una lista que especifica el número de jugadores por cada línea de juego en el orden: meta, defensa, media y delantera, (p.e. [1,4,4,2]) y Alineacion es una lista de listas de los jugadores seleccionados para cada línea de acuerdo con el esquema. Suponiendo que la plantilla venga dada por una lista de cuatro listas, cada una con los jugadores de cada línea, definir un predicado alineacion(plantilla,esquema,alineacion) donde Plantilla es la lista correspondiente a la plantilla disponible y Esquema y Alineacion tienen el mismo significado de antes. Con ayuda de los predicados anteriores enunciar cuestiones que permitan construir alineaciones con restricciones como las siguientes: el jugador a se alinea seguro; los jugadores a y b no aparecen en la misma alineación; los jugadores a y b no aparecen en la misma línea; los jugadores a y b no aparecen en la misma línea en puestos contiguos; los jugadores a y b no aparecen en líneas contiguas. Ejercicio 21 Se desea representar las matrices en Prolog mediante listas de listas de números, de manera que la lista i-ésima de números corresponda a la fila i-ésima de la matriz. Por ejemplo, la matriz de 3x3: 1 2 3 4 5 6 7 8 9 se representará mediante la lista de listas: [ [1,2,3], [4,5,6], [7,8,9] ] Define los siguientes predicados sobre matrices: es matriz(m) lee(m,i,j,xij) escribe(m,i,j,xij,mxij) fila(m,i,mi) columna(m,j,mj) suma(a,b,c) traspuesta(m,t) simetrica(a,b) triangular(m) M es una matriz bien formada Xij es el elemento i,j de M MXij es M con el elemento i,j reemplazado por Xij Mi es la fila i-ésima de M Mi es la columna j-ésima de M C es la suma de A y B T es la traspuesta de M A y B son simétricas M es triangular 5
Ejercicio 22 Se desea representar los conjuntos en Prolog mediante listas que no contengan elementos repetidos. Por ejemplo, el conjunto: {lunes, martes, miercoles, jueves, viernes} se representará mediante la lista: [lunes, martes, miercoles, jueves, viernes] Define los siguientes predicados sobre conjuntos: es conjunto(c) pertenece(x,c) subconjunto(a,b) union(a,b,c) diferencia(a,b,c) interseccion(a,b,c) partes(a,pa) C es un conjunto bien formado X pertenece a C A es subconjunto de B C es la unión de A y B C es la diferencia de A y B C es la intersección de A y B PA es el conjunto de todos los subconjuntos de A 6