UTNianos

Versión completa: [APORTE] final resuelto 01-10-2015 pdep
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas, dejo el final de hoy con toda la resolución! Obviamente algunas cosas en este momento no las voy a explicar tanto como en el final pero bueno (?) ah, dieron 10 min para verlo y si querías te podías ir

Spoiler: Mostrar
PUNTO 1

1) La función recibe algo que le llama pivote que debe ser ordenable o comparable, con el que quiere comparar a los elementos de la lista luego de aplicarles los operadores (que son 3 y tiene ahí en la otra lista), me devuelve una lista de listas en otras palabras con aquellos elementos que cumplían esa condición.
particion :: (Eq a, Ord a) => a -> [a] -> [[a]] obviamente acá a puede ser una lista también (las listas son ordenables y comparables)

2) No es necesario porque estamos aplicando parcialmente filtrarMultiples (la conversión eta me permite hacer esta reducción igual). Haskell entiende (porque tiene inferencia de tipos automática) que según nuestra implementación de filtrarMultiples le está faltando un parámetro. También entra en juego la currificación porque estamos armando una nueva función que recibe sólo un parámetro.

3) a) rompe porque [4] no es un elemento de la lista que le paso
b) funciona
c) rompe porque cuando quiere filtrar los mayores que 3 no deja de hacerlo nunca
d) estamos armando una nueva función que recibe un sólo parámetro. es currificar.
nota: si bien cuando lo prueben en el winghci les va a tirar un error, creo que se puede configurar para que no lo tire no me acuerdo bien igual si hacen :t particion 10 ahí les va a decir que es un funcion que espera 1 parámetro (una lista) y devuelve una lista de listas. obviamente no puse eso en el final porque son boludeces de la consola de haskell (?)
4) tenes composición del lambda con la aplicación del pivote a los operadores, hay menos repetición de código, hay expresiones lambda

PUNTO 2

1) el problema que tenemos acá es que contrajo no nos permite hacer una sola consulta, porque depende de la enfermedad tiene un parámetro de más o de menos entonces ¿? (cero polimorfismo). si hago dos consultas sí me va a devolver lo que quiera pero obvio tengo que saber que una tiene menos parámetros que la otra, en fin es horrible
2) tieneMalaSuerte(Persona):- esPersona(Persona), forall(contrajo(Persona,_,Enfermedad), esPeligrosa(Enfermedad)).

Lo que hice entonces fue hacer nuevos predicados para que haya polimorfismo y todos contentos. Primero que cambié como se modela contrajo

contrajo(Persona,Anio,Enfermedad).

tengo nuevos functores:

bacteriana(Nombre,Resistencia).
viral(Nombre,TardaEnDesaparecer,CelulasQueAfecta).
parasitaria(Nombre,SectorQueAfecta).

esPeligrosa(bacteriana(_,Resistencia)):- Resistencia > 5.
esPeligrosa(viral(_,TardaEnDesaparecer,_)):- TardaEnDesaparecer > 10.
esPeligrosa(viral(_,_,CelulasQueAfecta)):- CelulasQueAfecta > 1000000.

b) aprovechamos el orden superior del forall para poder ser más declarativos al resolver lo que nos pide el requerimiento. también tenemos polimorfismo que lo aprovecha tieneMalaSuerte al no tener que preguntar por cada tipo de enfermedad.

c) es inversible tieneMalaSuerte(Persona) porque llega ligada persona antes del forall, y se fija para CADA UNA si se cumple que todas las que ocntrajo fueron peligrosas.
si no estaba esa persona ligada el motor entiende que para todas las personas todas las enfermedades que contrajeron eran peligrosas y no es lo que queremos.

esPeligrosa(Enfermedad) no es inversible porque hay variables anónimas y no sabe que hacer prolog

3) #Persona vi: nombre, edad, enfermedades
>> tieneMalaSuerte
^ enfermedades allSatisfy: [:enfermedad | enfermedad esPeligrosa].

# Enfermedad -> clase abstracta vi: anio
# Bacteriana hereda de Enfermedad vi: resistencia
>> esPeligrosa
^ resisencia > 5.

# Viral hereda de Enfermedad
>> esPeligrosa
^ tardaEnDesaparecer > 10 or: [celulasQueAfecta > 1000000].

# Parasitaria hereda de Enfermedad
>> esPeligrosa
^ sector = 'interna'

4) tenemos polimorfismo, abstraccion, delegacion, en vez de pattern matching tenemos herencia en objetos, las relaciones de logico en objetos se implementan con una coleccion de enfemredades, en objetos poemos borrar o agregar enfermedades (asignacion destructiva) mientras que en lógico tengo que borrar o agregar un hecho, etc

5) cambie bastante a como estaba antes

#Enfermedad vi: anio, tipo -> es abstracta

# Infecciosa hereda de Enfermedad
>> esPeligrosa: persona // lo redefino a este metodo
^ persona edad between: 3 and: 80
(tambien podia hacer metodos en persona que me digan esBebe y esAnciano, era mas declarativo y expresivo, yo aclaré eso)

# NoInfecciosa hereda de Enfermedad
>> esPeligrosa: persona
^ tipo esPeligrosa: persona


#Tipo es una interface donde todos deben entender esPeligrosa: persona, dejo el codigo como estaba antes. Las que implementan esta interface son Bacteriana Viral y Parasitaria.

b) agregar un nuevo tipo de enfermedad es agregar una nueva clase que implemente el metodo esPeligrosa: persona =)
una nueva categoria es agregarle una subclase a Enfermedad y redefinir su comportamiento

c) se aplicó polimorfismo entre las enfermedades, Persona aprovecha eso en tieneMalaSuerte. También se aplicaron las interfaces y la herencia para reutilizar comportamiento.

Seguramente me haya quedado algo sin poner porque ya me cansé de escribir pero en fin ahí está, den agradecimientos que es gratis (?)
Gracias por subirlo, en el 1) pusiste que el pivote debe ser un número, pero puede ser cualquier tipo siempre y cuando se pueda comparar con los elementos de la lista, de hecho en el 3) b) el pivote es un char...
Saludos.
Kaiko sí, me confundí al escribir eso cuando llegué, estaba re quemada. de hecho cuando inferí el tipo:
particion :: (Eq a, Ord a) => a -> [a] -> [[a]] obviamente acá a puede ser una lista también (las listas son ordenables y comparables)
puse que a tenía que ser cualquier cosa ordenable y comparable y en ningún momento que tenía que ser de tipo Num ;)

(gracias por avisar, ahí lo cambie)
A la hora de escribir la consulta en logico (ejercicio 1 punto 2) la consulta se puede hacer, el tema es que queda feo porque tenes que hacer xxx cantidad de consultas por enfermedades... a vos te dijeron en el final que habia que hacer una unica consulta?
Hola, como se utiliza el signo $ en Haskell? no recuerdo su uso, muchas gracias
La función $, es la función sirve para aplicar una función a un parametro, por lo tanto recibe una función y el parametro que debería aplicarle.

Algunos usos son:


-- notacion infija
even $ 2




-- notacion prefija
($) even 2


buenas a todos

en
particion [4] [4,5,7,2] porque no rompe??

no devolveria [[5,7][4],[2]] ?

Gracias saludos
Si que rompe, el tipo de [4] no es el mismo tipo que el tipo de los elementos de la lista [4,5,7,2].


[4] :: Num a => [a]
[4,5,7,2] :: Num b => [b], por lo tanto el tipo de uno de los elementos es Num b => b

Por lo tanto [a] \= b
URLs de referencia