% Examen de "Programación Declarativa" (9 de Febrero de 2005) % Apellidos: % Nombre: %============================================================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Consideremos que tenemos una serie de diccionarios que traducen palabras del % castellano a otros idiomas, por ejemplo % diccionario_1([azul-blue, % coche-car, % el-the, % es-is, % libro-book, % rojo-red, % y-and]). % % ... % % diccionario_342([azul-blau, % coche-auto, % el-das, % es-ist, % libro-buch, % rojo-rot, % y-und]). % usaremos estos diccionarios en los siguientes ejercicios: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diccionario_1([azul-blue, coche-car, el-the, es-is, libro-book, rojo-red, y-and]). diccionario_342([azul-blau, coche-auto, el-das, es-ist, libro-buch, rojo-rot, y-und]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 1: Definir la relación busca(+D,?N,?P1,?P2) que se verifique si % P1-P2 es el par que ocupa la posición N-ésima en el diccionario D. Por % ejemplo, % ?- busca(1,N,libro,P2). % N = 5 % P2 = book % % ?- busca(342,N,P1,P2). % N = 1 P1 = azul P2 = blau ; % N = 2 P1 = coche P2 = auto ; % N = 3 P1 = el P2 = das ; % N = 4 P1 = es P2 = ist ; % N = 5 P1 = libro P2 = buch ; % N = 6 P1 = rojo P2 = rot ; % N = 7 P1 = y P2 = und ; % No %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% busca(D,N,P1,P2) :- atom_concat(diccionario_,D,D1), apply(D1,[L]), nth1(N,L,P1-P2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 2: Definir la relación traduce(+N,+F) donde F es el nombre de un % fichero con extensión .txt (por ejemplo, texto.txt) en el que hay un % texto en castellano. N es un entero no negativo que identifica un % diccionario. El predicado debe crear un fichero nuevo en el que % aparezca el texto traducido según el diccionario N. El nombre de este % nuevo fichero es el mismo que el fichero de entrada al que se le ha % añadido el número N antes de la extensión. Por ejemplo, si el nombre % del fichero de entrada es texto.txt y traducimos según el diccionario % 17, entonces el nombre del fichero de salida debe ser texto17.txt %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% traduce(N,F1) :- atom_concat(A,'.txt',F1), atom_concat(A,N,AN), atom_concat(AN,'.txt',F2), see(F1), tell(F2), traduce_aux(N,[]), seen, told. traduce_aux(N,L) :- get0(X), palabra(N,L,X). palabra(N,L,-1) :- !, escribe(N,L). palabra(N,L,32) :- !, escribe(N,L), put(32), traduce_aux(N,[]). palabra(N,L,X) :- traduce_aux(N,[X|L]). escribe(N,L) :- reverse(L,L1), name(P1,L1), busca(N,_,P1,P2), write(P2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ejercicio 3: En este ejecicio representaremos una frase como un único % término. De este modo la frase "el libro es rojo" la representaremos como % el(libro(es(rojo))). Se pide definir la relación traduce_term(+N,+T1,?T2) % que traduzca la frase T1 en T2 según el diccionario identificado por N. T1 y % T2 se representarán mediante un único término. Por ejemplo, % ?- traduce_term(1,el(libro(es(rojo))),T). % T = the(book(is(red))) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% traduce_term(N,T1,T2) :- T1 =.. [P1], busca(N,_,P1,P2), T2 =.. [P2]. traduce_term(N,T1,T2) :- T1 =.. [P1,R1], busca(N,_,P1,P2), traduce_term(N,R1,R2), T2 =.. [P2,R2].