UTNianos

Versión completa: [Aporte] Final de Paradigmas de Programación 24/02/2021
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas! Les dejo el final de paradigmas, que rendí el día 24 de febrero.
Fue una meet de 20 minutos, con Nicolas Scarcella y Mariana Matos. Prepare el final viendo sus clases en youtube:

https://www.youtube.com/channel/UCKIxojO...Dwn3BpgNIQ

https://www.youtube.com/channel/UCUgdTN1...Cp7T8bnDFQ

Para cada paradigma, me mostraron un pedazo de código y me hicieron preguntas sobre eso. Les dejo los ejercicios como los recuerdo (puede que algo no sea tal cual)

OBJETOS


object tren {
const locomotoras = []
const vagones = []

method calcularPrecio {
const precioLocomotoras = sum ( locomotoras.map(locomotora => locomotora.precio()))
const precioVagones = sum ( vagones.map(vagon => vagon.precio()))

return precioLocomotoras + precioVagones
}
}

class Vagon {
const cantidadAsientos
method precio = 800*cantidadAsientos
}

class VagonElegante inherits Vagon {
const tieneAireAcondicionado
method precio = 800*cantidadAsientos*10 (aca habia algo mas pero no recuerdo)
}



1) ¿el metodo calcularPrecio, esta usando polimorfismo? En caso de que no ¿que cambios harías para que lo use?
no usa polimorfismo porque esta usando el objeto en concreto. Habria que hacer una lista tipo "partesDeTren" que agrupe locomotoras y los tipos de vagon, y luego hacer "parteDeTren.precio()" y ahi si se usaria polimorfismo.

2) ¿que pasa si se agrega un vagon furgon? si meto todo en una misma lista, no pasa nada, siempre que el objeto VagonFurgon sepa responder al mensaje "precio()"

3) ¿Esta bien la herencia entre vagon y vagonElegante? ¿Seria lo mismo que Vagon herede de VagonElegante?
Si, porque vagon elegante es una vagon mas especifico. No, por la misma justificacion de antes. VagonElegante es mas especifico.

4) ¿Que tiene de malo el metodo precio() en VagonElegante?
Aparentemente quiere usar el comportamiento de precio() de Vagon, y para eso repite el codigo. Habria que hacer un llamado a super().

5) ¿Que beneficio trae llamar a super?
Que si cambia la implementacion en la superclase, la subclase no se ve afectada.

FUNCIONAL
Daban un tipo de dato y dos funciones:

data Persona = Persona {
edad::Int
}

f1 p = any p . map edad
f2 p = (>0) . length . filter p . map edad

1) ¿que hace cada funcion?
Hacen lo mismo las dos: dada una lista de Personas, arma una lista de edades y dice si alguna cumple con cierta condicion.

2) ¿cual es mas declarativa?
f1. Porque tiene el any (alguno cumple?). f2 tiene mas "algoritmo": filtra tal cosa, calcula la longitud, fijate si es mayor a 0...

3) Dada esta aplicacion:
f1 (>30) [1, 2, 3, ...] ¿que devuelve? ¿termina o no termina?
devuelve true. termina porque la lista se recorre hasta que encuentra el primero que cumple con >30. Evaluacion diferida.

4) ¿y este? f2 (>0) [1, 2, 3, ...] (algo asi era...)
no termina, porque el length necesita tener la lista completa para calcular el tamaño.

LOGICO
Este punto no me lo acuerdo tanto, pero era algo asi:

tiene(Persona, Producto)
esCaro(Producto)
esDeCalidad(Producto)

laEngrupieron(Persona) :- forall( tiene(Persona, Producto), (esCaro(Producto), not(esDeCalidad(Producto))))

1) decir "en español" que hace el predicado laEngrupieron
a una persona la engrupieron si todos los productos que tiene son caros y no son de calidad.

2) ¿que devuelve la consulta laEngrupieron(UnaPersona)?
devuelve true, porque al no estar ligada la variable antes del forall, este no tiene la persona sobre la cual trabajar.

3) ¿como haces para que la respuesta sea del tipo UnaPersona=josesito?
hay que generar la variable antes del forall. puede ser con el predicado tiene:
laEngrupieron(Persona) :- tiene(Persona, _), forall( tiene(Persona, Producto), (esCaro(Producto), not(esDeCalidad(Producto))))

4) ¿que pasa si pongo el generador despues del forall?
va a funcionar igual que antes, porque prolog lee en el orden que le pones los predicados.

y eso fue todo.

Saludos!
Hola como estas!? Primero gracias por el aporte.
Te hago una consulta sobre el punto 4 de Logico.

4) ¿que pasa si pongo el generador despues del forall?
va a funcionar igual que antes, porque prolog lee en el orden que le pones los predicados.

Cuando decis que funciona igual que antes, te referis a que vuelve a dar true, como cuando la variable no llegaba ligada al forall? porque yo creía que pasaba eso, pero cuando lo probé en prolog, funciona bien. Es decir, generando la veriable despues del forall, sigue siendo inversible. Puede ser?

Desde ya muchas gracias!
Hola!
Claro. Por el orden en que se leen los predicados, si se pone después el generador, la variable sigue sin ligar en el forall (supuestamente).
Por lo menos respondí eso y me dijeron que estaba bien Confused
La verdad que no lo probé en prolog. Ahora me fijo que onda.

Edit: ahí lo probé. Me devuelve false no poniendo el generador, o poniéndolo después del forall. Solo me anduvo con el generador antes del forall.
Será la versión del motor de inferencia? lo probé en ubuntu 18, con esta version SWI-Prolog version 7.6.4 for amd64, y en windows 10 con esta otra: SWI-Prolog version 8.2.4 for x64-win64. Tambien en mumuki, y en todos los casos funcionó igual.
Recargaste el archivo .pl después de cambiar el predicado?

Saludos!
Hola! sii hoy volví a probarlo porque me parecía que si o si la variable debía ligarse antes, y me anduvo como decís vos. Capaz ayer no me había cargado bien el codigo con la modificación.

Mil gracias! Saludos
URLs de referencia