Examen Final Paradigmas de Programación - 21/05/2013 - Página  de


Punto 1 

Se quiere obtener el primer número primo a partir de un número dado.

Las soluciones propuestas son:  

int primerPrimo(int n) {

boolean sigo = true;

while (sigo) {

if (primo(n)) {

sigo = false;

} else {

n++;

}

}

return n;

}

primer h n = ( head . filter h ) (g n)  

g n = n:g (n + 1)

  1. Determinar el tipo más genérico de la función primer  propuesta en Haskell.
  2. De un ejemplo de invocación de la función  primer para conocer el primer número primo.
  3. Realizar un análisis comparativo relacionándolo con los siguientes conceptos:
  1. declaratividad
  2. expresividad
  3. efecto colateral o efecto de lado
  4. qué evita en cada solución que se hagan más cálculos de los necesarios.
  5. qué permite que la función primer pueda ser reutilizada en otro contexto.

Punto 2

Se tiene un sistema para el cálculo de sueldos de un coro, el cual está a medio codificar. Está hecho en dos lenguajes diferentes.

 

% cantante(Nombre,Registro,Ubicación)

% La ubicación tiene generalmente un número de Fila del cantante en el coro. (los principales siempre van adelante)

cantante(teodoro, tenor, principal).

cantante(sara, contraalto, soporte(3)).

cantante(bruno, baritono, soporte(2)).

cantante(bartolo, bajo, pintado(3)).

cantante(carla, contraalto, soporte(1)).

cantante(maria, mezzosoprano, principal).

Nota: los atributos “nombre”, “registro” y “ubicación” apuntan a Strings, “fila” apunta a un Integer.

  1.  Se pide escribir las consultas y envíos de mensaje (workspace) para lograr lo siguiente, en ambos paradigmas.
  1. Saber si existe una soprano.
  1. Saber si carla está en el coro.
  2. Saber si hay algún cantante.
  3. Saber el nombre de alguna contraalto.
  4. Saber el registro de bartolo.
  5. Saber si bruno es barítono.

Nota: Si es necesaria codificación adicional para poder realizar las consultas, realizar dicha codificación. Para éste punto no vale modificar nada, sólo agregar. No hace falta instanciar los objetos.

  1. Si en alguno de los dos paradigmas resulta más fácil la codificación anterior, explicar qué concepto ayuda a resolver el problema y por qué.
  2. Se desea saber cuánto hay que pagarle al coro para una presentación. Se sabe que los cantantes principales cobran $1000, los de soporte $600 dividido el número de fila en la que están, y los pintados cobran un tercio de lo que cobran los de soporte.
    El equipo de programadores realizó modificaciones para cubrir este requerimiento, y esto fue lo que obtuvo:

        costoCoro(Costo):-

                findall(Cuanto, sueldo(Ubicacion,Cuanto),Guitas),

                sumlist(Guitas,Costo).

        sueldo(principal,1000).

        sueldo(soporte(Fila),Sueldo):- Sueldo is 600 / Fila.

        sueldo(pintado(Fila),Sueldo):-

sueldo(soporte(Fila),Sueldo),

Sueldo is Sueldo/2

        --------------------------------------------------

#Coro>>costo

        ^ cantantes sum: [:cantante | cantante sueldo].

#Cantante>>sueldo

        ubicacion = ‘principal’ ifTrue: [^1000].

        ubicacion = ‘soporte’ ifTrue: [^600 / fila].

#CantantePintado>>sueldo

^600 / fila / 2.

        Comentar las siguientes justificaciones del equipo de programación. ¿Son ciertas? ¿Son falsas? ¿Por qué sí y por qué no? Justificar ó corregir cada afirmación, mencionando el concepto asociado.

  1. Ambas soluciones funcionan a la perfección.
  2. La solución en Prolog no usa ningún concepto importante más que inversibilidad y pattern matching.
  3. La solución en Smalltalk hace un buen uso de la herencia.
  4. A mí me enseñaron en la facultad que en objetos hay que usar polimorfismo, y en éste caso los que se benefician del polimorfismo son los cantantes. (Seguro cantan mejor ahora que son polimórficos).
  5. Es sencillo que un cantante de soporte pase a ser principal, y que un cantante pintado pase a ser principal.
  1. Realizar las modificaciones a ambas soluciones teniendo en cuenta las críticas realizadas.