Programación Avanzada (PAV) Examen Final —4 de Junio del 2002— Ejercicio 1 (Tema 2) Obtener la forma plana (y, en su caso, reordenada) del hecho : p(X,f(a),Y,g(X)). Respuesta: y de la query : ?- p(X,X,f(Y),a). Respuesta: Nota: se deben usar los registros de argumento A1,...,An. Recordad que las ecuaciones “eliminables” no deben aparecer. Ejercicio 2 (Tema 2) Obtener la secuencia de instrucciones asociada a la siguiente forma plana de la query ?- p(X,a,f(g(Y)),X).: A1 = X5, A2 = a, X6 = g(X7), A3 = f(X6), A4 = X5 Respuesta: 100: 101: 102: put_structure g/1, X6 103: 104: 105: 106: 107: call p/2 Ejercicio 3 (Tema 3) Completar la siguiente secuencia de instrucciones resultante de compilar el programa Prolog: eq(X,X). add(s(X),Y,Z) :- add(X,Y,W), eq(s(W),Z). ?- add(s(0),0,X). Respuesta: 100: eq/2:get_variable X3,A1 101: 102: 103: add/3: allocate 2 104: 105: 106: 107: 108: put_value Y1,A1 109: 110: 111: call add/3 112: 113: 114: 115: 116: deallocate 117: query: allocate 0 118: 119: put_structure s/1,A1 120: 121: 122: 123: 124: deallocate 1 Ejercicio 4 (Tema 3) Dado el programa Prolog: inc(0,1). dec(1,0). double(X,Y,A,B) :- inc(X,A), dec(Y,B). ?- double(0,1,W,Z). cuya secuencia de instrucciones asociada es: 100: inc/2: get_structure 0/0,A1 101: get_structure 1/0,A2 102: proceed 103: dec/2: get_structure 1/0,A1 104: get_structure 0/0,A2 105: proceed 106: double/2: allocate 2 107: get_variable X5,A1 108: get_variable Y1,A2 109: get_variable X6,A3 110: get_variable Y2,A4 111: put_value X5 112: put_value X6 113: call inc/2 114: put_value Y1,A1 115: put_value Y2,A2 116: call dec/2 117: deallocate 118: query: allocate 0 119: put_structure 0/0,A1 120: put_structure 1/0,A2 121: put_variable X5,A3 122: put_variable X6,A4 123: call double/4 <--------- P 124: deallocate 125: halt <------------------------ CP realizad la ejecución de las instrucciones, comenzando en la instrucción apuntada por P y partiendo del siguiente estado para HEAP, STACK y los registros (si los valores que hay escritos cambian, tachad el valor actual y escribid el nuevo a la derecha): 1000 1001 1002 1003 1004 1005 H → 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 HEAP STR 1001 0/0 STR 1003 1/0 REF 1004 REF 1005 E → 2000 2001 2002 2003 2004 2005 2006 2007 STACK 1997 125 0 Registros Xi (Ai) 1 2 3 4 5 6 STR STR REF REF REF REF 1001 1003 1004 1005 1004 1005 Señalad también la posición en memoria de las variables W y Z y dad sus valores al finalizar la ejecución: Nota: usad la versión “refinada” de bind 2 Ejercicio 5 (Tema 4) Obtener la secuencia de instrucciones resultante de compilar el programa Prolog: par(0). par(s(s(X))) :- par(X). impar(s(0)). impar(s(s(X))) :- impar(X). paridad(X,par) :- par(X). paridad(X,impar) :- impar(X). Respuesta: 100: par/1: 101: 102: proceed 103: L1: trust_me 104: allocate 0 105: 106: 107: 108: unify_variable X3 109: 110: call par/1 111: 112: impar/1: 113: 114: 115: 116: proceed 117: L2: 118: 119: 120: 121: 122: 123: 124: 125: deallocate 126: paridad/2: 127: allocate 0 128: 129: 130: 131: 132: deallocate 133: L3: trust_me 134: 135: 136: 137: 138: 139: call impar/1 3 Ejercicio 6 (Tema 4) Las variables de un procedimiento se clasifican en temporales y permanentes. Si bien las variables temporales basta con almacenarlas en los registros, las variables permanentes deben almacenarse en el STACK. Sin embargo, existen ocasiones en las que algunas variables clasificadas como permanentes no necesitan realmente ser almacenadas en el STACK. Explicar en general cuándo se dará esta situación y escribir un programa concreto en el que ocurra. Respuesta: 4