EXAMEN DE PROGRAMACIÓN DECLARATIVA_(P. Lógica)_ 1) (1-4-2011) 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(s(A),A,A). p(Y,B,s(B)):-p(X,B,Y),p(X,B,B). OBJETIVO 1: ?- p(X,Y,Z). OBJETIVO 2: ?- \+(f(X)=s(_X));!,_X=X,p(f(A),_X,s(X)). 2) Implementar los siguientes predicados en Prolog: exactos(N1,N2,L), que devuelve en L todos los números comprendidos entre N1 y N2 que tienen un factorial inverso exacto. Se valorará el dar dos versiones distintas, una que haga uso del predicado fadi (que calcula factoriales directos) y otra que haga uso de fain (que calcula factoriales inversos). ?- exactos(2,150,L). L = [2,6,24,120] ? ; no secuencias(I,N,S), que a partir de un identificador I y un número N, devuelve por reevaluación en S todos los sub-identificadores de N caracteres que aparecen en I y cuyos caracteres son consecutivos lexicográficamente. ?- secuencias(sabcdghilo,3,S). S = abc ? ; S = bcd ? ; S = ghi ? ; no SOLUCIONES del EXAMEN de PROGRAMACIÓN LÓGICA (1-4-2011) 1) ?- p(X,Y,Z). X = s(Y), Z = Y ? ; Y = X, Z = s(X) ? ; X = s(s(s(s(s(s(s(s(s(s(...)))))))))), Y = s(s(s(s(s(s(s(s(s(s(...)))))))))), Z = s(s(s(s(s(s(s(s(s(s(...)))))))))) ? ?- \+(f(X)=s(_X));!,_X=X,p(f(A),_X,s(X)). true ? ; X = f(A) ? ; no 2) exactos1(N1,N2,L):-N1>0,N2>0,N1=<N2,aux1(1,N1,N2,L). aux1(I,N1,N2,L):-fadi(I,N),J is I+1, ( (N<N1,!,aux1(J,N1,N2,L)); (N>N2,!,L=[]) ; (aux1(J,N1,N2,L1),L=[N|L1])). exactos2(N1,N2,L):-N1>0,N2>0,N1=<N2,aux2(N1,N2,L). aux2(N1,N2,[]) :- N1>N2,!. aux2(N1,N2,L) :- fain(X,N1),N3 is N1+1, ((X==nada,aux2(N3,N2,L)); (X\=nada,aux2(N3,N2,L1),L=[N1|L1])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% secuencias(I,N,S):-name(I,L1),append(_,A,L1), append(L2,_,A),len(L2,N), test(L2),name(S,L2). test([]). test([_]). test([N1,N2|L]):-N2 is N1+1,test([N2|L]).