% Examen de "Programación Declarativa" (14 de Noviembre de 2005) % Apellidos: % Nombre: %============================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Examen 1a: El ADN está formado por dos cadenas de nucleótidos (hay % cuatro distintos, A,C,G y T) que se entrelazan en una doble hélice de % manera que los nucleótidos enfrentados son complementarios (es decir, se % pueden enfrentar la A con la T o bien la C con la G). Un ejemplo de doble % cadena de ADN es % A C C G A T T A C A A T ... % | | | | | | | | | | | | % T G G C T A A T G T T A ... % Podemos representar cadenas simples de ADN como listas que contengan a,c,g o % t. % (1) Definir la relación complementaria(+L1,-L2) que se verifique si L2 es la % lista complementaria de la lista L1. Por ejemplo, % ?- complementaria([a,c,c,g,a,t,t,a,c,a,a,t],L). % L = [t, g, g, c, t, a, a, t, g, t, t, a] % (1) Definir la relación cuenta(+L1,-NA,-NC,-NG,-NT) que se verifique si NA, % NC, NG y NT son el número de veces que aprecen los nucleótidos A, C, G y % T en la lista L. Por ejemplo, % ?- cuenta([a,c,c,g,a,t,t,a,c,a,a,t],NA,NC,NG,NT). % NA = 5 % NC = 3 % NG = 1 % NT = 3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% complementaria([],[]). complementaria([X|L1],[Y|L2]) :- complementario(X,Y), complementaria(L1,L2). complementario(a,t). complementario(t,a). complementario(c,g). complementario(g,c). cuenta([],0,0,0,0). cuenta([a|L],NA,NC,NG,NT) :- cuenta(L,N,NC,NG,NT), NA is N + 1. cuenta([c|L],NA,NC,NG,NT) :- cuenta(L,NA,N,NG,NT), NC is N + 1. cuenta([g|L],NA,NC,NG,NT) :- cuenta(L,NA,NC,N,NT), NG is N + 1. cuenta([t|L],NA,NC,NG,NT) :- cuenta(L,NA,NC,NG,N), NT is N + 1. % Examen de "Programación Declarativa" (14 de Noviembre de 2005) % Apellidos: % Nombre: %============================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Examen 1b: Los vectores pueden representarse mediante las listas de sus % componentes. Por ejemplo, el vector (2,5,3) se representa por la lista % [2,5,3]. % (1) Definir la relación producto_escalar(+V1,+V2,-N) que se verifique si N es % el producto escalar de los vectores V1 y V2 (que se suponen con el mismo % número de componentes). Por ejemplo, % ?- producto_escalar([2,3],[1,5],N). % N = 17 % ?- producto_escalar([2,3,1],[1,5,1],N). % N = 18 % [Se recuerda que el producto escalar de (X1,X2,...,Xn) con (Y1,Y2,...,Yn) % es X1*Y1+X2*Y2+...+Xn*Yn]. % (2) Definir la relación coincidencias(+V1,+V2,-N) que se verifique si N es % el número de posiciones en las que coinciden los vectores V1 y V2. Por % ejemplo, % ?- coincidencias([2,7,3,1],[3,7,5,1],N). % N = 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% producto_escalar([],[],0). producto_escalar([X1|L1],[X2|L2],N) :- producto_escalar(L1,L2,M), N is X1*X2+M. coincidencias([],[],0). coincidencias([X|L1],[X|L2],N) :- coincidencias(L1,L2,M), N is M+1. coincidencias([X|L1],[Y|L2],N) :- X =\= Y, coincidencias(L1,L2,N). % Examen de "Programación Declarativa" (16 de Noviembre de 2005) % Apellidos: % Nombre: %============================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Examen 1c: Los puntos del plano pueden representarse mediante listas de dos % elementos que se corresponden con sus coordenadas. Por ejemplo, el punto de % coordenadas (3,5) se representa por la lista [3,5]. % % La relación distancia_entre_puntos(P1,P2,D) se verifica si D es la distancia % entre los puntos P1 y P2 según la siguiente definición distancia_entre_puntos([X1,X2],[Y1,Y2],D) :- D is abs(X1-Y1)+abs(X2-Y2). % (1) Definir la relación distancias(+L1,+L2,-L3) que se verifique si L3 es la % lista de las distancias entre los puntos de las listas de puntos L1 y L2 % (que se suponen de igual longitud). Por ejemplo, % ?- distancias([[3,5],[4,1],[-2,0]],[[3,4],[3,2],[-5,0]],D). % D = [1, 2, 3] % (2) Definir la relación distancia_maxima(+P,+L,-D) que se verifique si D es % la mayor distancia entre el punto P y la lista de puntos L. Por ejemplo, % ?- distancia_maxima([3,5],[[3,4],[11,-1],[-5,0]],D). % D = 14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% distancias([],[],[]). distancias([P1|L1],[P2|L2],[D|L3]) :- distancia_entre_puntos(P1,P2,D), distancias(L1,L2,L3). distancia_maxima(_,[],0). distancia_maxima(P,[P1|L],D) :- distancia_entre_puntos(P,P1,D1), distancia_maxima(P,L,D2), D is max(D1,D2). % Examen de "Programación Declarativa" (16 de Noviembre de 2005) % Apellidos: % Nombre: %============================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Examen 1d: Los polinomios en una variable pueden representarse mediante % listas. Por ejemplo, el polinomio % 2x^3 - 5x + 3 % se representa por % [[2,3],[-5,1],[3,0]] % o cualquiera de sus permutaciones. % (1) Definir la relación suma_de_los_grados(+P,-N) que se verifique si N % es la suma de los grados de los términos del polinomio P. Por ejemplo, % ?- suma_de_los_grados([[-5,1],[3,0],[2,3]],N). % N = 4 % (2) Definir la relación termino_de_mayor_grado(+P,-T) que se verifique si T % representa el término de mayor grado del polinomio P. Por ejemplo, % ?- termino_de_mayor_grado([[-5,1],[2,3],[3,0]],T). % T = [2, 3] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% suma_de_los_grados([],0). suma_de_los_grados([[_X1,N1]|R],N) :- suma_de_los_grados(R,A), N is A+N1. termino_de_mayor_grado([[X,N]],[X,N]). termino_de_mayor_grado([[_X1,N1],[X2,N2]|R],[X,N]) :- N1 =< N2, termino_de_mayor_grado([[X2,N2]|R],[X,N]). termino_de_mayor_grado([[X1,N1],[_X2,N2]|R],[X,N]) :- N1 > N2, termino_de_mayor_grado([[X1,N1]|R],[X,N]).