sábado, 14 de junio de 2014

3.4 Prolog

Ejercicios.  

1. 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.


i) En este caso , X=2, Y=5 y Max=8.

Entonces:

8 > 2, y , 8 > 5. Esto es cierto.


ii) X=7, Y=8 y Max=6.

Entonces:

6 > 7, 6 > 8. Esto es falso!!!



2. Defina el predicado maxlist(List, Max) de tal manera que Max sea el   mayor número de la lista List de números.




3. Defina el predicado sumlist(List, Sum) donde Sum es la suma de una lista de números dada en List. 



4. 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  




jueves, 5 de junio de 2014

3.2 Prolog

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. 










Magdaly M.G

miércoles, 28 de mayo de 2014

2.3 Prolog

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: 




(b). ?- f( s(s(1)), dos). 

Respuesta: 


(c). ?- f( s(s(s(s(s(s(1)))))), C). 

Respuesta: 


(d). ?- f( D, tres). 

Respuesta: 


2. 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 ';' ?  



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. 


2.4 Prolog

1. Considere el programa anterior y realice 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? 

Analizando:

(a). Pregunta.      
?- oscuro( X), enorme( X).        % Quién es oscuro y enorme ?  

Traza de la ejecución. 
(1). Lista inicial de metas : oscuro(X), enorme(X). 
(2). Examina el programa de arriba hacia abajo  buscando  una  cláusula cuya cabeza empate con la primera meta : oscuro(X). Se encuentra la cláusula 7 :  
               oscuro( Z) :- negro( Z).  

se reemplaza la primera meta con el cuerpo instanciado de la cláusula 7, dando una nueva lista de metas :  
               negro(X), enorme(X).  

(3). Examina el programa para encontrar un empatamiento de negro(X). Se encuentra la cláusula 5: negro( gato). Esta cláusula no  tiene  cuerpo, así que la lista de metas, luego de instanciarse se convierte en :  

               enorme(gato) 

(4). Examina el programa para buscar la meta enorme(gato), no se encuentra ninguna cláusula. Por lo tanto se realiza un proceso de backtracking al paso 3) y se elimina la instanciación X = gato. Ahora la lista de metas es de nuevo:  
               negro(X), enorme(X). 

Se continúa examinando el programa a partir de la cláusula 5. No se encuentra ninguna cláusula. Por lo tanto se realiza un proceso de backtracking nuevamente al paso (2) y se continúa examinando a partir de la cláusula 7. Se encuentra la cláusula 8:  
               oscuro(Z) :- cafe(Z).
  
Se reemplaza la primera meta en la lista de metas por cafe(X), dando:  
               cafe(X), enorme(X)  

(5). Examina el programa buscando empatar cafe(X), encuentra cafe(oso). Esta cláusula no tiene cuerpo, así que la lista de metas es ahora:  
               enorme(oso)  

(6). Examina el programa  y  encuentra  la  cláusula  enorme(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. 


b) Pregunta.      
?- enorme(X), oscuro(X).       % Quién es oscuro y enorme ?  

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 en 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 encontrar un empatamiento de oscuro(oso). Se encuentra la cláusula 7:

oscuro( Z) :- negro( Z).  

se reemplaza la primera meta con el cuerpo instanciado de la cláusula 7, dando una nueva lista de metas :  
               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). Ahora la lista de metas es de nuevo:  
               enorme(oso), oscuro(oso). 

Se continúa examinando el programa a partir de la cláusula 7. Se encuentra la cláusula 8:  
               oscuro(Z) :- cafe(Z).

Se reemplaza la segundo meta en la lista de metas por cafe(X), dando:  
               enorme(oso), cafe(oso). 

(5). Examina el programa buscando empatar cafe(X), encuentra 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. 



CONCLUSIÓN:

Prolog realiza más trabajo antes de encontrar la respuesta final en la pregunta ?- oscuro( X), enorme( X).




Magdaly M.G.


martes, 27 de mayo de 2014

Ejercicio 2, Capitulo II.

1. ¿ Las siguiente operaciones de matching tienen éxito ó fallan ?
Si tienen éxito, ¿cuáles son las instanciaciones resultantes en las variables?



(a). punto( A, B) = punto( 1, 2).
¡Tuvo éxito!



(b). punto( A, B) = punto( X, Y, Z).
¡No tuvo éxito!



(c). +( 2, 2) = 4.
¡No tuvo éxito!



(d). +( 2, D) = +( E, 2).
¡Tuvo éxito!



(e). triangulo(punto(-1,0),P2,P3) = triangulo(P1,punto(1,0),punto(0,Y)).
¡Tuvo éxito!



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.



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.




Magdaly M.G.

lunes, 19 de mayo de 2014

Ejercicio 1 Capitulo 2

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ó. 


Prolog, ejercicio 1.7

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:

DIAGRAMA








a). ?- progenitor( pamela, roberto). 



b). ?- madre( pamela, roberto). 



c). ?- abuelo( pamela, ana). 


d). ?- abuela(roberto, jaime).