Вы находитесь на странице: 1из 5

Paradigmas de Lenguajes de Programacion

1er Cuatrimestre de 2008

actica No 5 - Programaci
Pr on L
ogica
Para resolver esta pr
actica, recomendamos usar el SWI-Prolog, de distribucion gratuita, que puede bajarse
de http://www.swi-prolog.org.
No utilizar cut (!) ni predicados de alto orden (como setof). La u
nica excepcion es el not, que est
a per-
mitido.
Los ejercicios marcados con el smbolo F constituyen un subconjunto mnimo de ejercitacion. Sin embargo,
aconsejamos fuertemente hacer todos los ejercicios.
Ejercicio 1 F
A partir de los predicados binarios padre y esposo y de los predicados unarios hombre y mujer, definir
en Prolog los predicados binarios: hijo, abuelo, progenitor, hermano, descendiente, tio. (Aclaraciones: si
bien los nombres tienen genero masculino, los predicados binarios a definir deben admitir tanto mujeres como
hombres. Se asume que no hay hijos extramatrimoniales.)

i. Considerar el
arbol geneal
ogico de la siguiente figura. Dibuje el arbol de b
usqueda de Prolog para la
consulta abuelo(Who, ron).

ii. Defina una nueva relaci


on primo. C
omo se puede definir una consulta para conocer todos los primos de
ron?
iii. Considerar el agregado del siguiente hecho y regla:

ancestro(X, X).
ancestro(X, Y) :- ancestro(Z, Y), progenitor(X, Z).

y el
arbol geneal
ogico del tem anterior.

a) Explicar la respuesta a la consulta ancestro(bill, X).


b) Describir las circunstancias en las que puede ocurrir un loop infinito en Prolog.
c) Sugerir un soluci
on al problema hallado en los puntos anteriores reescribiendo el programa de
ancestro.

Ejercicio 2 F
Usando la definici
on de n
umero natural a partir de cero y sucesor, definir un predicado unario natural,
tal que natural(-X) sii X es un n
umero natural. Definir las siguientes relaciones entre n
umeros naturales:

i. moi(-X, +Y) sii X es menor o igual que Y.


ii. producto(+X, +Y, -Z) sii Z es el producto de X con Y.
iii. fact(+X, -F) sii F es el factorial de X.

P
agina 1 de 5
Paradigmas de Lenguajes de Programacion
1er Cuatrimestre de 2008

iv. mod(+X, +Y, -Z) sii Z es el resto de la division entrera entre X e Y. Dar una definicion recursiva y una no
recursiva.
v. Definir un predicado unario que determine si un n
umero entero dado es primo. Tener en cuenta que el
argumento siempre esta instanciado.

Ejercicio 3
Sea el siguiente programa l
ogico:
vecino(X, Y, [X|[Y|Ls]]).
vecino(X, Y, [W|Ls]) :- vecino(X, Y, Ls).

i. Mostrar el
arbol de derivaci
on en Prolog para resolver vecino(5, Y, [5,6,5,3]), devolviendo todos los
valores de Y que hacen que la meta se deduzca logicamente del programa.
ii. Si se invierte el orden de las reglas, los resultados son los mismos? Y el orden de los resultados?

Ejercicio 4 F
Definir los siguientes predicados:
i. last(-L, -U), donde U es el u ltimo elemento de la lista L. Definirlo en forma recursiva, y usando el
predicado append definido de la siguiente manera:

append([], X, X).
append( [H | T], Y, [H | Z]) :- append(T, Y, Z).

ii. reverse(+L, -L1), donde L1 contiene los mismos elementos que L, pero en orden inverso.
Ejemplo: reverse([a,b,c], [c,b,a]).
Realizar una definici
on usando append, y otra sin usarlo. Mostrar el arbol de prueba para el ejemplo dado.
iii. maxlista(+L, -M) y minlista(+L, -M), donde M es el maximo/mnimo de la lista L.
iv. palindromo(+L, -L1), donde L1 es un palndromo construido a partir de L.
Ejemplo: palindromo([a,b,c], [a,b,c,c,b,a]).
v. doble(-L, -L1), donde cada elemento de L aparece dos veces en L1.
Ejemplo: doble([a,b,c], [a,a,b,b,c,c]).
vi. prefijo(-P, +L), donde P es prefijo de la lista L.
vii. sufijo(-S, +L), donde S es sufijo de la lista L.
viii. sublista(-S, +L), donde S es sublista de L.
ix. iesimo(-I, +L, -X), donde X es el I-esimo elemento de la lista L.
Ejemplo: iesimo(2, [10, 20, 30, 40], 20).

Ejercicio 5 F
Definir los siguientes predicados:
i. mezcla(L1, L2, L3), donde L3 es el resultado de intercalar uno a uno los elementos de las listas L1 y L2.
Si una lista tiene longitud menor, entonces el resto de la lista mas larga es pasado sin cambiar. Verificar
la reversibilidad, es decir si es posible obtener L3 a partir de L1 y L2, y viceversa.
Ejemplo: mezcla([a,b,c], [d,e], [a,d,b,e,c]).
ii. split(N, L, L1, L2), donde L1 tiene los N primeros elementos de L, y L2 el resto. Si L tiene menos de
N elementos el predicado debe fallar. Cuan reversible es este predicado? Es decir, que elementos pueden
estar indefinidos al momento de la invocacion?
iii. borrar(+ListaOriginal, +X, -ListaSinXs), que elimina todas las ocurrencias de X de la lista
ListaOriginal.
iv. sacarDuplicados(+L1, -L2), que saca todos los elementos duplicados de la lista L1.

P
agina 2 de 5
Paradigmas de Lenguajes de Programacion
1er Cuatrimestre de 2008

Ejercicio 6
Considerando los predicados append, prefijo y sufijo ya definidos, realizar el arbol de b
usqueda para las
siguientes consultas:

i. sufijo([a], L), prefijo(L, [a,b,c]).

ii. sufijo([b], L), prefijo(L, [a,b,c]).

Ejercicio 7 F
Definir el predicado aplanar(+Xs, -Ys), que es verdadero sii Ys contiene los elementos de todos los niveles
de Xs, en el mismo orden de aparici
on. Los elementos de Xs son enteros, atomos o nuevamente listas, de modo
que Xs puede tener una profundidad arbitraria. Por el contrario, Ys es una lista de un solo nivel de profundidad.
Ejemplos:
?- aplanar([a, [3, b, []], [2]], [a, 3, b, 2]).
?- aplanar([[1, [2, 3], [a]], [[[]]]], [1, 2, 3, a]).
Ejercicio 8
Definir los siguientes predicados:

i. ordenada(+L), que ser


a cierta si los elementos de L estan ordenados en forma ascendente.

ii. quicksort(+L, -L1), donde L1 es el resultado de ordenar L por el metodo de quicksort, que consiste en
dividir a L en 2 sublistas con los menores y mayores al primer elemento, ordenar cada una de ellas y luego
proceder a concatenarlas.

iii. inssort(+L, -L1), donde L1 es el resultado de ordenar L por el metodo de inserci


on, que consiste en
insertar cada elemento en el lugar adecuado del resto de la lista ya ordenada.

Ejercicio 9
Definir un predicado rotar(+L, +N, -R), tal que R sea la lista L rotada N posiciones (la rotacion se debe
hacer hacia la derecha si N>0 y hacia la izquierda si N<0).
Ejemplos:
rotar([1, a, 2, b, 3], 3, X) debe dar como respuesta X = [2, b, 3, 1, a]
rotar([1, a, 2, b, 3], -3, X) debe dar como respuesta X = [b, 3, 1, a, 2]
Ejercicio 10
Definir un predicado que reciba una lista de numeros naturales y devuelva otra lista de n
umeros naturales,
en la que cada numero n de la primera lista aparezca repetido n veces en forma consecutiva, respetando su
orden de aparici
on. Considerar que la lista original siempre esta instanciada.
Ejemplo: para la lista [2, 3, 1, 0, 2] la salida es [2, 2, 3, 3, 3, 1, 2, 2].
Ejercicio 11
Escribir en Prolog un predicado que devuelva la mediana de una lista (la mediana es el elemento que se
halla en la posici
on del medio de dicha lista, tras ser ordenada). Utilizar los predicados definidos anteriormente.
Considerar que la lista siempre esta instanciada.
Ejercicio 12 F
Escribir en Prolog los siguientes predicados:
pertenece(-X, -L), que es verdadero sii el elemento X se encuentra en la lista L.
interseccion(+X, +Y, -Z), tal que Z es la interseccion sin repeticiones de las listas X e Y, respetando en
Z el orden en que aparecen los elementos en X.

P
agina 3 de 5
Paradigmas de Lenguajes de Programacion
1er Cuatrimestre de 2008

Ejercicio 13 F
Un
arbol binario se representar
a en Prolog con:
nil, si es vaco.
bin(izq, v, der), donde v es el valor del nodo, izq es el subarbol izquierdo y der es el subarbol derecho.

i. Definir predicados en Prolog para las operaciones comunes de arboles: vacio, raiz, altura y
cantidadNodos. Asumir siempre que el arbol esta instanciado.

ii. Se define la profundidad de un nodo como la distancia desde la raz hasta el mismo (la raz tiene pro-
fundidad 0). Definir un predicado hpp que permita, dado un arbol binario instanciado, obtener la lista de
todos los valores de las hojas que tengan profundidad par. Puede ocurrir que dos o mas hojas distintas
tengan el mismo valor, pero en la respuesta de hpp los valores no deben repetirse.
Ejemplo:
hpp( bin(bin(nil, 2, nil), 2, bin(bin(nil, 4, nil), 1, nil) ), L).
L = [4];
No.

Ejercicio 14 F
Definir los siguientes predicados, utilizando la representacion de arbol binario definida en el ejercicio 13:
i. aBB(+T), que sera verdadero si T es un arbol binario de busqueda.

ii. aBBInsertar(+X, +T1, -T2), donde T2 resulta de insertar X en orden en el arbol T1.

iii. ramas(+AB,-Ramas), que tenga exito si AB es un arbol binario y Ramas una lista de listas de elementos
que representa las ramas del
arbol (es decir, los caminos desde la raz hacia las hojas).

iv. arbolConRamas(+Ramas,-AB), versi


on inversa del predicado anterior.

Ejercicio 15 F
Un
arbol (a secas) de naturales se representara en Prolog con:
hoja(V), donde V es un natural seg
un la representacion de Prolog.
nodo(V, Hijos), donde V es un natural seg un la representacion de Prolog, e Hijos es una lista no vaca
de
arboles de naturales.

Definir el predicado mayores(+Arbol, +Max) que dado un arbol de naturales (que podra contener variables
en los nodos) devuelve verdadero si:

Los naturales que contiene el arbol son menores o iguales a Max (en caso de ser variables, deber
an
instanciarse con valores en dicho rango).
El valor de cada nodo del arbol es mayor que la suma de los valores de sus hijos.

Ejemplo:

mayores(
nodo(X, [hoja(0), nodo(1,[hoja(0), hoja(0)]),
nodo(4,[hoja(1), hoja(0), nodo(1, [hoja(0)])])]),9
)

debe responder:
X = 8;
X = 9;
No

P
agina 4 de 5
Paradigmas de Lenguajes de Programacion
1er Cuatrimestre de 2008

Ejercicio 16
Definir el predicado combinador(+L,+D,+H,-XS), que debe dar verdadero cuando XS es una lista de naturales
de longitud L, y cada uno de sus elementos XSi cumple que D XSi H. No se deben devolver soluciones repetidas.
Por ejemplo: combinador(2,3,5,X).

X = [3,3] ; X = [4,5] ;
X = [3,4] ; X = [5,3] ;
X = [3,5] ; X = [5,4] ;
X = [4,3] ; X = [5,5] ;
X = [4,4] ;

Ejercicio 17 F
Un cuadrado semi-latino es una matriz cuadrada de naturales (incluido el cero) donde todas las filas de la
matriz suman lo mismo. Por ejemplo:
1 3 0
2 2 0 todas las filas suman 4
1 1 2
Representamos la matriz como una lista de filas, donde cada fila es una lista de naturales. El ejemplo anterior
se representara de la siguiente manera: [[1,3,0],[2,2,0],[1,1,2]].
Se pide definir el predicado cuadradoSemiLatino(N,XS). El parametro N debe estar instanciado, no as XS
no puede estar instanciado. El predicado debe ir devolviendo matrices (utilizando la representacion antes
mencionada), que sean cuadrados semi-latinos de dimension N*N. Dichas matrices deben devolverse de manera
ordenada: primero aquellas cuyas filas suman 0, luego 1, luego 2, etc..
Ejemplo: cuadradoSemiLatino(2,X). devuelve:
X = [[0, 0], [0, 0]] ;
X = [[0, 1], [0, 1]] ;
X = [[0, 1], [1, 0]] ;
X = [[1, 0], [0, 1]] ;
X = [[1, 0], [1, 0]] ;
X = [[0, 2], [0, 2]] ;
etc.
Para la implementaci on de cuadradoSemiLatino se cuenta con el siguiente predicado:
desde(+A, -B).
desde(D, D).
desde(D, X) :- DD is D+1, desde(DD, X).
Ejercicio 18 F
Sea la estructura Censo, y los siguientes predicados disponibles:
personas(+Censo, -Personas), que tiene exito cuando Personas contiene toda la lista de personas
registradas por el Censo.
edad(+Censo, +Persona, -Edad), que tiene exito cuando la Persona tiene edad Edad seg
un el Censo.

Definir el predicado personasEnPromedio(+Censo, +Edad, -Conjunto) que tenga exito cuando Conjunto
sea una lista de Personas del Censo, cuyo promedio de edad sea menor a Edad.
Ejercicio 19 (opcional)
Torres de Hanoi
Se tienen tres estacas A, B y C, y N discos de distintos tama
nos, perforados en el centro. Los discos pueden
apilarse en las estacas formando torres, y estan ubicados inicialmente en la estaca A en orden decreciente de
tamano. El problema consiste en mover los discos de A a C de tal manera que terminen ordenados como lo
estaban originalmente. La tarea debe efectuarse bajo las siguientes restricciones:

En cada paso s
olo un disco puede moverse de una estaca a otra.
Nunca puede ubicarse un disco sobre otro mas peque
no.

Usando Prolog, modelar y resolver el problema de las torres de Hanoi para tres estacas y N discos.

P
agina 5 de 5

Вам также может понравиться