Programación Avanzada (PAV)

Anuncio
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
Descargar