Herramientas de usuario

Herramientas del sitio


introalg:taller09_9

¡Esta es una revisión vieja del documento!


Resolviendo problemas complejos

Empecemos con nuestro ejercicio estrella: recomendar amigos en una red social. En el día anterior especificamos el problema a alto nivel, es decir, distinguimos sus diferentes partes pero no entramos en detalle sobre cómo se podrían implementar cada una de estas partes. Repasemos qué era lo que tenía que hacer el programa:

  1. 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].
  2. 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].
  3. descartar de esa lista a p.
  4. 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:

recomendarNuevosAmigos (id,n,misamigos) directorio = filter existe2 ( filter (noEs id) ( filtrarNoEstanEnLista misamigos ( losAmigosDeMisAmigos misamigos directorio ) ) )

Ahora lo que tenemos que hacer es desarrollar cada una de las partes que hemos especificado, por separado.

Y cómo sería este mismo problema en prolog? Vamos a tratar de aplicar la misma aproximación: primero vemos el problema a alto nivel, nos damos cuenta de cuáles son las diferentes partes del problema y cómo están relacionadas entre ellas, y después pasamos a desarrollar cada una de estas partes independientemente.

Central de turnos

introalg/taller09_9.1243793037.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)