%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % PRACTICA Nº 3 : PROGRAMAS DE NIVEL MEDIO % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % 1. Generacion y Comprobacion. % ------------------------------------------- % % El programa cifras obtiene, para una lista de numeros L y % un numero N, la forma de obtener N mediante operaciones % aritmeticas basicas (+,-,*,/) con las cifras de L (sin % repetirlas). Modificarlo o ampliarlo para que, cuando no % haya solucion, obtenga aproximaciones de N. Puede hacerse % generando y probando aproximaciones de N (N+1, N-1, N+2, N-2,.) % % % % 2. Busqueda en grafos. % ---------------------- % % % Utilizar el programa "camino" para que dado un grafo arbitrario % (con ciclos) se puedan encontrar todos los CAMINOS POSIBLES % SIN CICLOS... % % (1) ...entre dos nodos dados, % (2) ...que parten de un nodo dado, % (3) ...que llegan a un final dado, % (4) ...que tienen origen y final arbitrarios. % % % Implementar el programa propuesto en el ejercicio 1 de la hoja 5, % para determinar si un caballo de ajedrez situado inicialmente sobre % una casilla P puede recorrer un tablero de dimensiones X*Y sin % repetir casillas. La implementación del predicado caballo(X,Y,P,L) % deberá basarse en búsqueda en grafos. Para definir arco(P1,P2) se % aconseja usar los predicado salto(P1,P2) y valida(P), que indican % respectivamente como dar un salto de caballo de una casilla P1 a % otra P2, y cuando una casilla P pertenece al tablero. Buscar las % dos soluciones del objetivo caballo(4,3,pos(1,1),L). % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % CIFRAS: cifras(L,N,[H|T]) :- selecc(X,Y,L,L1), % Se seleccionan dos cifras de L; L1 = L - {X,Y} operacion(X,Y,H,S), % Se prueba una operacion H, que produce S ( S = N, T = [] % Se consigue el valor N deseado ... ; % ... o ... cifras([S|L1],N,T) % ... se cambia X e Y por S y se sigue probando. ). selecc(X,Y,[X|T],S) :- selecc1(Y,T,S). % Seleccion selecc(X,Y,[H|T],[H|S]) :- selecc(X,Y,T,S). % de X selecc1(Y,[Y|T],T). % Seleccion selecc1(Y,[H|T],[H|S]) :- selecc1(Y,T,S). % de Y operacion( X, Y, suma(X,Y,S), S) :- S is X + Y. operacion( X, Y, resta(X,Y,S), S) :- S is X - Y, S > 0. operacion( X, Y, resta(Y,X,S), S) :- S is Y - X, S > 0. operacion( X, Y, multip(X,Y,S), S) :- S is X * Y. operacion( X, Y, divide(X,Y,S), S) :- 0 is X mod Y, S is integer(X / Y). operacion( X, Y, divide(Y,X,S), S) :- 0 is Y mod X, S is integer(Y / X). % NOTA: Las estructuras de datos suma(X,Y,S), resta(X,Y,S),... informan del % tipo de operacion efectuada --no son llamadas a funciones, pues % aparecen como parametros--. % Tambien podrian usarse las estructuras X+Y=S, X-Y=S, ..., que tampoco % son llamadas a funciones (aparecen en parametros, y, ademas, no tienen % is). Probar con esta forma. % CABALLOS camino(Inicio, Final, Camino) :- camino(Inicio, Final, Camino, [Inicio]). camino(I, F, [I,F], V) :- arco(I,F), \+(member(F,V)). camino(I, F, [I|T], V) :- arco(I,Z), \+(member(Z,V)), camino(Z,F,T,[Z|V]). member(X,[X|_]). member(X,[_|T]) :- member(X,T). len([],0). len([_|T],N1):-len(T,N),N1 is N+1. valida(pos(F,C)):-tablero(X,Y),1=