Herramientas de usuario

Herramientas del sitio


introalg:taller09_8

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
introalg:taller09_8 [2009/05/18 11:18] lauraintroalg:taller09_8 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1
Línea 59: Línea 59:
 Ahora podemos reescribir todas las aplicaciones usando ''aplica'', y definiendo como argumento la función que queremos aplicar a todos los elementos de la lista. Por ejemplo: Ahora podemos reescribir todas las aplicaciones usando ''aplica'', y definiendo como argumento la función que queremos aplicar a todos los elementos de la lista. Por ejemplo:
 <code> <code>
-duplicar:: [Int] -> [Int]+duplicar :: [Int] -> [Int]
 duplicar xs = aplica (*2) xs duplicar xs = aplica (*2) xs
-veintePorCiento:: [Float] -> [Float] +veintePorCiento :: [Float] -> [Float] 
-veintePorCiento xs = veintePorCiento (porCiento 20) xs+veintePorCiento xs = aplica (porCiento 20) xs
 </code> </code>
  
Línea 142: Línea 142:
 Entonces, la estructura común de todas estas funciones es: Entonces, la estructura común de todas estas funciones es:
 <code> <code>
-fRecursiva :: [a] -> [b]+fRecursiva :: [a] -> b
 fRecursiva [] = neutro fRecursiva [] = neutro
 fRecursiva (x:xs) = fNoRecursiva x (fRecursiva xs) fRecursiva (x:xs) = fNoRecursiva x (fRecursiva xs)
Línea 222: Línea 222:
 ===== Ejercicios para pensar ===== ===== Ejercicios para pensar =====
  
-Dos ciudades conectadas:+==== Conexión entre dos ciudades ==== 
 + 
 +Dada la siguiente base de conocimiento
 <code> <code>
 conectadas(rosario,buenosAires). conectadas(rosario,buenosAires).
Línea 230: Línea 232:
 conectadas(santaCruz,ushuaia). conectadas(santaCruz,ushuaia).
 </code> </code>
 +
 +Tratemos de averiguar si se puede ir de una ciudad a otra, es decir, si hay alguna conexión entre dos ciudades. Definimos el predicado ''hay_conexion/2'', que es recursivo:
  
 <code> <code>
Línea 236: Línea 240:
 </code> </code>
  
 +Ahora traten de ampliar esta función para que el intérprete nos diga el itinerario por el que hay que ir de una ciudad a otra. Otra posible ampliación es que el intérprete nos diga con qué medios de transporte podemos desplazarnos de una ciudad a otra; para que se pueda contestar a eso habrá que modificar los hechos.
  
-Recomendar amigos en //facebook//.+==== Recomendar amigos en una red social ====
  
-La signatura de tipos tendría que representar lo siguiente:+Este problema es complejo y por lo tanto se puede abordar de muy distintas formas. Acá les proponemos el principio de una, para que ustedes vayan trabajando en el problema. El próximo día vamos a ver algunas soluciones posibles para este problema. 
 + 
 +En primer lugar, pensemos qué información necesita nuestra función para trabajar. Primero de todo, necesita saber quién es la persona a quien vamos a recomendar nuevos amigos, y cuáles son los amigos que ya tiene. Luego necesita tener acceso a la base de datos en la que se guarda la información sobre todas las personas que están en la red social en cuestión. Por lo tanto, necesita dos argumentos: la persona y el listado de todas las personas. 
 + 
 +Cómo se representa la información sobre una persona en este problema? Hay muchas posibilidades. Yo les propongo la siguiente: una persona se representa como una tresupla donde el primer elemento es un entero que representa el número único de identificación de esa persona en la red social, el segundo elemento es un String que representa el nombre de la persona, y el tercer elemento es una lista de enteros que representa los identificadores de los amigos de esta persona en la red social. El resultado de la función podría ser un listado de nuevos amigos, representados por tuplas ''(String,Int)'' que representen al nombre y el identificador de los nuevos amigos. Así, la signatura de tipos de la función quedaría como sigue
 <code> <code>
--- recomendarNuevosAmigos :: persona -> listadoPersonas -> listadoRecomendaciones+recomendarNuevosAmigos :: (Int,String,[Int]) -> [(Int,String,[Int])] -> [(String,Int)]
 </code> </code>
  
-Lo podemos definir así:+Ahora que sabemos con qué estructuras de datos vamos a trabajar, pensemos en lo que tenemos que hacer con ellas: 
 +  - obtener la lista de todos los amigos de los amigos de la persona a quien queremos recomendar nuevos amigos (llamémosle ''p''). Para eso necesitaremos la función ''losAmigosDeMisAmigos :: [Int] -> [(Int,String,[Int])] -> [Int]'', que se puede armar usando la función auxiliar ''listaDeAmigos :: Int -> [(Int,String,[Int])] -> [Int]''
 +  - descartar de esa lista todos los que ya son amigos de ''p'', es decir, que ya están en la lista de amigos de ''p''. Para eso necesitaremos la función ''filtrarNoEstanEnLista :: [Int] -> [Int] -> [Int]''
 +  - descartar de esa lista a ''p''
 +  - quedarnos solamente con los amigos que son amigos por lo menos de dos amigos de ''p'', es decir, descartar los que son amigos solamente de uno de los amigos de ''p''. Para eso necesitaremos el predicado ''existe2'', que se aplicará mediante un filtro. 
 + 
 +La función principal ''recomendarNuevosAmigos'' se puede definir ahora como una combinación de todas estas funciones auxiliares, por ejemplo, de la siguiente manera:
 <code> <code>
-recomendarNuevosAmigos :: (Int,String,[Int]) -> [(Int,String,[Int])] -> [(String,Int)] +recomendarNuevosAmigos (id,n,misamigos) directorio = filter existe2 ( filter (noEs id) ( filtrarNoEstanEnLista misamigos ( losAmigosDeMisAmigos misamigos directorio ) ) )
-recomendarNuevosAmigos (id,n,misamigos) directorio = filter existe2 ( losAmigosDeMisAmigos misamigos directorio )+
 </code> </code>
  
-Ahora sólo queda definir la función ''losAmigosDeMisAmigos :: [Int-> [(Int,String,[Int])] -> [Int]'' el predicado ''existe2 :: Int -> [Int] -> Bool''.+===== Ejercicios ===== 
 + 
 +  * Redefinan las funciones propuestas en los ejercicios de la clase anterior, ahora usando las generalizaciones ''filter'', ''map'' y ''foldr'', y no vuelvan a escribir ningún caso base ni caso recursivo más! 
 + 
 +  * Definan una función que calcule el porcentaje de estudiantes que aprobó o promocionó la materia, definiendo una función ''porcentajeEstudiantes :: (Int -> Bool) -> [(String,Int,Int,Int,Bool,Bool)] -> Int'', donde el primer argumento es un predicado que determina si una nota aprueba o desaprueba o si una nota promociona o no promociona, el segundo argumento es la lista de estudiantes, representados como seis-uplas con su nombre, la nota de cada uno de los tres parciales y dos booleanos que representan la aprobación o desaprobación de cada uno de los parcialitos de taller. El resultado es el porcentaje de estudiantes que aprobaron o promocionaron la materia, dependiendo del predicado que pongamos como primer argumento.
  
-Incorporamos una restricción más, que no me recomiende a mí mismo!+  * Definan una función que determine si Clara es mayor que Elena, dada la siguiente base de conocimiento:
 <code> <code>
-recomendarNuevosAmigos (id,n,misamigosdirectorio = filter noEsIgual id ) ( filter existe2 ( losAmigosDeMisAmigos misamigos directorio ) )+mayor(clara,esteban)
 +mayor(esteban,paula)
 +mayor(paula,marcos)
 +mayor(marcos,elena).
 </code> </code>
introalg/taller09_8.1242645512.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)