Programación Avanzada (PAV) Examen Parcial —1 de Diciembre de 1998— Ejercicio 1 (Tema 2) Obtener la forma plana (y, en su caso, reordenada) del hecho : p(X,s(s(zero)),s(s(X))). Respuesta: y de la query : ?- p(zero,A,B). 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(f(X,a),X,g(b)).: X5 = a, A1 = f(X4,X5), A2 = X4, X6 = b, A3 = g(X6) Respuesta: 100: 101: 102: 103: 104: 105: 106: 107: 108: call p/3 Ejercicio 3 (Tema 3) Completar la siguiente secuencia de instrucciones resultante de compilar el programa Prolog: q(a). q(X,X). p(X,Y) :- q(X), q(X,Y). ?- p(A,B). Respuesta: 100: q/1: get_structure a/0,A1 101: 102: 103: 104: proceed 105: p/2: allocate 2 106: 107: 108: 109: 110: 111: 112: call q/2 113: 114: query: allocate 0 115: 116: 117: 118: 1 Ejercicio 4 (Tema 3) Dado el programa Prolog: igual(X,X). resultado(s(a)). inc(X,Y) :- igual(X,a), resultado(Y). ?- inc(a,A). cuya secuencia de instrucciones asociada es: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: igual/2: get_variable X3,A1 get_value X3,A2 proceed resultado/1: get_structure s/1,A1 unify_variable X2 get_structure a/0,X2 proceed inc/2: allocate 1 get_variable X3,A1 get_variable Y1,A2 put_value X3,A1 put_structure a/0,A2 call igual/2 put_value Y1,A1 call resultado/1 deallocate query: allocate 0 put_structure a/0,A1 put_variable X3,A2 call inc/2 <------------- P deallocate 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 H → 1003 1004 1005 1006 1007 1008 1009 HEAP STR 1001 a/0 REF 1002 E → 2000 2001 2002 2003 2004 2005 2006 STACK 1997 121 0 Registros Xi (Ai) 1 2 3 STR REF REF 1001 1002 1002 Señalad también la posición en memoria de la variable A y dar su valor al finalizar la ejecución: 2 Ejercicio 5 (Tema 4) Obtener la secuencia de instrucciones resultante de compilar el programa Prolog: igual(mo,mo). igual(mu,mu). lee(ma). lee(me). lee(mi). lee(X) :- igual(X,mo). lee(X) :- igual(X,mu). Respuesta: 100: igual/2: try_me_else L1 101: 102: 103: proceed 104: L1: 105: get_structure mu/0,A1 106: 107: 108: lee/1: try_me_else L2 109: 110: 111: L2: 112: 113: 114: L3: 115: 116: 117: L4: retry_me_else L5 118: 119: get_variable X3,A1 120: 121: 122: 123: deallocate 124: L5: 125: 126: 127: 128: 129: 130: Ejercicio 6 (Tema 4) Escribir un programa Prolog que contenga una definición de procedimiento indeterminista (al menos 2 cláusulas) en cuya ejecución se cree un punto de elección y éste no sea realmente necesario Nota: escribid el programa y la query. Resultado: 3 Alternativos: realizar sólo uno Ejercicio 7 (Tema 5) Obtener la secuencia de instrucciones resultante de compilar la query Prolog: ?- q(f(a),f(g(X)),X). Respuesta: 100: allocate 0 101: 102: 103: 104: 105: 106: 107: 108: call q/3 109: deallocate empleando las instrucciones especializadas para el tratamiento de las constantes. Ejercicio 8 (Tema 5) Obtener la secuencia de instrucciones resultante de compilar el hecho Prolog: q([X,Y],[X|Y]). Respuesta: 100: q/2: get_list A1 101: 102: 103: 104: 105: unify_variable X6 106: 107: 108: 109: 110: get_list A2 proceed empleando las instrucciones especializadas para el tratamiento de las listas (pero no para las constantes). Ejercicio 9 (Tema 5) Obtener la secuencia de instrucciones resultante de compilar el programa Prolog: q(a,b). p(A,B,_,A) :- q(A,C). Respuesta: 100: q/2: get_structure a/0,A1 101: 102: proceed 103: p/4: allocate 0 104: 105: 106: 107: 108: 109: call q/2 deallocate empleando las instrucciones especializadas para el tratamiento de las variables anónimas (pero no para las constantes). 4