Está en la página 1de 3

Ejercicios prácticos

Base de Datos. Ejemplo 1.1

Ejercicio 1
Dada la base de datos familiar del ejemplo 1.1, se pide la respuesta de PROLOG y el enunciado verbal de las siguientes
preguntas:
a) ?-progenitor(jaime,X).
b) ?-progenitor(X,jaime).
c) ?-progenitor(clara,X), progenitor(X,patricia).
d) ?-progenitor(tomas,X), progenitor(X,Y), progenitor(Y,Z).

Ejercicio 2
Dada la base de datos familiar del ejemplo 1.1, formula en PROLOG las siguientes preguntas:
a) ¿Quién es el progenitor de Patricia?
b) ¿Tiene Isabel un hijo o una hija?
c) ¿Quién es el abuelo de Isabel?
d) ¿Cuáles son los tíos de Patricia? (no excluir al padre)

Ejercicio 3
Dada la base de datos familiar del ejemplo 1.1, y suponiendo definidas las siguientes cláusulas:
hombre(X).
mujer(X).
progenitor(X,Y).
dif(X,Y):- X\=Y.
Donde las 3 primeras cláusulas se definirán como hechos (por tanto no se podrá poner una variable como argumento, ya
que una variable haría que el hecho fuera cierto para cualquier objeto) y la última como una regla (donde el símbolo \=
significa distinto). Escribir las reglas de PROLOG que expresen las siguientes relaciones:
a) es_madre(X).
b) es_padre(X).
c) es_hijo(X).
d) hermana_de(X,Y).
e) abuelo_de(X,Y) y abuela_de(X,Y).
f) hermanos(X,Y). Tened en cuenta que una persona no es hermano de sí mismo.
g) tia(X,Y). Excluid a los padres.

Ejemplo 1.3
predecesor(X,Y):-progenitor(X,Y).
predecesor(X,Y):-progenitor(X,Z), predecesor(Z,Y).
La primera definición de predecesor corresponde al caso más sencillo en el que el predecesor corresponde al progenitor.
Es lo que llamaremos la regla de salida de la recursividad. Si al intentar comprobar si una persona es predecesora de otra,
se halla en la base de datos que la primera persona es progenitora de la segunda, se habrá demostrado y PROLOG
responderá que sí. En caso contrario, se intentará demostrar que es predecesor utilizando la segunda regla, que contiene la
llamada recursiva.
X Z Y
Figura 1.1 Diagrama que explica la definición de predecesor. La línea
continua se refiere a un progenitor directo y la discontinua a un predecesor.

Ejemplo 1.3
predecesor(X,Y):-progenitor(X,Y).
predecesor(X,Y):-progenitor(X,Z), predecesor(Z,Y).
La primera definición de predecesor corresponde al caso más sencillo en el que el predecesor corresponde al progenitor.
Es lo que llamaremos la regla de salida de la recursividad. Si al intentar comprobar si una persona es predecesora de otra,
se halla en la base de datos que la primera persona es progenitora de la segunda, se habrá demostrado y PROLOG
responderá que sí. En caso contrario, se intentará demostrar que es predecesor utilizando la segunda regla, que contiene la
llamada recursiva.

Ejercicio 1.4
Dada la base de datos familiar del ejemplo 1.1:
a) Define una regla que permita obtener los sucesores de una persona.
b) Comprueba el funcionamiento de PROLOG para obtener los sucesores de Clara.
Escribir el árbol de derivación natural.
c) ¿Es una alternativa válida a la definición de predecesor la siguiente?
predecesor(X,Z):-progenitor(X,Z).
predecesor(X,Z):- progenitor(Y,Z), predecesor(X,Y).
Dibuja un diagrama que explique la definición.

Ejemplo 1.5
fecha(D,M,1998) = fecha(D1,mayo,A)
piloto(A,Londres) = piloto(londres,paris)
punto(X,Y,Z) = punto(X1,Y1,Z1)
f(X,a(b,c)) = f(Z,a(Z,c))

Ejemplo 1.5
fecha(D,M,1998) = fecha(D1,mayo,A)
piloto(A,Londres) = piloto(londres,paris)
punto(X,Y,Z) = punto(X1,Y1,Z1)
f(X,a(b,c)) = f(Z,a(Z,c))

Ejercicio 1.5
Decir si la unificación tiene éxito y cuál es el resultado de la instanciación de las variables en:
triangulo(punto(-1,0),P2,P3) = triangulo(P1,punto(1,0),punto(0,Y)).
¿A qué familia de triángulos da lugar la instanciación resultante?
Ejercicio 1.6
Con la siguiente definición de segmento:
segmento(punto(X1,Y1),punto(X2,Y2)).
Representar cualquier segmento línea vertical con X=5.
Ejercicio 1.7
Si representamos el rectángulo por rectángulo(P1,P2,P3,P4) donde Pi son vértices
ordenados positivamente, define la relación
regular(R)
que será verdadero cuando los lados del rectángulo R sean verticales y horizontales.
Ejercicio 1.8
Dado el siguiente programa:
f(1,uno).
f(s(1),dos).
f(s(s(1)),tres).
f(s(s(s(X))),N):- f(X,N).
¿Cómo se comporta PROLOG ante las siguientes preguntas?
a) ?-f(s(1),A).
b) ?-f(s(s(1)),dos).
c) ?-f(s(s(s(s(s(s(1)))))),C).
d) ?-f(D,tres).
Ejercicio 1.9
Dada la siguiente base de datos familiar:
Fundamentos de PROLOG
18
progenitor(clara,jose).
progenitor(tomas, jose).
progenitor(tomas,isabel).
progenitor(jose, ana).
progenitor(jose, patricia).
progenitor(patricia,jaime).
mujer(clara).
mujer(isabel).
mujer(ana).
mujer(patricia).
hermana_de(X,Y):- mujer(X), progenitor(Z,X), progenitor(Z,Y).
tia(X,Y):- hermana_de(X,Z), progenitor(Z,Y).
Construir el esquema de deducción natural para las siguientes preguntas:
a) ?-tia(isabel,ana).
b) ?-tia(clara,ana).
c) Si añado la cláusula progenitor(tomas, maria), ¿cómo quedarían a) y b) si pulsamos ;?

Ejercicio 1.10
Construir el árbol de resolución lineal para la pregunta:
?-predecesor(clara,patricia).
teniendo en cuenta las siguientes 4 definiciones de predecesor:
a) predecesor(X,Y):-progenitor(X,Y).
predecesor(X,Y):-progenitor(X,Z), predecesor(Z,Y).
b) predecesor(X,Y):-progenitor(X,Z), predecesor(Z,Y).
predecesor(X,Y):-progenitor(X,Y).
c) predecesor(X,Y):-progenitor(X,Y).
predecesor(X,Y):-predecesor(Z,Y), progenitor(X,Z).
d) predecesor(X,Y):-predecesor(Z,Y), progenitor(X,Z).
predecesor(X,Y):-progenitor(X,Y).

También podría gustarte