You are on page 1of 6

PROGRAMACIN DECLARATIVA

ESTRUCTURAS DE DATOS
Listas
1. Definir predicados Prolog referentes a listas con los siguientes significados:
miembro(Elem,Lista)
"Elem pertenece a Lista"
longitud(Lista,Long)
"Lista tiene Long elementos"
ltimo(Lista,Elem)
"Elem es el ltimo elemento de Lista"
concatenar(L1,L2,L1L2)
"Lista12 es el resultado de concatenar Lista1 y Lista2"
suprimir(LElem,Elem,L)
"L es la lista LElem con Elem suprimido"
invertir(Lista,Atsil)
"Atsil es la inversa de Lista"
prefijo(Sublista,Lista)
"Sublista es prefijo de Lista"
sufijo(Sublista,Lista)
"Sublista es sufijo de Lista"
sublista(Sublista,Lista)
"Sublista es una sublista de Lista"
adyacentes(X,Y,Lista)
"X e Y son adyacentes en Lista"
quicksort(Lista,Ailst)
"Ailst es Lista ordenada mediante quicksort"
burbuja(Lista,Ailst)
"Ailst es Lista ordenada mediante el mtodo de la burbuja"
sumar(ListaEnteros,Suma)
"Suma es el resultado de sumar los elementos de ListaEnteros"
producto(Lista1,Lista2,Prod) "Prod es el producto escalar de Lista1 y Lista2"
Arboles
2. Se define un rbol del modo siguiente:
-la constante vaco es un rbol.
-el trmino compuesto rbol(X,Y,Z) es un rbol si Y y Z son rboles.
Definir predicados Prolog referentes a rboles con los siguientes significados:
es_rbol(Arbol)
"Arbol es un rbol"
miembro_rbol(Elem,Arbol) "Elem pertenece a Arbol"
rboliso(A1,A2)
"A1 y A2 son rboles isomorfos"
"A2 se puede obtener reordenando las ramas de A1"
sustituir(X,Y,ArbX,ArbY)
"ArbY es ArbX donde todo X se sustituye por Y"
preorden(Arbol,Pre)
"Pre es una lista con el recorrido en preorden de Arbol"
inorden(Arbol,In)
"In es una lista con el recorrido en inorden de Arbol"
postorden(Arbol,Post)
"Post es una lista con el recorrido en postorden de Arbol"
subrbol(Subrbol,Arbol)
"Subrbol es un subrbol de Arbol"
insertar(Elem,Arbol,ArbolN) "ArbolN es un rbol ordenado resultante de insertar Elem en el
rbol ordenado Arbol. Si Elem pertenece a Arbol, entonces
Arbol y ArbolN son idnticos"
Grafos
3. Escribir un programa en Prolog que de los distintos recorridos que unen los cinco vrtices de la
figura segn los trazos marcados, sin realizar dos veces el mismo trazo.

PRCTICAS 1

PROGRAMACIN DECLARATIVA

Matrices
4. Se desean representar las matrices numricas en Prolog con trminos de la forma:
[fila1, fila2, _, filan ]
donde cada filai se representa por una lista:
[elementoi1, elementoi2, _, elementoin]
Por ejemplo, la lista
[ [1,2,3], [4,5,6], [7,8,9] ]
representar la matriz cuya primera fila es (1 2 3), la segunda (4 5 6) y la tercera (7 8 9).
Se pide definir los siguientes predicados:
es_matriz(T)
"se satisface cuanto T es una matriz numrica"
suma(M1,M2,S)
"S es la matriz suma de M1 y M2. Supngase que M1 y M2
estn ya instanciados a trminos de base"
simtrica(M)
"se satisface cuando M es una matriz simtrica"
5. Consideremos una base de datos conteniendo hechos de la forma
array(Ident,Indices,Array).
donde:
Ident representa el nombre del array.
Indices es una lista que contiene la dimensin del array; cada elemento de la lista representa el
ndice mximo, y se supone que el ndice mnimo es siempre 1.
Array es una lista de listas, con una profundidad que coincide con la longitud de Indices.
Por ejemplo:
array(a,[2,3],[[a11,a12,a13],[a21,a22,a23]]).
array(b,[2,3,2],[[[b111,b112],[b121,b122],[b131,b132]],[[b211,b212],[b221,b222],[b231,b232]]]
Implementar los siguientes predicados Prolog:
a) valor/3
b) asignar/3
c) posicin/3

2PRCTICAS 1

% valor(a,[i,j],aij)
% asignar(a,[i,j],a0) _ valor(a,[i,j],a0)
% posicin(a,aij,[i,j])

PROGRAMACIN DECLARATIVA

USO DE ACUMULADORES
1. Dar versiones recursivas e iterativas de los predicados.
factorial(N,F)
F es N!
sumar_lista(Xs,Sum)
Sum es la suma de los elementos de la lista Xs
producto_escalar(Xs,Ys,P) P es el producto escalar de los vectores Xs e Ys (listas)
mximo(Xs,Max)
Max es el mximo entero de la lista Xs
longitud(Xs,Long)
Long es el tamao de la lista Xs
INSPECCION DE ESTRUCTURAS
2. Definir en Prolog predicados para:
compuesto(Term)
Term es un trmino compuesto
linealizar(Xss,Xs)
Xs es la lista resultante de linealizar Xss (lista de listas)
subtrmino(SubTerm,Term) SubTerm es un subtrmino de Term
sustituir(V,N,VT,NT)
NT es el resultado de sustituir V por N en VT
ocurrencias(Sub,Term,N)
N es el nmero de apariciones de Sub en Term.
Supngase que Term es bsico.
bsico(Term)
En Term no aparecen variables
3. Definir un predicado posicin(Subterm,Term,Posicin) donde Posicin es una lista de posiciones
que identifican Subtrm dentro de Term. Por ejemplo, la posicin de X en Y+sen(X) es [2,1], pues
sen(X) es el segundo argumento del operador binario +, y X es el primer argumento de sen(X).
4. Definir el predicado =../2 en funcin de functor/3 y arg/3.
METAPROGRAMACION
5. a) Escribir un predicado Prolog que implemente la siguiente funcin:
aplica : (TS) Lista[T] Lista[S],
dada por: aplica(f,[a1,a2,...,an ]) = [f(a1),f(a2),...,f(an )], aiT, f (TS)
b) Aplicar el predicado anterior para definir predicados que determinen:
b.1) El cdigo BCD de un nmero decimal expresado como una lista de dgitos.
b.2) La primera columna de una matriz representada por:
[ [a11, a12,..., a1n ],
[a21, a22,..., a2n ],
...
[am1, am2,..., amn ] ]
b.3) La lista resultante de sustituir 'n' por '' en una lista compuesta por caracteres.
6. a) Modificar la definicin de aplica/3 del ejercicio anterior para generalizar la solucin del
apartado (5.b.2), de forma que se pueda determinar la i-sima columna (1 i n); y la del apartado
(5.b.3) para poder sustituir una letra cualquiera por cualquier otra.
b) Aplicar el predicado obtenido en el apartado anterior para obtener el conjunto, L, de todos los
subconjuntos de un conjunto dado, X, siguiendo el algoritmo que se especifica a continuacin:
Si X= entonces L={ }
Si xX entonces L=L1 L2, siendo
L1 el conjunto de subconjuntos de X-{x}, y L2 = {{x}l : lL1}
(Nota: Los conjuntos se representan mediante una lista de elementos no repetidos).

PRCTICAS 2

PROGRAMACIN DECLARATIVA

PROGRAMACION DE SEGUNDO ORDEN


7. a) Utilizando el predicado setof/3, definir el predicado paratodo/2, que se verifica cuando todas
las instancias del primer argumento verifican la propiedad dada por el segundo. Por ejemplo,
paratodo(miembro(X,[2,4,6]),par(X)).
b) Comparar la solucin anterior con:
paratodo(Objetivo,Condicin) :- not(Objetivo,not Condicin)
8. Usualmente el predicado conectados/2, que determina cundo dos nodos estn unidos mediante un
camino en un grafo, se define haciendo uso de una bsqueda primero en profundidad. Utilizar el
predicado setof/3 para utilizar una bsqueda primero en amplitud.
PREDICADOS EXTRALOGICOS
9. Utilizando un bucle controlado por fallo, implementar en Prolog el predicado consult/1, que permite
consultar las clusulas de un archivo. (NOTA: Una llamada del tipo see(Fichero), convierte a Fichero
en la entrada por defecto, mientras que seen vuelve a considerar el dispositivo de entrada estndar).
10. Definir el predicado suprimir/2, de forma que suprimir(F,N) elimina todas las clusulas que
definen el procedimiento F de aridad N.
11. a) Simular variables globales mediante un predicado global(Nombre,Valor), y la asignacin a
variables globales mediante asig_global(Nombre,NuevoValor).
b) Utilizando los predicados anteriores, implementar el predicado generar_smbolo/1, que
devuelve sobre el argumento un valor distinto en cada llamada.
12. Resolver los siguientes predicados utilizando funciones memo:
fibonacci/2 hanoi/5
ESTRUCTURAS INCOMPLETAS
13. Usando diferencia de listas, implementar en Prolog:
a) inversa(ListA,Atsil)
b) linealizar(ListaDeListas,Lista)
c) quicksort(ListA,Ailst)
d) Un predicado que resuelva el problema de la bandera holandesa (Dijkstra), que consiste en
reordenar una lista de elementos coloreados (rojo,blanco y azul), de forma que los elementos rojos
aparezcan primero, seguidos por los blancos, y terminando por los azules. La reordenacin debe
hacerse manteniendo el orden relativo original de los elementos del mismo color. Por ejemplo, la lista
[rojo(1),blanco(2),azul(3),rojo(4),blanco(5)]
debera
reordenarse
como
[rojo(1),rojo(4),blanco(2),blanco(5),azul(3)].
e) El predicado para resolver el problema de las torres de Hanoi.

PRCTICAS 2

PROGRAMACIN DECLARATIVA

1. a) Implementar un predicado generar/3 de forma que:


generar(Inicio,Num,Final)

se satisfaga cuando Num sea un natural comprendido entre Inicio y Final.


b) Implementar un predicado sumar/5 de forma que:
sumar(Ac,Sum1,Sum2,Suma,AcN)
se satisfaga cuando Ac+Sum1+Sum2 = Suma+10AcN.
c) Implementar un predicado distinto/1 de forma que:
distinto(Lista)
se satisfaga cuando los elementos de Lista sean distintos entre s.

d) Escribir un programa Prolog que resuelva la siguiente suma:


S E N D
+ M O R E
M O N E Y
e) Implementar un predicado Prolog
resolversuma(Sumando1,Sumando2,Suma)

que resuelva de forma genrica sumas como las anteriores, siendo Sumando1, Sumando2 y Suma listas
de variables. Por ejemplo,
resolversuma([S,E,N,D],[M,O,R,E],[M,O,N,E,Y]).

2. Escribir un programa Prolog que permita reconocer polinomios en algn trmino X.


3. Definir el predicado Prolog
hanoi(N,A,B,C,Movimientos)
que es cierto si Movimientos es la secuencia de movimientos para trasladar una torre de N discos
desde el eje A al eje B utilizando el eje C.
4. El problema de laa N reinas consiste en situar N reinas sobre un tablero de ajedrez de N N
escaques, de forma que ninguna de ellas est en una posicin que le permita capturar a otra (la misma
fila, columna o diagonal). Es obvio que todas las posibles soluciones se pueden representar como listas
de longitud N, formaas por los nmeros enteros de 1 a N en cierto orden. Se pide definir los
predicados:
a) intervalo(X,Y,L), verdadero cuando L es una lista de los nmeros enteros entre X e Y, ambos
incluidos.
b) permutacin(L,P), verdadero si P es una lista permutacin de la lista P.
c) situacin_segura(L), verdadero si L es una lista que representa una situacin en la que no hay
dos reinas en la misma diagonal.
d) n_reinas(N.L), verdadero cuando L es una lista que representa una solucin para el problema
de las N reinas.
5. Una frmula booleana es un trmino definido como sigue:
-las constantes cierto y falso son frmulas booleanas,
-si X e Y son frmulas booleanas, tambin lo son X o Y, X y Y, X implica Y y no X.
Definir en Prolog el predicado:
satisfactible(Frmula)
"Existe una instancia verdadera de Formula"
NOTA: Para definir los operadores infijos y prefijos, utilizar el predicado op/3.
6. Escribir un programa Prolog que simule una sesin de consultas en un intrprete Prolog.

PRCTICAS 3

PROGRAMACIN DECLARATIVA

7. Disear un editor de lnea simple en Prolog, donde el fichero se represente mediante el trmino
file(Antes,Despus), siendo Antes y Despus dos listas de lneas (strings) que se consideran
separadas por el cursor. Las lneas antes del cursor estarn dispuestas en orden inverso para facilitar
su acceso. El editor (visualizado mediante un prompt) debe aceptar una orden del teclado, y aplicarla
para producir una versin nueva del fichero. Dichas rdenes son:
up
sube el cursor una lnea
up(N)
sube el cursor N lneas
down
baja el cursor una lnea
insert(Lnea)
inserta en el fichero una Lnea
delete
suprime la lnea que est antes del cursor
print
imprime la lnea que est detrs del cursor
print(*)
imprime el fichero completo
8. Tres alumnos hacen un examen de Lenguajes de Programacin y obtienen tres notas distintas.
Cada uno de ellos tiene un nombre diferente, preferencias por un tema distinto y proceden de
especialidades de bachillerato distintas.
A Francisco le gustan las Prcticas de Laboratorio, y obtuvo mejor nota que el procedente de
Letras. Paco, el procedente del bachillerato de Ciencias, fue mejor que el aficionado a la
Programacin Funcional. El aficionado a la Programacin Lgica fue el que mejor calificacin obtuvo.
Quin es el procedente del bachillerato Mixto? Cul es el tema preferido por Curro?
9. Considerando la representacin de una matriz dada por una lista de listas, implementar en Prolog los
predicados:
a) matriz(Matriz-,M+,N+)
% Genera una matriz (primer argumento) de tamao M N
% con componentes variables
b) submatriz(SubMat,Matriz) % Se satisface cuando SubMat es submatriz de Matriz
c) Suponiendo que se dispone de tres tipos de piezas como las siguientes:

Escribir un programa Prolog que permita construir un cuadrado de tamao 4, combinando cuatro
piezas como las anteriores. (Nota: Cada pieza puede representarse mediante una matriz de 2x3).
10. Escribir un programa Prolog que genere los movimientos que debe realizar un caballo de ajedrez
para recorrer todas las casillas de un tablero cuadrado, sin pasar dos veces por la misma. La posicin
inicial y la dimensin del tablero se pasan como argumentos.

PRCTICAS 3