EXAMEN DE PROGRAMACIÓN DECLARATIVA_(P. Lógica)_ 1) (18-3-2010) De la forma más parecida posible a como lo haría Sicstus Prolog, dar las 3 primeras soluciones (si existen) para los objetivos y el programa propuestos más abajo, teniendo en cuenta que: Ante un OCCUR CHECK, el sistema no entra en bucle mostrando un enlace infinito, sino que, si por ejemplo el enlace erróneo es X/f(s(X)), entonces responde con algo del estilo X=f(s(f(s(f(s(f(s(.....)))))))). En caso de que no se encuentren las tres soluciones pedidas para cada caso, habrá que indicar si se debe a que el sistema entra en bucle infinito o responde no. PROGRAMA: p(F,F,f(F)). p(B,f(B),Y):-p(B,Y,U),p(B,B,U). OBJETIVO 1: ?- p(A,B,C). OBJETIVO 2: ?- (_X=X,p(_X,f(X),s(_)));!,\+(f(X)=s(_X)). 2) Implementar los siguientes predicados en Prolog: infa(A,B), que a partir de un número B y siguiendo los formatos indicados en los siguientes ejemplos, debe devolver en A otro número tal que el factorial de A es directa o aproximadamente B. | ?- infa(X,24). X = directo(4,24) ? ; no | ?- infa(X,25). X = aproximado(4,24) ? ; no | ?- infa(X,22). X = aproximado(4,24) ? no intervalo(A,B,L), que devuelve en L todos los factoriales inversos de los números comprendidos entre A y B según el siguiente ejemplo. | ?- intervalo(2,8,L). L = [numero(2,directo(2,2)), numero(4,aproximado(2,2)), numero(6,directo(3,6)), numero(3,aproximado(2,2)), numero(5,aproximado(3,6)), numero(7,aproximado(3,6))] SOLUCIONES del EXAMEN de PROGRAMACIÓN LÓGICA (18-3-2010) 1) ?- p(A,B,C). B = A, C = f(A) ? ; B = f(A), C = A ? ; A = f(f(f(f(f(f(f(f(f(f(...)))))))))), % OCCUR CHECK B = f(f(f(f(f(f(f(f(f(f(...)))))))))), C = f(f(f(f(f(f(f(f(f(f(...)))))))))) ? ?- (_X=X,p(_X,f(X),s(_)));!,\+(f(X)=s(_X)). X = s(_A) ? ; true ? ; no 2) infa(A,B):- fact(A,B,0,1). fact(directo(N,M),M,N,M). fact(L,M,R,S):- M>S,R1 is R+1, S1 is S*R1,fact(L,M,R1,S1). fact(L,M,R,S):-S>M, R1 is R-1, S1 is S // R, D is S-M, D1 is M-S1, ((D < D1, L=aproximado(R,S)); (D >= D1, L=aproximado(R1,S1)) ). nat(0). nat(X):-nat(Y),X is Y+1. intervalo(A,_,[]):- A<0,!. intervalo(A,B,[]):- A>=B,!. intervalo(A,B,[numero(A,L)|T]):- infa(L,A), A1 is A+1, intervalo(A1,B,T).