CAPITULO 2
EJERCICIOS:
2.1.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ó.
Circulo(punto(X,Y),radio(X,Y))
Rectangulo(punto(X,Y),puntoc,punto(X,Y),punto(X,Y)).
Cuadrado(punto(X,Y),punto(X,Y),punto(X,Y),punto(X,Y)).
Ejemplos:
Triangulo(punto(X,Y),punto(X,Y),punto(X,Y)).
Línea(punto(X,Y),punto(X,Y)).
Rombo(punto(X,Y),punto(X,Y),punto(X,Y),punto(X,Y)).
2.2.1.¿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:
A=1
B=2
(b). punto( A, B) = punto( X, Y, Z).
No tiene éxito
false.
(c). +( 2, 2) = 4.
No tiene éxito
false.
(d). +( 2, D) = +( E, 2).
Tiene éxito
Sus instanciaciones resultantes son:
D=E
E=2
(c). triangulo(punto(-1,0),P2,P3) = triangulo(P1,punto(1,0),punto(0,Y)).
Tiene éxito
Sus instanciaciones resultantes son:
P2 = punto(1, 0)
P3 = punto(0, Y)
P1 = punto(-1, 0)
2..2.2 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)).
2.2.3. 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.
rectangulo(punto(X,Y),punto(X,Y),punto(X,Y),punto(X,Y)).
regular(R).
rectangulo(lado1(horizontal),lado2(vertical),lado3(horizontal),lado4(vertical)).
(R)=true.
2.3.1 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).
Respuesta de Prolog:
A=dos
(b). ?- f( s(s(1)), dos).
Respuesta de Prolog :
false.
(c). ?- f( s(s(s(s(s(s(1)))))), C).
Respuesta de Prolog:
(d). ?- f( D, tres).
Respuesta de Prolog:
D = s(s(1)).
2.3.2El 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 ';' ?
parientes(X,Y) :- predecesor(X,Y) ; predecesor(Y,X) ;predecesor(Z,X),
predecesor(Z,Y) ; predecesor(X,Z) , predecesor(Y,Z).
2.3.3.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.
traducir(Numero,Palabra) :- Numero=1,Palabra=uno.
traducir(Numero,Palabra) :- Numero=2,Palabra=dos.
traducir(Numero,Palabra) :- Numero=3,Palabra =tres.
2.3.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ó
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
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 traza de ejecución: oscuro(X),enorme(X) Prolog realiza más trabajo
antes de encontrar la respuesta final.
No hay comentarios:
Publicar un comentario