1) EXAMEN DE PROGRAMACIÓN DECLARATIVA_(P. Lógica)_ (1-4-2011

Anuncio
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]).
Descargar