RA: tema-05-ej.txt Tema 5: Programación lógica y Prolog (Ejercicios) ============================================================================== 1. [Flach-94 p.47] Dado el programa lista(nil). lista(cons(X,Y)) :- lista(Y). dibujar el árbol de resolución SLD correspondiente a la pregunta ?- lista(L). ··············································································· 2. [Bratko-86 p. 128] Dado el programa p(1). p(2) :- !. p(3). dibujar los árboles de resolución SLD correspondiente a las preguntas (a) ?- p(X). (b) ?- p(X), p(Y). (c) ?- p(X), !, p(Y). ··············································································· 3. [Bratko-86 p. 129] La siguiente relación clasifica los números en tres categorías: positivo, cero y negativo: clase(Numero,positivo) :- Numero > 0. clase(0,cero). clase(Numero,negativo) :- Numero < 0. Definir este procedimiento de una manera más eficiente usando cortes. ··············································································· 4. [Flach-94 p. 56] Dado el programa soltero(X) :- no(casado(X)), hombre(X). hombre(federico). hombre(pedro). casado(pedro). (a) Dibujar los árboles de resolución SLD correspondiente a las preguntas (a.1) ?- soltero(federico). (a.2) ?- soltero(pedro). (a.3) ?- soltero(X). (b) ¿Qué modificación hay que hacer en el programa para obtener la respuesta correcta a la pregunta (a.3)?. ··············································································· 5. [Flach-94 p. 62] Definir el predicado cero(A,B,C,X) de forma que, dados los coeficientes A, B y C, calcule ambos valores de X para los cuales A*X^2+B*X+C = 0. Por ejemplo, ?- cero(1,-5,6,X). X = 3 ; X = 2 ; No [Indicación: sqrt(X) es la raíz cuadrada de X]. ··············································································· 6. [Flach-94 p. 63] Dado el programa longitud([],0). longitud([X|R], N) :- longitud(R,M), N is M+1. dibujar el árbol de resolución SLD correspondiente a la pregunta ?- longitud([a,b,c],N). ··············································································· 7. [Flach-94 p. 63] Dado el programa longitud(L,N) :- longitud_ac(L,0,N). longitud_ac([],N,N). longitud_ac([X|R],N0,N) :- N1 is N0+1, longitud_ac(R,N1,N). dibujar el árbol de resolución SLD correspondiente a la pregunta ?- longitud([a,b,c],N). ··············································································· 8. [Flach-94 p. 64] Dado el programa inversa([],[]). inversa([X|L1],L2) :- inversa(L1,L3), conc(L3,[X],L2). conc([],L,L). conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3). dibujar el árbol de resolución SLD correspondiente a la pregunta ?- inversa([a,b,c],R). ··············································································· 9. [Flach-94 p. 69] Dado el programa % Declaración de operadores: :- op(900,fx,si). :- op(800,xfx,entonces). :- op(700,xfy,y). % Programa objeto: si tiene_pelos entonces es_mamifero. si da_leche entonces es_mamifero. si es_mamifero y tiene_pezuñas entonces es_ungulado. si es_mamifero y rumia entonces es_ungulado. si es_ungulado y tiene_cuello_largo entonces es_jirafa. si es_ungulado y tiene_rayas_negras entonces es_cebra. % Meta-programa: deriva(si Condiciones entonces Conclusion) :- si Cuerpo entonces Conclusion, deriva(si Condiciones entonces Cuerpo). deriva(si Condiciones entonces Conclusion1 y Conclusion2) :- deriva(si Condiciones entonces Conclusion1), deriva(si Condiciones entonces Conclusion2). deriva(si Condiciones entonces Conclusion) :- asumida(Conclusion,Condiciones). asumida(A,A). asumida(A,A y As). asumida(A,B y As) :- asumida(A,As). dibujar el árbol de resolución SLD correspondiente a la pregunta ?- deriva(si tiene_pelos y tiene_pezuñas y tiene_rayas_negras entonces es_cebra). 10. Dado el programa % Programa objeto es_mamifero :- tiene_pelos. es_mamifero :- da_leche. es_ungulado :- es_mamifero, tiene_pezuñas. es_ungulado :- es_mamifero, rumia. es_jirafa :- es_ungulado, tiene_cuello_largo. es_cebra :- es_ungulado, tiene_rayas_negras. tiene_pelos. tiene_pezuñas. tiene_rayas_negras. % Meta-intéprete prueba(true) :- !. prueba((A,B)) :- !, prueba(A), prueba(B). prueba(A) :- % no A=true ni A=(X,Y) clause(A,B), prueba(B). dibujar el árbol de resolución SLD correspondiente a la pregunta ?- prueba(es_cebra). 11. Dado el programa % Programa objeto: es_mamifero(X) :- tiene_pelos(X). es_mamifero(X) :- da_leche(X). es_ungulado(X) :- es_mamifero(X), tiene_pezuñas(X). es_ungulado(X) :- es_mamifero(X), rumia(X). es_jirafa(X) :- es_ungulado(X), tiene_cuello_largo(X). es_cebra(X) :- es_ungulado(X), tiene_rayas_negras(X). tiene_pelos(animal1). tiene_pezuñas(animal1). tiene_rayas_negras(animal1). % Meta-intéprete: prueba(true):-!. prueba((A,B)):-!, prueba(A), prueba(B). prueba(A):- clause(Cabeza,Cuerpo), A=Cabeza, prueba(Cuerpo). dibujar el árbol de resolución SLD correspondiente a la pregunta ?- prueba(es_cebra(animal1). ··············································································· Bibliografía: * [Bratko-86] Bratko, I. "Prolog Programming for Artificial Intelligence" (Addison--Wesley, 1986) * [Flach-94] Flach, P. "Simply Logical (Intelligent Reasoning by Example)" (John Wiley, 1994)}