% Examen de "Programación Declarativa" (Septiembre de 2000) % Apellidos: % Nombre: %============================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 1: [2.5 puntos] Definir a relación separa(Cons,Letras,Numeros) que % reciba como entrada una Constante en la cual aparecen letras y números (p.e.: % ab1c2) y devuelva los átomos Letras y Numeros, formados, respectivamente por % las letras y los números que aparecen en Constante. Por ejemplo, % ?- separa(ab1c23d,Letras,Numeros). % Letras = abcd % Numeros = 123 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% separa(Cons,Letras,Numeros):- name(Cons,Cons_cod), name(0123456789,Digitos), separa_aux(Digitos,Cons_cod,Letras_cod,Numeros_cod), name(Letras,Letras_cod), name(Numeros,Numeros_cod). separa_aux(_,[],[],[]). separa_aux(Digitos,[X|L],L1,[X|L2]):- member(X,Digitos), !, separa_aux(Digitos,L,L1,L2). separa_aux(Digitos,[X|L],[X|L1],L2):- separa_aux(Digitos,L,L1,L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 2: [2.5 puntos] Se dice que [X,Y,Z] es una terna pitagórica si % X,Y,Z verifican: % (1) 0 N). combina_aux(L,P,N):- select(L,Palabra,L1), combina(Palabra,L1,P,1,N). combina(Palabra,_,Palabra,N,N). combina(Palabra,L,P,Acum,N):- select(L,X1,L1), combina_dos(Palabra,X1,Combinacion), Acum_1 is Acum + 1, combina(Combinacion,L1,P,Acum_1,N). combina_dos(X1,X2,C):- name(X1,N1), name(X2,N2), append([_|_],[Y2|Z2],N1), append([Y2|Z2],[Y3|Z3],N2), append(N1,[Y3|Z3],NC), name(C,NC).