Capítulo 1
Ejercicios. 1.- Asumiendo las relaciones definidas en el ejemplo, ¿qué contestará Prolog a las siguientes preguntas?
a).?- progenitor(
jaime, X).
Prolog contestara:
b).?- progenitor( X,
jaime).
Prolog contestara:
c).?- progenitor(
pamela, X), progenitor( X, patricia).
Prolog contestara:
d).?- progenitor(
pamela, X), progenitor( X, Y), progenitor(Y,jaime).
Prolog contestara:
1.2 Formule en Prolog
las siguientes preguntas acerca de la relación progenitor:
a).¿Cómo se llama el
progenitor de patricia ?
?-
progenitor(X, patricia).
b).¿Tiene Elizabeth
algún hijo ?
?- Progenitor(Elizabeth, X).
Como Elizabeth no tiene hijo,
por eso Prolog contesta false a la pregunta.
c).¿Cómo
se llama el abuelo de patricia ?
?-
abuelo( X, patricia).
1.3. Traduzca las
siguientes sentencias a reglas Prolog.
a).
Cualquiera que tiene un hijo es feliz (introduzca la relación unaria llamada
'feliz').
feliz(X, hijo).
b).
Para todo X, si X tiene un hijo que tiene una hermana, entonces X tiene dos
hijos
(Introduzca la
relación tiene-dos-hijos).
tiene-dos-hijos(X, Y) :- hermana(Y,Z).
1.4. Defina la
relación 'nieto' usando la relación 'progenitor'.
Recomendación: Será
similar a la relación abuelo.
nieto(
X, Z) :- progenitor( Y, X) , progenitor( Z, Y).
1.5. Defina la
relación tía( X, Y) en términos de las relaciones 'progenitor' y
'hermana'.
Dibuje primero un diagrama para ésta relación.
?- tía (X,Y) :-
hermana(X,Z), progenitor(Z,Y)
|
1.6. Considere la
siguiente definición alternativa de predecesor:
predecesor( X, Z) :-
progenitor( X, Z).
predecesor( X, Z) :-
progenitor( Y, Z) , predecesor( X, Y).
¿es apropiada esta
definición? ¿Puede usted dibujar un diagrama que corresponda con esta
definición?
La
segunda definición si es apropiada.
1.7. Trate de
entender como Prolog deriva respuestas a las siguientes preguntas, usando el
programa familiar. Dibuje también los diagramas de derivación correspondientes.
Identifique los bactrakings que se encuentre:
a).?- progenitor( pamela, roberto).
b).?- madre( pamela,
roberto).
c).?- abuelo( pamela,
ana).
Como Pamela es mujer por eso Pamela no es abuelo de Ana.
d).?-
abuela(roberto, jaime).
Como Roberto es hombre por eso Roberto no es abuela de
Jaime
Capítulo 2
Ejercicios:
2.1 Sugiera una
representación para rectángulos, cuadrados y círculos como objetos Prolog estructurados. Escriba
algunos ejemplos que representen objetos físicos concretos utilizando la representación que sugirió.
2.2 ¿Las siguientes
operaciones de matching tienen éxito o fallan? Si tienen éxito, ¿cuáles son las
instanciaciones resultantes en las variables?
(a). punto( A, B) =
punto( 1, 2).
Tiene
éxito. Sus instanciaciones resultantes son:
(b). punto( A, B) =
punto( X, Y, Z).
No tiene éxito
(c). +( 2, 2) = 4.
No tiene éxito
(d). +( 2, D) = +( E,
2).
Tiene éxito
(e).
triangulo(punto(-1,0),P2,P3) = triangulo(P1,punto(1,0),punto(0,Y)).
Tiene éxito
Usando la
representación que se definió anteriormente para segmentos de línea, escriba un
término que represente cualquier segmento de línea vertical en x = 5.
linea(punto(5,Y1),punto(5,Y2)).
Asuma que un
rectángulo se representa con el término rectángulo( P1, P2, P3, P4) donde
P1,P2,P3,P4 son los vértices del rectángulo ordenado positivamente. Defina la
relación regular( R) que es verdad (true) si R es un rectángulo cuyos lados son
vertical y horizontal.
2.3 Considere 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 contestará
Prolog las siguientes preguntas? Cuando sean posibles varias respuestas, dé al
menos dos de ellas.
(a). ?- f( s(1), A).
Prolog contestará:
(b). ?- f( s(s(1)), dos).
Prolog contestará:
(c). ?- f( s(s(s(s(s(s(1)))))), C).
Prolog contestará:
(d). ?- f( D, tres).
Prolog
contestará:
El siguiente programa
dice que dos personas son parientes si,
(a). uno es
predecesor del otro, ó
(b). ambos tienen un
predecesor común, ó
(c). ambos tienen un
sucesor común :
parientes( X, Y) :-
predecesor( X, Y).
parientes( X, Y) :-
predecesor( Y, X).
parientes( X, Y) :-
predecesor( Z, X), predecesor( Z, Y).
parientes( X, Y) :-
predecesor( X, Z), predecesor( Y, Z).
¿ puede usted acortar
el programa usando la notación de ';' ?
Reescriba el
siguiente programa sin utilizar la notación de ';' :
traducir( Numero,
Palabra) :-
Numero = 1, Palabra =
uno;
Numero = 2, Palabra =
dos;
Numero = 3, Palabra =
tres.
2.4 Considere el
programa anterior y realize la traza de ejecución a la pregunta :
?- enorme(X),
oscuro(X).
Compare su traza de
ejecución con la anterior, ya que esencialmente es la misma pregunta pero con
otro orden. ¿En cuál de ambos casos Prolog realiza más trabajo antes de
encontrar la respuesta final?
Traza de la Ejecución
1) Lista inicial de metas: enorme(X), oscuro(X).
2) Examina el programa de arriba hacia abajo buscando una
cláusula cuya cabeza empate con la primera meta: enorme (X)
Se
encuentra la cláusula 1: enorme (oso). Esta cláusula no tiene cuerpo, así que la
lista de metas, luego de instanciarse se convierte en: oscuro(oso).
3) Examina el programa para buscar la meta oscuro(oso),
encuentra la cláusula 7 que luego de instanciarse se convierte en: enorme(oso),negro(oso).
4) Examina el programa para buscar la meta negro(oso), no
se encuentra ninguna cláusula. Por lo tanto se realiza un proceso de
backtracking al paso 3) y se elimina la instanciación negro(oso)
Se continúa examinando el programa a
partir de la cláusula 7.
5) Examina el programa para buscar la meta oscuro(oso),
encuentra la cláusula 8 que luego de instanciarse se convierte en: enorme(oso),cafe(oso).
Esta cláusula no tiene cuerpo, así que la
lista de metas se queda vacía. Esto indica una terminación exitosa y la
instanciación correspondiente a la variable queda como: X = oso.
En la ejecución oscuro(X), enorme(X) Prolog realiza más
trabajo antes de encontrar la respuesta final.
Capítulo 3
Ejercicios.
1. Escriba una meta,
usando concat, para eliminar los tres últimos elementos de una lista L
produciendo otra lista L1. Recomendación: L es la concatenación de L1 y una
lista de tres elementos.
2. Escriba una
secuencia de metas para eliminar los tres primeros elementos y los tres últimos
elementos de una lista L produciendo la lista L2.
3. Defina la
relación:
ultimo( Elemento,
Lista)
de tal modo que
Elemento sea el último elemento de la lista Lista. Escriba dos versiones:
(a) usando la
relación concat, y (b) sin usarla.
4. Defina la relación max(X,Y,Max) de tal modo que Max sea el mayor valor de los dos números X y Y.
5. Defina el predicado maxlist(List, Max) de tal manera que Max sea el mayor número de la lista List de números.
6. Defina el
predicado sumlist(List, Sum) donde Sum es la suma de una lista de números dada
en List.
7. Defina el
predicado ordenada(List) el cual es cierto (devolverá yes) si List es una lista
ordenada de números en forma ascendente o descendente, por ejemplo,
?-
ordenada(1,5,6,6,9,12).
Yes
8. Defina el predicado subsum(Set, Sum, Subset) donde Set es una lista de números, Subset es un subconjunto de esta lista y Sum es la suma de los números en Subset. Por ejemplo,
Sub = [1,2,2];
Sub = [2,3];
Sub = [5];
...
Capítulo 4
Ejercicios.
4.1 Escribir
preguntas para encontrar lo siguiente:
aa)
Nombres
de las familias que no tienen hijos.
bb)
Nombres
de todos los hijos que no trabajan.
cc)
Nombres
de las familias con esposas que trabajan y esposos que no trabajan.
dd)
Todos
los hijos cuyos padres difieren en edad con al menos 10 años.
ee)
Definir
la relación: gemelos(Hijo1, Hijo2) que sirva para encontrar geme-los en la base
de datos.
Capítulo 5
Ejercicios.