PAUTA de CORRECCON EXAMEN PREGUNTA 1 (a) La sintaxis de PASCAL es mas amigable para programar, especialmente si hay muchos if then else anidados, *pero* ofrece ambiguedades al leer. Esto hace ligeramente mas complicado procesar el programa. La sintaxis del ifThenELse de ADA es completamente preciso (i.e. no tiene ambiguedad. Problema: es algo molesto escribir muchos constructores de estos anidados. Simplifica el procesamiento del programa. (b) i) por valor: imprime 1, 3 ii) por referncia: imprime 4, 4 iii) por valor/resultado: imprime 3, 3 PREGUNTA 2. La salida del programa es A:P A:Q B:P A:Q B:P B:Q (razon: enlace dinamico). PREGUNTA 3. min L = reduce min 7 L largo L = reduce sum 0 (map uno L) sum L = reduce sum 0 L promedio L = div (menos (sum L) (min L)) (menos (largo L) 1) PREGUNTA 4. (a) Que hace nn: nn(+N,+M,Res) devuelve una lista Res [N,N+1,...,M-1]. Arbol de derivacion: nn(5,7,[M|Ns] | nn(6,7,Ns) M=5 | nn(6,6,R) Ns=[6|R] | nn(6,6,[]) R=[] (b) map(Proc, [], []). map(Proc, [X|Xs], [R|Res]) :- call(Proc,X,R), map(Proc, Xs, Res). PREGUNTA 5. (i) El unico problema que se presenta es `busy waiting', es decir, que constantemente el aristocrata y el sirviente deben estar revisando el plato. [Si hay mas de un sirviente o un aristocrata se producen problemas: hay aristocratas que pueden morir de hambre o sirvientes que queden frustrados sin servir] (ii) (Hay varias posibles soluciones). synchronized public void aristocrata() { while (plato == vacio) wait(); comer(); plato = vacio; notifyALL(); } synchronized public void sirviente() { while (plato == lleno) wait(); servir(); plato = lleno; notifyAll(); }