1) EXAMEN DE PROGRAMACIÓN DECLARATIVA_(P. Lógica)_ (18-3-2010

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